我正在使用套接字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();}
}
答案 0 :(得分:1)
是的,readLine()
正在阻止。
您的in.readLine()
会一直读到下一个\n
字符,无论其前面是否有任何文字。由于您正在调用out.println()
,因此无论响应是否为空,您都会在输出中附加\n
。
因此,客户端和服务器上的循环的每次迭代都会收到换行符并输出换行符,这就是为什么它似乎没有阻塞。
答案 1 :(得分:0)
假设out.println()
将消息写入通信套接字的输出流,您似乎遇到了两个问题:
out.println(response)
结束。SessionProtocol.handleInput()
收到'LOGIN_OK'时的逻辑。这是一条空信息还是其他信息?必须对服务器部件进行相同的检查。您可能会不断发送LOGIN/LOGIN_OK
消息..