【安卓】安卓开发错误,发送UDP包时报错
问题描述
如题,使用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地址,仍然报错
百度和论坛搜索了,但是没有找到很多相关的东西
回答
自己的回答
听从@亚林的建议我重新静下心来debug了一下
首先发现了下面的错误:
错误提示
根据错误提示可以看到第一行的err就写道:SocketException
仔细一看,原来是粗心没有添加网络访问权限
添加权限后的声明
第二条permission就是为联网新添加的权限声明,想一想现在没有几个app是不用联网的了,这条权限声明
大家记得写,不要学我粗心大意。。
再次Debug
仍然有错误,我们看一看错误提示
图比较小,可能看不清,上面写的是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.遇到问题要淡定
仔细分析,查查资料,没有不可能,只有
不,可能
如果觉得回答还不错请支持一下哦~谢谢
Client.java37行,debug看看
以上是 【安卓】安卓开发错误,发送UDP包时报错 的全部内容, 来源链接: utcz.com/a/102547.html