【问题标题】:BufferedReader is not blocking in readLineBufferedReader 在 readLine 中没有阻塞
【发布时间】:2013-08-10 09:33:14
【问题描述】:

我正在使用 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();}
    }

【问题讨论】:

  • 只是一个建议,看看 ZeroMQ,一个 Java 套接字库;它更适合您正在做的事情,而不是使用普通的 Java 套接字:github.com/zeromq/jeromq
  • 谢谢,我一定会检查的!

标签: java sockets bufferedreader


【解决方案1】:

是的,readLine() 正在阻止。

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

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

【讨论】:

  • 它输出“LOGIN_OK”,而不是换行。
  • 对,但您使用的是out.println(),它将换行符附加到您输出的任何内容。如果您不希望它这样做,请使用 out.print()
【解决方案2】:

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

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

【讨论】:

  • 我太傻了。问题出在客户端循环中……客户端正在将服务器的响应发送回服务器!刚刚注释掉那行就解决了!感谢您的帮助。
猜你喜欢
  • 2018-09-26
  • 2017-07-09
  • 2011-12-12
  • 2020-12-05
  • 2013-10-23
  • 1970-01-01
  • 1970-01-01
  • 2017-05-03
  • 1970-01-01
相关资源
最近更新 更多