【安卓】安卓开发错误,发送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();

}

}

权限声明

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

错误提示

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

尝试解决

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

回答

自己的回答

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

错误提示

【安卓】安卓开发错误,发送UDP包时报错
根据错误提示可以看到第一行的err就写道:SocketException
仔细一看,原来是粗心没有添加网络访问权限

添加权限后的声明

【安卓】安卓开发错误,发送UDP包时报错
第二条permission就是为联网新添加的权限声明,想一想现在没有几个app是不用联网的了,这条权限声明
大家记得写,不要学我粗心大意。。

再次Debug

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

【安卓】安卓开发错误,发送UDP包时报错
图比较小,可能看不清,上面写的是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();

}

}

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

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

【安卓】安卓开发错误,发送UDP包时报错
验证成功~

总结

1.遇到问题要淡定

2.遇到问题要淡定

3.遇到问题要淡定

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

不,可能

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

Client.java37行,debug看看

以上是 【安卓】安卓开发错误,发送UDP包时报错 的全部内容, 来源链接: utcz.com/a/102547.html

回到顶部