android 多线程udp,安卓开发错误,发送UDP包时报错

自己的回答

听从@亚林的建议我重新静下心来debug了一下

首先发现了下面的错误:

错误提示

bV0BB6?w=920&h=201

根据错误提示可以看到第一行的err就写道:SocketException

仔细一看,原来是粗心没有添加网络访问权限

添加权限后的声明

bV0BCc?w=797&h=175

第二条permission就是为联网新添加的权限声明,想一想现在没有几个app是不用联网的了,这条权限声明

大家记得写,不要学我粗心大意。。

再次Debug

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

bV0BCg?w=1378&h=62

图比较小,可能看不清,上面写的是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();

}

}

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

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

bV0BCu?w=293&h=186

验证成功~

总结

1.遇到问题要淡定

2.遇到问题要淡定

3.遇到问题要淡定

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

不,可能

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值