【问题标题】:Java: cannot read from socket, thread gets stuck on readLine()Java:无法从套接字读取,线程卡在 readLine()
【发布时间】:2018-05-24 16:28:32
【问题描述】:

这是我的服务器端代码:

@Override
public void run(){
    String message;
    String command;
    String[] arguments;

    try{
        BufferedReader inStream = new BufferedReader(
                                    new InputStreamReader(
                                        clientSocket.getInputStream()));

        while(online){
            message = inStream.readLine();

            if(message == null)
                continue;

            if(message.charAt(0) == '/'){
                int endOfCommandIndex = message.indexOf(' ');
                command = message.substring(1, endOfCommandIndex);
                arguments = message.substring(endOfCommandIndex + 1).split(" ");

                if(command.equals("login")){
                    setUserName(arguments[0]);
                    setName(arguments[0]);

                    sendMessage(this, "Connected");
                }
                //....
          }
     }
}

如标题所述,线程从 Socket 的 InputStream 读取时卡住了(我检查了 JDB,这不是条件等待,因为它似乎仍在“运行”)。

我试图向套接字写入一行,但它根本没有改变它的状态。我正在尝试构建一个类似于聊天的本地应用程序,而且我对套接字和流还很陌生。提前致谢。

对于客户端:

String msg;
try{
    while(!((msg = stdIn.readLine()).equals("/quit")))
        toServer.println(msg);
}
catch(IOException e){
    e.printStackTrace();
}

如果有人想查看我的整个代码,it is here hosted on github

【问题讨论】:

  • "一行被认为是由换行符('\n')、回车符('\r')、回车符后跟换行符中的任何一个终止,或通过到达文件结尾 (EOF)。";正在发送一个吗?
  • @JacobG。是的,我想是的。我正在使用 println() 方法连接到客户端套接字的输出流的 PrintWriter 写入套接字。是的。我猜
  • 感谢@RannLifshitz 的修订!
  • @EnricoMarconi 非常欢迎您。也可以随意为 StackOverflow 做出贡献。

标签: java sockets stream


【解决方案1】:

看起来消息在写入套接字流后从未刷新。

尝试任一调用:

toServer.flush();

println之后,或者在构造toServer时开启自动刷新:

toServer = new PrintWriter(socket.getOutputStream(), true);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 2015-05-09
    • 2017-10-09
    • 1970-01-01
    • 2011-05-07
    相关资源
    最近更新 更多