我有一个用C语言编写的UDP服务器,每隔5秒在端口3001上通过我的LAN广播一个paquets。
我正在创建一个作为UDP客户端的android应用程序,它正在侦听端口3001(在AsyncTask线程中)并且它一直在运行,直到receive()方法,似乎没有检测到数据端口。
这是我的代码:
private class ConnectionTask extends AsyncTask<Void, Integer, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(Void... arg0) {
String receivedString = "";
byte[] receiveData = new byte[1024];
DatagramSocket clientSocket;
try {
while(true){
clientSocket = new DatagramSocket(5000);
DatagramPacket receivePacket = new DatagramPacket(receiveData,
receiveData.length);
clientSocket.receive(receivePacket);
receivedString = new String(receivePacket.getData());
}
} catch (SocketException e) {
Log.v("SocketExceptionOccured", e.toString());
e.printStackTrace();
//clientSocket.close();
} catch (IOException e) {
Log.v("IOExceptionOccured", e.toString());
e.printStackTrace();
//clientSocket.close();
}
Toast.makeText(getBaseContext(), receivedString, Toast.LENGTH_LONG)
.show();
return null;
}
}
我使用自己的设备测试我的代码以进行调试,使用USB线。
我使用在我的计算机上运行的简单UDP客户端(在C中)测试了我的服务器,并且通信正常。
我不知道为什么这段代码不起作用。有人有想法吗?
谢谢,
答案 0 :(得分:0)
你永远不会离开while
循环。你可能收到了消息,然后循环导致datagramsocket再次监听。
答案 1 :(得分:0)
每次循环时都不要创建和关闭套接字。先创建它然后关闭它。目前存在套接字不存在的时间窗口,因此丢弃了数据报:每次关闭时都会丢弃所有排队的数据报。
答案 2 :(得分:0)
我有同样的问题。您需要在android清单中添加权限
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
还在套接字中启用广播。
clientSocket.setBroadcast(true);
像我之前提到的其他人一样,你的代码也永远不会离开while循环,因此它永远不会进入toast显示的行。记住你不能显示来自doInBackground的Toast消息,因为这是访问UI Thread,你只能通过postExecute和preExecute函数这样做。这将导致您的应用程序崩溃。要检查收到的数据,您可以调试它或记录它。
你的最终doInBackground应该是这样的
@Override
protected Void doInBackground(Void... arg0) {
String receivedString = "";
byte[] receiveData = new byte[1024];
DatagramSocket clientSocket;
try {
while(true){
clientSocket = new DatagramSocket(5000);
DatagramPacket receivePacket = new DatagramPacket(receiveData,
receiveData.length);
clientSocket.setBroadcast(true);
clientSocket.receive(receivePacket);
receivedString = new String(receivePacket.getData());
Log.i("Received String= "+receivedString);
}
} catch (SocketException e) {
Log.v("SocketExceptionOccured", e.toString());
e.printStackTrace();
//clientSocket.close();
} catch (IOException e) {
Log.v("IOExceptionOccured", e.toString());
e.printStackTrace();
//clientSocket.close();
} finally{
if(clientSocket!=null){
clientSocket.close();
}
}
return null;
}
现在,当您检查日志时,您应该能够看到收到的字符串的值。