0

我正在使用 Sockets api 在 Java 中创建一个网络游戏,并遇到以下问题:

当应用程序启动时,服务器套接字开始侦听并为每个新客户端生成一个新线程(基本的东西,不需要显示此代码)。

然后客户端开始对话,发送字符串“LOGIN”。服务器接收它并以“LOGIN_OK”响应。现在对话结束了,但控制台继续打印 LOGIN_OK(发生在客户端上)。

为什么会发生这种情况?readLine() 不应该阻塞吗?感谢您的澄清!

编辑:问题出在客户端循环中。客户端正在将服务器的响应发送回服务器!刚刚注释掉那行就解决了!

服务器循环

public void run()
    {
        String fromClient = null;

        try {
            while ((fromClient = in.readLine()) != null) {
                System.out.println(fromClient);
                String response = SessionProtocol.handleInput(fromClient);

                out.println(response);
                Thread.sleep(50L);
            }

        } catch(IOException ex){ex.printStackTrace();}  
          catch(InterruptedException ex){ex.printStackTrace();}
    }

客户端循环

public void run()
    {
        String fromServer = null;

        try {
            while ((fromServer = in.readLine()) != null) {
                System.out.println(fromServer);
                String response = SessionProtocol.handleInput(fromServer);
                 // next line causes the problem
                //out.println(response);
                Thread.sleep(50L);
            }

        } catch(IOException ex){ex.printStackTrace();}  
          catch(InterruptedException ex){ex.printStackTrace();}
    }
4

2 回答 2

1

是的,readLine()正在阻塞。

无论之前是否有任何文字,您都会in.readLine()一直阅读到下一个字符。\n由于您正在调用out.println(),因此您将 a 附加\n到您的输出中,无论响应是否为空。

因此,客户端和服务器上循环的每次迭代都会收到一个换行符并输出一个换行符,这就是为什么它看起来没有阻塞的原因。

于 2013-08-08T15:27:34.043 回答
0

假设out.println()将消息写入通信套接字的输出流,您似乎有两个问题:

  1. 客户端和服务器不断地相互发送消息,即每次循环迭代以out.println(response).
  2. 检查逻辑以防SessionProtocol.handleInput()客户端收到“LOGIN_OK”。是空消息还是其他消息?必须对服务器部分进行相同的检查。您可能会LOGIN/LOGIN_OK不断发送消息..
于 2013-08-08T15:37:44.070 回答