求助 android 下接收UDP数据不正常

肉松-面包 2014-01-09 10:05:54
项目要做一个接收广播消息的功能,收到对应消息做刷新一下界面。现在的问题是,有时候能收到数据,有时又收不到,测试机器台电(平板)P88,P98这两个机器经常收不到数据;手机(红米、康佳)却几乎能全部收到。

广播消息是一个 delphi 写的程序(我们叫“消息服务器”)发过来。后来叫 delphi 开发的同事写了个一个小 demo .这个小 demo发的广播,台电(平板)P88,P98却大部分又能收到。用抓包工具查看,无论是小demo,还是“消息服务器”都是有广播的。PS:后来我又写了一个PC端的接收程序,广播消息均能收到,代码和android是一样的。

请朋友分析一下问题,搞了两三天了。
代码如下:




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

import android.net.wifi.WifiManager;

import com.lincson.generic.Log;

public class UdpHelper implements Runnable {

private static final int port = 6661;// 监听端口
private boolean run = true;// 开启线程
private WifiManager.MulticastLock lock;
private static final String Tag = "UdpHelper";

private DatagramSocket readSocket=null;

private int msgMaxSize= 65600;
public UdpHelper(WifiManager manager) {
lock = manager.createMulticastLock("UDPwifi");
}

@Override
public void run() {

startBroadcastListener();
}

public void stopListener() {
run = false;
}

/**
* 监听数据
*/
private void startBroadcastListener() {

try {
lock.acquire();
readSocket = new DatagramSocket(port);
readSocket.setReuseAddress(true);
readSocket.setBroadcast(true);

try {
while (run) {
//lock.acquire();
// 准备接收数据
Log.d(Tag, "准备接收");
// 接收的字节大小,客户端发送的数据不能超过这个大小
byte[] message = new byte[msgMaxSize];

DatagramPacket datagramPacket = new DatagramPacket(message, message.length);

readSocket.receive(datagramPacket);

byte[] data = datagramPacket.getData();

String strMsg = new String(data).trim();
Log.d(Tag, "int :" + srtT);
Log.d(Tag, datagramPacket.getAddress().getHostAddress().toString() + ":" + strMsg);
//lock.release();
new notifiyEventThread(strMsg).start();
}
} catch (IOException e) {// IOException
e.printStackTrace();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}



class notifiyEventThread extends Thread{
private String msg;
public notifiyEventThread(String strMsg)
{
msg=strMsg;
}

public void run() {

notifiyEvent(msg);
}

/**
* 根据指令发出(开单、结帐、划单)通告
*
* @param message
*/
private void notifiyEvent(String msg) {
if ("end".equals(msg)) {
DianxinEvent.notifiEndBill();

} else {
DianxinEvent.notifiOpenBillEvent(msg);
}
}
}
}

...全文
127 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
肉松-面包 2014-01-10
  • 打赏
  • 举报
回复
自己顶一下

80,349

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧