① android 手机上能通过DatagramSocket收到PC端的UDP广播吗
在PC端直接用tcp调试助手发送数据,我另一台电脑能收到的,但是android的却是有时可以收到有时收不到,平均几十次收到10次左右,丢包不可能这么严重吧。,android的代码如下,
ds = new DatagramSocket(1234, InetAddress.getByName(“192.168.1.3”));
dp = new DatagramPacket(content, content.length);
ds.receive(dp);
如果我在pc端发送绑定了IP的UDP数据包,android可以收到数据,但是PC端发送255的广播UDP,android就收不到了。。查了一些资料,说是要加入权限,加入以下的代码,但实测发现效果一样。
WifiManager manager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE); WifiManager.MulticastLock lock= manager.createMulticastLock("localWifi");
② 如何修正安卓虚拟机收不到udp包的问题
前言
当我们做安卓开发时,大多数人还是习惯用虚拟机,毕竟真机巴拉来巴拉去的不如鼠标方便,尤其是调试一些功能模块时,比如socket udp , 下文说明如何用as+虚拟机调试 socket udp, 实测
如何搭建udp服务器和客户端不提了,简单的搭建随便找一个吧
首先我们的前提是 我们在pc上建立了一个UDP服务器,目的是通过这服务器给虚拟机发送一个udp包
但如何发送这个包呢?
如果想当然的这样做在server上敬敬启给"127.0.0.1:9014"发送包,然后在虚拟机的9014端口接受包,你会亮如发现无论发多少次,虚拟机什么都收不到。 原因是,你稿坦这个包并不是发给虚拟机了,而是发给了本地端口,
也许你会说,给虚拟机发应该用虚拟机的ip地址,好的,通过尝试我们发现给虚拟机的ip地址+9014端口,仍然无法收到。(我用工具查看的虚拟机ip地址是10.0.2.15)
正确步骤
1.把PC端口9014映射到虚拟机,意思就是当PC 9014端口收到udp包,它会转发给虚拟机相应的端口
使用windows程序telnet即可达到映射的目的,(注意Telnet在win10需要开启,可查找怎么开启这个程序)
打开cmd 输入如下命令连接到本地虚拟机
telnet localhost 5554
连接成功后他会提示你输入验证,并告诉你验证码在哪里
③ android udp接收不到数据
1、可先在oncreate()方法里面实例化一个WifiManager.MulticastLock 对象lock;具体如下:
WifiManager manager = (WifiManager) this
.getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock lock= manager.createMulticastLock("test wifi");
2、在调用广播发送、接收报文之前先调用lock.acquire()方法;
3、用完之后及时调用lock.release()释放资源,否决多次调用lock.acquire()方法,程序可能会崩,详情请见
Caused by: java.lang.UnsupportedOperationException: Exceeded maximum number of wifi locks
注;记得在配置文件里面添加如下权限:
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
经过这样处理后,多数手机都能正常发送接收到广播报文。
本小点转载自Android手机接收不到UDP报文
二、在UDP通信中,android端发送UDP广播包没有问题。至于接收的话,有时候不能接收到包。
在UDP通信中,android端发送UDP广播包没有问题。至于接收的话,有时候不能接收到包。但是如果UDP包中指定了目标主机的地址的话,那么android端就能正常接收。
下面上一段代码,大家可用这段代码进行测试。
1、在一个Service里面,我们创建一个线程
public void onCreate() {//用于创建线程
WifiManager manager = (WifiManager) this
.getSystemService(Context.WIFI_SERVICE);
udphelper = new UdpHelper(manager);
//传递WifiManager对象,以便在UDPHelper类里面使用MulticastLock
udphelper.addObserver(MsgReceiveService.this);
tReceived = new Thread(udphelper);
tReceived.start();
super.onCreate();
}
2、弄一个UDP帮助类,这个类主要用于发送和接收数据
package com.example.com.ihome.bang.util;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Observable;
import com.example.com.ihome.bang.tool.SendThread;
import android.net.wifi.WifiManager;
import android.util.Log;
/**
*
* UdpHelper帮助类
*
* @author 陈喆榕
*
*/
public class UdpHelper implements Runnable {
public Boolean IsThreadDisable = false;//指示监听线程是否终止
private static WifiManager.MulticastLock lock;
InetAddress mInetAddress;
public UdpHelper(WifiManager manager) {
this.lock= manager.createMulticastLock("UDPwifi");
}
public void StartListen() {
// UDP服务器监听的端口
Integer port = 8903;
// 接收的字节大小,客户端发送的数据不能超过这个大小
byte[] message = new byte[100];
try {
// 建立Socket连接
DatagramSocket datagramSocket = new DatagramSocket(port);
datagramSocket.setBroadcast(true);
DatagramPacket datagramPacket = new DatagramPacket(message,
message.length);
try {
while (!IsThreadDisable) {
// 准备接收数据
Log.d("UDP Demo", "准备接受");
this.lock.acquire();
datagramSocket.receive(datagramPacket);
String strMsg=new String(datagramPacket.getData()).trim();
Log.d("UDP Demo", datagramPacket.getAddress()
.getHostAddress().toString()
+ ":" +strMsg );this.lock.release();
}
} catch (IOException e) {//IOException
e.printStackTrace();
}
} catch (SocketException e) {
e.printStackTrace();
}
}
public static void send(String message) {
message = (message == null ? "Hello IdeasAndroid!" : message);
int server_port = 8904;
Log.d("UDP Demo", "UDP发送数据:"+message);
DatagramSocket s = null;
try {
s = new DatagramSocket();
} catch (SocketException e) {
e.printStackTrace();
}
InetAddress local = null;
try {
local = InetAddress.getByName("255.255.255.255");
} catch (UnknownHostException e) {
e.printStackTrace();
}
int msg_length = message.length();
byte[] messageByte = message.getBytes();
DatagramPacket p = new DatagramPacket(messageByte, msg_length, local,
server_port);
try {
s.send(p);
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
StartListen();
}
}
希望能帮到你。
④ Android UDP接收到数据,如何转换成字符串
首先你要取得文件的路径的字符串,然后定义一个集合l(list)将这些路径都装到集合中,让后通过Intent将这个集合传到盯没败下一个Activity(Intent inten=new Intent(),intent.putExtra("list",list);)就ok了。在下一个Activity中通过intent.getExtra("察敬list");就能得到传过来的集合了。我没有详细的代码,过程说得还是比较清楚凯颤的,希望对你有帮助。
⑤ android 如何用UDP协议接收无线硬件设备的数据
理论上来说是可以的,但是这个涉及到传输层的问题,需要你对通信原理、系统芯片、Android编程有很深的理解,建议放弃。
⑥ Android UDP通讯(简单demo)
本章节 比较简单
直接上code了
首先创建一个UDP class 构造方法如下
通过newFixedThreadPool 创建一个线程池
然后
一个startUdp scoket 重要步骤
startSocketThread是一个 接收消息的子线程
内部是一个接收消息的循环
BROADCAST_IP 是通信对方的地址
利用广播 把接收到的消息打印到前台
再然后创建一个发送message的方法
文章所有code 地址---> github
https://github.com/hanjole/Udpscoket_demo
⑦ unity发布android端UDP无法接受广播数据
socket TCP和UPD 的链接方式一样 只是将一个参数TCP改逗老成UDP而已 UDP解析码旁包的时候 和发送包的时候 一般都带有序号 保证包的顺序 TCP是有迟指橡序发送的
⑧ Android 基于UDP的Socket通信
1、连接DatagramSocket的服务端(ip和port):开启异步线程和socket
2、发送数据(DatagramPacket):异步
3、接收数据(DatagramPacket):注意连接状态,异步读取
4、关闭连接:关闭DatagramSocket和对应线程
1、异常:android.os.NetworkOnMainThreadException。 socket需要在线程中使用
2、前后端统一传输或者接收协议 [requestcode size d1 d2 d3 ... ],在解析时候用得到
3、实施监控socket的连接状态,还是用心跳包发过去,然后返回数据,一段时间没有的话则代表socket连接失败。
4、注意receive接收数据后的有效长度(一个是预存的buffer,一个是有效结果buffer)
5、客户端连上去后不知道为何一定要先发送一次,才能接收?
6、UDP不安全,有长度限制64K
2019 (* ̄(oo) ̄) 诸事顺利!