【问题标题】:Server Socket Input Stream returning null before disconnect服务器套接字输入流在断开连接之前返回 null
【发布时间】:2012-02-22 06:05:02
【问题描述】:

我正在尝试在一个简单的 Java 应用程序中处理客户端断开连接,该应用程序使用客户端和服务器发送聊天消息。

问题来了

public void run() {
    try {
        System.out.println("Client Connected");
        String inputLine;

        while ((inputLine = in.readLine()) != null) {
            System.out.println(inputLine);
            theServer.handle(inputLine, this);
        }
        out.close();
        in.close();
        socket.close();
        System.out.println("Client Disconnected");

    } catch (Exception e) {
        e.printStackTrace();
    }

}

使用此代码,它会在输入行不为空时运行 while 循环。如果它为空,那么它将停止循环并关闭输入和输出流以及套接字。现在,除了控制台中的输出之外,这一切都很好:

Client Connected
null
Client(/127.0.0.1): null
null
Client(/127.0.0.1): null
null
Client(/127.0.0.1): null
null
Client(/127.0.0.1): null
Client Disconnected

我不明白为什么即使输入为空,循环也会继续循环!在退出循环之前似乎需要一段时间才能意识到它为空。我需要它立即退出。

任何帮助将不胜感激,

沙丁鱼

【问题讨论】:

    标签: java sockets while-loop


    【解决方案1】:

    我能想到的唯一解释是:

    • in.readLine() 正在返回字符串 "null"(可能带有尾随空格),
    • in 指的是一些自定义流或阅读器包装器,其 readLine() 方法正在做一些奇怪的事情,或者
    • 这不是您实际执行的代码。

    你说:

    “在退出循环之前似乎需要一段时间才能意识到它为空。”

    这是一个“巫毒编程”的解释。除非您的 Java 实现中存在错误,否则它不可能是正确的。这不太可能。

    【讨论】:

    • in指的是这个:in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    • 我知道我所说的是不可能的,这只是似乎正在发生的事情。代码正在执行,因为代码正在将信息打印到控制台。
    • 所以 - 我认为唯一可行的解​​决方案是你给我的第一个解决方案。
    • OK ...留下第一个和第三个解释。
    • @shadrxninga 您可能需要同时检查null 和字符串"null"。但我认为最好了解客户端为什么发送字符串"null",因为它表明客户端正在尝试使用空指针或引用。
    【解决方案2】:

    看起来返回的 null 在表单字符串中,所以这就是它的行为方式。

    【讨论】:

      猜你喜欢
      • 2014-12-02
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 2014-03-12
      相关资源
      最近更新 更多