【发布时间】:2015-11-15 01:44:13
【问题描述】:
我编写了一个基本的 udp 客户端服务器,其中一个 android 向服务器发送消息,服务器将其中继给其余客户端。
问题是,传入的 udp 消息到达服务器,服务器将它们中继回来,但它们永远不会到达其余设备。
真正令人惊奇的是,如果我将服务器用作回显服务器(即仅转发给发件人),那么一切正常。所有客户端和服务器套接字使用相同的端口 2706
服务器代码
while (true) {
DatagramPacket packetToReceive = new DatagramPacket(new byte[2048], 2048);
try {
listenerSocket.receive(packetToReceive);
InetAddress senderAddress = packetToReceive.getAddress();
relayedBytes += packetToReceive.getLength();
if (!connectedClients.contains(senderAddress)) {
connectedClients.add(senderAddress);
}
for (InetAddress addr : connectedClients) {
// commenting this line will make it an echo server
if (!addr.equals(senderAddress))
{
//The following actually prints the ips of the android
//devices so it knows where to send
System.out.println(senderAddress.getHostAddress().toString() +
" to " + addr.getHostAddress().toString());
byte[] data = packetToReceive.getData();
packetToReceive.setData(data, 0, packetToReceive.getLength());
packetToReceive.setAddress(addr);
listenerSocket.send(packetToReceive);
}
}
} catch (IOException) {
e.printStackTrace();
}
}
android 发送者逻辑:
mainSocket=new DatagramSocket(homePort);
//targetAddressString is the public IP of server
target = InetAddress.getByName(targetAddressString);
while (true) {
byte[] data = getdata();
if (data == null)
continue;
DatagramPacket packet = new DatagramPacket(data, data.length, target, targetPort);
mainSocket.send(packet);
}
同时在其他线程上,接收者只是用相同的 udp 套接字等待:
while (true) {
Log.d("Player", "Waiting for data");
DatagramPacket packet = new DatagramPacket(new byte[2048], 2048);
try {
mainSocket.receive(packet);
Log.d("Player", "packet received");
//do something with the packet
} catch (IOException e) {
e.printStackTrace();
}
}
它永远不会比等待数据更进一步,因为它会阻塞直到它收到一个数据包
此外,我还可以在 wifi 和移动数据图标中看到它没有收到任何数据,但数据发送始终处于开启状态,并且在服务器上可以看到
**编辑:- 回声服务器 **
while (true) {
DatagramPacket receivedPacket = new DatagramPacket(new byte[2048], 2048);
try {
listenerSocket.receive(receivedPacket);
InetAddress senderAddress = receivedPacket.getAddress();
if (!connectedClients.contains(senderAddress)) {
connectedClients.add(senderAddress);
}
for (InetAddress addr : connectedClients) {
byte[] data = receivedPacket.getData();
DatagramPacket sendPacket= new DatagramPacket(data, 0, receivedPacket.getLength(), addr, receivedPacket.getPort());
listenerSocket.send(sendPacket);
}
} catch (IOException e) {
// ...
}
}
基本上,它应该将消息转发给曾经发送过任何数据的每个客户端,但不知何故,它只将其发送给其原始发送者,其余客户端会错过它。代码在和我一起拖钓
【问题讨论】:
-
这里发生了一些非常神奇的事情,我进一步简化了服务器,简单地将数据从一个客户端发送到 connectedClient 向量中的每个人。仍然只有最初发送数据包的人可以取回它。我认为我犯了一些非常愚蠢的错误。
-
您能否将服务器的代码发布为似乎可以工作的回显服务器?这可能为我们回答提供必要的见解。
-
@AlainO'Dea 当然,请查看编辑