[英]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.