在游戏中使用java中的数据报套接字时,会出现一个非常奇怪的问题。我试图在客户端收到数据包,但没有任何反应。然而,这并不奇怪。我已经在socket.receive()调用之前直接为套接字设置了超时,它仍然没有超时。
更奇怪的是,实施似乎完全是随机的。有时它就像魅力一样,服务器和客户端之间会出现稳定的包交换流。在这种情况下,我可以看到我的朋友走来走去,他也可以看到我。但有时,客户端完全冻结在socket.recieve()中。
服务器和客户端在不同的线程上运行,只处理网络通信。
基本上,问题是客户端socket.receive()似乎冻结,永远不会超时。任何可能出错的想法都将受到高度赞赏。
客户端run()方法:
public void run() {
try {
while(running) {
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
try {
System.out.println("BEFORE RECEIVE");
socket.setSoTimeout(1000);
socket.receive(packet);
System.out.println("AFTER RECEIVE");
}catch (SocketTimeoutException e) {
if(!disconnected){
System.out.println("TIMEOUT, RESENDING");
sendData(loginPacket.getData());
}
// e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
parsePacket(packet.getData(), packet.getAddress(), packet.getPort());
}
}finally {
System.out.println("SOCKET CLOSED");
socket.close();
}
}
服务器run()方法:
public void run() {
try {
socket.setSoTimeout(10);
while(running) {
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
try {
socket.receive(packet);
}catch (SocketTimeoutException e) {
continue;
}catch (IOException e) {
e.printStackTrace();
}
System.out.println("REcieve Packet: " + new String(packet.getData()));
parsePacket(packet.getData(), packet.getAddress(), packet.getPort());
}
}catch (SocketException e1) {
e1.printStackTrace();
} finally {
socket.close();
}
}