Java Datagramsocket.receive()冻结

时间:2014-10-03 19:52:29

标签: java sockets networking udp

在游戏中使用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();
    }
}

0 个答案:

没有答案
相关问题