BufferedReader在readLine中没有阻塞

时间:2013-08-08 15:23:58

标签: java sockets bufferedreader

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

2 个答案:

答案 0 :(得分:1)

是的,readLine()正在阻止。

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

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

答案 1 :(得分:0)

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

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