安卓开发错误,发送UDP包时报错

发布于 2022-09-06 08:32:41 字数 1808 浏览 10 评论 0

问题描述

如题,使用AS做安卓开发时遇到的问题,ds.send(dp)报错空指针



问题代码

package com.example.administrator.controllerapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class Client extends BroadcastReceiver {
    int SELECT_FLAG = 0;

    @Override
    public void onReceive(Context context, Intent intent) {
        DatagramSocket ds = null;
        DatagramPacket dp = null;
        try {
            ds = new DatagramSocket(9999);
        } catch (SocketException e) {
            e.printStackTrace();
        }
        intent.getIntExtra("msg", SELECT_FLAG);
        String str = "" + SELECT_FLAG;
        try {
            dp = new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName("218.197.253.42"), 9000);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        try {
            ds.send(dp);  //此行报错。
            ds.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Toast.makeText(context, "指令已发送", Toast.LENGTH_SHORT).show();
    }
}


权限声明

权限声明

错误提示

提示空指针

尝试解决

更改端口号,仍然报错
更改ip地址,仍然报错
百度和论坛搜索了,但是没有找到很多相关的东西

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

苏辞 2022-09-13 08:32:41

自己的回答

听从@亚林的建议我重新静下心来debug了一下
首先发现了下面的错误:

错误提示

SocketException
根据错误提示可以看到第一行的err就写道:SocketException
仔细一看,原来是粗心没有添加网络访问权限

添加权限后的声明

图片描述
第二条permission就是为联网新添加的权限声明,想一想现在没有几个app是不用联网的了,这条权限声明
大家记得写,不要学我粗心大意。。

再次Debug

仍然有错误,我们看一看错误提示

NetworkOnMainThreadException
图比较小,可能看不清,上面写的是NetworkOnMainThreadException,原来问题出在这里。。
百度一下发现:
在很早以前,某个比较老版本之后,就禁止在主线程中进行网络操作了,因为网络操作很可能会阻塞线程,为了避免主线程被阻塞的情况发生,干脆就禁止开发者在主线程中进行网络操作了,只能够使用多线程在子线程中操作网络相关的任务。那么,我们简单地写一个多线程。

修改后的Client代码

package com.example.administrator.controllerapplication;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class Client extends BroadcastReceiver {
    int SELECT_FLAG = 0;

    @Override
    public void onReceive(final Context context, final Intent intent) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                DatagramSocket ds = null;
                DatagramPacket dp = null;
                try {
                    ds = new DatagramSocket(9999);
                } catch (SocketException e) {
                    e.printStackTrace();
                }
                SELECT_FLAG = intent.getIntExtra("msg", SELECT_FLAG);
                String str = "" + SELECT_FLAG;
                try {
                    dp = new DatagramPacket(str.getBytes(), str.length(), InetAddress.getByName("192.168.43.20"), 9000);
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                }
                try {
                    ds.send(dp);
                    ds.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        Toast.makeText(context, "指令已发送", Toast.LENGTH_SHORT).show();
    }
}

仅仅添加了多线程,其他的内容几乎没有改变

问题解决啦~让我们在电脑上随便写一个小程序接收一下数据来验证一下吧

图片描述
验证成功~

总结

1.遇到问题要淡定

2.遇到问题要淡定

3.遇到问题要淡定

仔细分析,查查资料,没有不可能,只有

不,可能

如果觉得回答还不错请支持一下哦~谢谢

我纯我任性 2022-09-13 08:32:41

Client.java37行,debug看看

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文