- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
奇怪的是我使用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/
我正在用 Java 开发游戏,我正在尝试通过互联网在同一台计算机上的客户端和服务器之间进行通信,并最终在多台计算机之间进行通信。我以前可以,但现在服务器似乎没有收到来自客户端的任何数据包。我会尝试发布
我正在尝试设置/增加数据报套接字的接收缓冲区大小。我想这样做,因为在位于同一本地网络上的 PC 和 Android 设备之间发送数据时我遇到了一些随机数据包丢失,我想测试增加缓冲区大小是否会对减少此
我编写了一个非常简单的 kotlin 程序来从客户端接收图像。关键部分如下。 while (running) { try { buf = ByteA
在我的 Android 应用程序中,我发送了 UDP 数据包,并使用此代码等待特定的数据包。当它到达时,我不需要再听了。但是,它处于“接收模式”,当我调用 socket.close() 时,它会抛出异
我正在用 Java 编写一个聊天程序,我已经被这个问题困了几个小时。这是我的类,等待客户端连接到服务器。每次新客户端连接时,我都会创建一个新的 ChatClient(String name, Data
我正在编写一段 UDP 网络程序(客户端 - 服务器),但遇到了一些麻烦。 我想使用流来输入/输出数据,所以我用谷歌搜索“udp inputstream”并找到UDPInputStream和 UDPO
尽管我知道我的 UDP 数据包按预期到达(通过 Wireshark),并且关闭了 Windows 防火墙 - 我非常简单的 Java 代码从未收到任何数据包。 byte[] buffer = new
以下代码可以重现该问题: int errAt = -1; try { System.out.println("start..."); for (int i = 0; i < 400
我有一个客户端需要在特定端口上监听传入的 UDP 广播消息。我通过使用 1500 毫秒的 setSoTimeout 初始化绑定(bind)到端口的 DatagramSocket 对象来实现此目的。 w
我已经编写了简单的测试类,用于监听 Eth 并接收所有 UDP 数据包,这些数据包将转到端口 5001: public class Main { public static void main(S
我在 Lua 中为游戏编写了一个插件,它通过 UDP 数据包(512 字节)将玩家信息发送到远程服务器,远程服务器从数据包中读取数据并将所有玩家信息聚合到一个 xml 文件中(然后可以是所有玩家都可以
我使用 Java 中的 DatagramSocket 类从用 C 编写的客户端接收 udp 数据包。以下是接收代码(服务器套接字已设置): byte[] inputByte = new byte[1]
在 Linux (Ubuntu 12.04) 和 Windows 7 上调用此代码,您会得到截然不同的结果: DatagramSocket socket = new DatagramSocket(44
我正在开发一个项目,其中包含 1 个 Java 服务器、1 个 Android 客户端、1 个 Dart Web 客户端和 1 个 Java 客户端。我已经完成了 Java 服务器和客户端并可以工作。
我有一个 DatagramSocket,我在循环中接收数据,它最终停止接收数据包。我向服务器发送一条建立连接的问候消息。然后我开始按预期接收数据包。最终它停止接收。 发送服务器已验证它们仍在通过 tc
这个问题已经有答案了: Sockets: Discover port availability using Java (10 个回答) 已关闭 7 年前。 这个问题是关于数据报套接字而不是 TCP 套
我正在开发 Java UDP 应用程序。应用程序中有一个线程,其唯一的工作是监听特定端口上的服务器。 我编写应用程序时错误地假设我正在监听的服务器将始终处于运行状态;然而,这是一个错误的假设。 如果我
我创建了一个java服务器,它在特定端口上监听udp数据包,当收到数据包时,它会创建一个新线程,并将一个新的datagramsocket绑定(bind)到该端口,因此,如果它在该端口上收到10个数据包
我正在创建一个 java 多人游戏,它解决了 LAN 上客户端和服务器之间不断发送 DatagramPackets 的问题。 客户端的 DatagramSocket 将随机停止从服务器接收数据包,因此
嗨,我想循环遍历我拥有的 n 个端口的列表,并为每个端口创建一个 DatagramSocket: for(int i = 0; i socketList = new ArrayList(); soc
我是一名优秀的程序员,十分优秀!