IO阻塞时怎么检查判定循环flag变量的值啊?

ToBeNo6 2016-07-31 04:26:49
public static void main(String[] args) throws IOException{
serverSocket = new ServerSocket(9001);
Socket socket = serverSocket.accept();
PrintWriter printWriter = new PrintWriter(socket.getOutputStream(),true);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedReader typing = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Connected to client");
new Thread(new Runnable() {
@Override
public void run(){
while(!endOfSession){
try{
//就是这里,当用户输入over时,直接结束本次会话。但是readLine()会阻塞直至控制台输入换行符,然后才能检查///endOfSession,有什么办法当endOfSession变为true时直接跳出循环的吗?
String line = typing.readLine();
printWriter.println("Server: "+line);
}
catch (IOException e){

}
System.out.println("Enter input finished");
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
try{
String info = bufferedReader.readLine();
if(info!=null)
System.out.println(info);
else break;
}
catch (IOException e){
endOfSession = true;
System.out.println("The socket is closed!");
break;
}
}

}
}).start();
}
我写的一个简单地对socket对话程序,服务器端和客户端代码几乎没区别。服务器accept()后,创建两个线程,一个不断从键盘读标准输入并打印给客户端,另一个不断从socket读输入打印到控制台。当客户端断开连接时,第二个线程可以直接over,并改变第一个线程循环条件变量的值,但是第一个线程始终在等待用户输入,只有输入换行符后,才会再判端循环条件。有什么办法让线程一在等待用户输入时也可以得知socket已经关闭了吗?
...全文
111 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灰狼 2016-08-01
  • 打赏
  • 举报
回复
这种情况在通信中其实经常发生的 所以一般的通信软件里,会有“心跳”一说。就是客户端周期性地发送心跳报文给服务器,告诉服务器我还活着。服务器如果检测到某个客户端心跳周期过了很长时间还没有心跳包,则认为客户端已经当机,主动断开连接。 当然,一般在通信协议中会有客户端主动发起断开连接的报文,如果服务端收到以客户端的断开连接请求,可以在处理业务逻辑之后主动断开TCP连接 在楼主的程序里,可以: 1、建立一个共享的消息队列 2、用一个线程监听消息队列,平时处于睡眠状态,如果被唤醒时,则检查消息队列,如果有消息,则取出来并发送给服务器,然后继续睡眠 3、创建一个 Timer,周期性地创建心跳消息到消息队列,并唤醒监听线程 4、主线程接受命令行输入,如果输入完成一行,则把消息放到队列里,并唤醒监听线程

62,625

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧