奇怪的是我使用WireShark测试结果,结果显示我的代码可以成功通过socket发送消息。但即使我从服务器收到消息,我的程序也会抛出 Timeout
异常。
不知道为什么会出现超时问题。
我的代码很简单:
static Timer timer = new Timer();
try {
DatagramSocket c = new DatagramSocket();
c.setBroadcast(true);
byte[] sendData = "messageToServer".getBytes();
try {
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, InetAddress.getByName("255.255.255.255"), 10000);
c.connect(InetAddress.getByName("255.255.255.255"), 10000);
c.send(sendPacket);
} catch(Exception ex) {
System.out.println(ex.toString());
}
timer.schedule(new receiveTask(), 2000);
} catch(Exception ex) {
System.out.println(ex.toString());
}
我使用计时器来延迟从服务器接收消息。
receiveTask 类如下所示:
public class receiveTask extends TimerTask {
@Override
public void run() {
// TODO Auto-generated method stub
try {
DatagramSocket c2 = new DatagramSocket();
c2.setSoTimeout(10000);
byte[] recvBuf = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(recvBuf, recvBuf.length);
String message = "";
while (true) {
c2.receive(receivePacket);
System.out.println("Receive packet from Server");
message=new String(receivePacket.getData()).trim();
System.out.println(message);
System.out.println("Close the connection of server socket");
}
} catch(Exception ex) {
System.out.println(ex.toString());
}
}
}
并且 receiveTask
类中抛出 SocketTimeOut
异常。
由于服务器可以向我发送消息(在 WireShark 中测试),因此我认为 fult 不是服务器端的。但是什么会导致超时呢?
为什么服务器返回消息给我,但我在程序中却收不到它?
我的 Java 版本是 7,禁用计算机上的防火墙没有什么区别...
如有任何建议,我们将不胜感激!
编辑:虽然问题不在于socket.close();我删除了代码。
最佳答案
您可以尝试一些方法。
首先,尝试调用timer.schedule(new receiveTask(), 2000);
早点让你的receiveTask
在发送任何消息之前已准备好接收消息。
其次,移动您的c.close()
声明 finally
子句,尤其是 while
内的子句receiveTask
的循环以确保您的套接字不会过早关闭。所以代码看起来像
DatagramSocket c2 = null;
try{
c2 = new DatagramSocket();
c2.setSoTimeout(10000);
byte[] recvBuf = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(recvBuf, recvBuf.length);
String message = "";
while(true){
c2.receive(receivePacket);
System.out.println("Receive packet from Server");
message=new String(receivePacket.getData()).trim();
System.out.println(message);
System.out.println("Close the connection of server socket");
}
}catch(Exception ex){
System.out.println(ex.toString());
} finally{
if(c2 != null)
c2.close();
}
如果所有其他方法都失败,请尝试 c2.setSoTimeout(0);
这将导致 timeout to be set to infinite 。但我有一种感觉,这只是一个掩盖真正问题的黑客行为。
关于Java DatagramSocket超时但实际上已收到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25542892/