【问题标题】:How to stop BufferedReader readline()?如何停止 BufferedReader readline()?
【发布时间】:2015-09-29 22:41:38
【问题描述】:

我是 Java 新手,我正在尝试制作客户端-服务器形式。客户端和服务器可以互相聊天。所以我的客户有 2 个线程用于 2 个任务:发送和接收消息。我希望当我的 SendThread 从键盘字符串“Bye”读取时,我的客户端将停止 2 个线程。但问题是线程接收仍然执行 BufferedReader 的语句 readline() 所以它无法到达出口 这是我的代码:

        try {
            br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            while (!stop) {
                String temp = br.readLine();
                if (temp.length() == 0) {
                    Thread.sleep(100);
                }
                else System.out.println(" Receiving from server: " + temp);
            }
        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }

更新:对不起大家,因为我没有更清楚地解释。我的客户有 2 个线程独立运行。因此,此代码所在的 ReceiveThread 始终可以等待来自服务器的消息。并且 SendThread 也总是从键盘读取数据。所以当我输入“Bye”时,SendThread 读取这个字符串并停止客户端。问题是 ReceiveThread 正在执行readLine(),因此它无法自行停止。

【问题讨论】:

  • while (!stop) 奇怪的情况,因为你没有改变stop
  • stop 会在我关闭 SendThread 时改变。我不在这里发布该代码
  • 如果服务器关闭了套接字,你会关闭那个线程吗?因为这是您喜欢停止阅读的条件之一。您在哪里处理收到的消息“Bye”?如果尝试更改代码时“无处”,则可以检测到关闭的流或消息“再见”。当前的答案可能会对您有所帮助。
  • 睡觉是为了什么?这简直就是浪费时间。拿出来。

标签: java multithreading


【解决方案1】:

关闭套接字以进行输入,这将导致readLine() 返回null,之后读取线程应关闭套接字。

【讨论】:

    【解决方案2】:

    根据javadoc null 引用将在流结束时返回,所以我会这样做:

    br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    String temp;
    while ((temp=br.readLine())!=null) { //check null reference
        if (temp.length() == 0)
            Thread.sleep(100);
        else
            System.out.println(" Receiving from server: " + temp);
    }
    

    这没有帮助,请参阅How to interrupt BufferedReader's readLine

    【讨论】:

    • 根据Javadoc,在流结束时返回null,表示对端已断开连接,这意味着您应该停止读取,退出循环,并关闭套接字.没有什么可看的”。
    • 已更正@EJP,对您的回答和解释+1
    • 并非如此。你实际上还没有展示如何回答这个问题。也很难看出在空白行上睡觉对你有什么作用。
    • 使用br.readLine==null 不会影响,因为无论服务器是否发送任何内容,我的客户端都需要一直监听来自服务器的消息。但是关闭套接字确实是我需要的。链接真的对我有帮助:))
    • @EJP 是的。这是我的错。我没有给大家解释清楚。但是这个链接确实是我需要的答案。下次我会更加小心。无论如何,谢谢你的帮助:))
    【解决方案3】:

    为什么不也做同样的事情给客户呢?当服务器收到“再见”时,向客户端发送一个“再见”,当客户端收到此退出时。

    在服务器上

    if (inputLine.equalsIgnoreCase("bye")) {
        out.println("byebye");
        socket.close();
        break;
    }
    

    在客户端

    if (resp.equals("byebye")) {
        break;
    }
    

    【讨论】:

      【解决方案4】:

      这是一个如何通过关闭套接字来停止 readLine() 的示例

          final Socket s = new Socket("localhost", 9999);
          BufferedReader r = new BufferedReader(new InputStreamReader(s.getInputStream()));
      
          //  this thread will close socket in a second
          new Thread() {
              public void run() {
                  try {
                      Thread.sleep(1000);
                      s.close();
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
              };
          }.start();
      
          r.readLine();  
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-09
        • 2016-01-08
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多