繁体   English   中英

如何停止BufferedReader readline()?

[英]How to stop BufferedReader readline()?

我是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()因此无法自行停止。

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

根据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);
}

这没有用,请参见如何中断BufferedReader的readLine

为什么不回到客户端做同样的事情呢? 当服务器收到'bye'时,向客户端发送'byebye',并在客户端收到此退出时。

在服务器上

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

在客户端

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

下面是一个如何通过关闭套接字来停止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();  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM