gpt4 book ai didi

Java DatagramSocket超时但实际上已收到

转载 作者:行者123 更新时间:2023-12-01 12:36:26 25 4
gpt4 key购买 nike

奇怪的是我使用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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com