socket客户端关闭了,服务端会报错,怎么让服务端任然正常运行?
我没用过Java,我只做过C++的客户端服务端通信,客户端服务端是两个软件啊,断开连接只要回“service has been stoped”,软件怎么会报错,难道你说的报错就是指断开连接时需要有反馈信息?
PrintWriter pw=null;
try {
/*
* InputStream getInputStream()
* Socket 提供的该方法可以提供一个输入流,
*/
InputStream in=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(in,"UTF-8");
BufferedReader br=new BufferedReader(isr);
/*
* 通过Socket获取输出流,用于将消息发送给客户端
*/
OutputStream os=socket.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(os,"UTF-8");
pw=new PrintWriter(osw,true);
/*
* 将该客户端的输出流存入到共享集合中
*
* 由于多个线程都会调用该集合的add方法向其中添加
* 输出流,所以为了保证线程安全,可以将该集合加锁.
*/
synchronized (allOut) {
allOut.add(pw);
}
sendMessage(host+"上线了,当前在线:"+allOut.size()+"人");
System.out.println(host+"上线了");
String message=null;
while((message=br.readLine())!=null){
synchronized (allOut) {
/*
* 转发给所有客户端
*/
sendMessage(host+"说:"+message);
}
// pw.println(host+"说:"+message);
// System.out.println(host+":");
// System.out.println(message);
}
} catch (Exception e) {
} finally{
/*
* 处理客户端断开连接后的工作
*/
/*
* 将该客户端的输出流从共享集合中删除
*/
sendMessage(host+"下线了,当前在线:"+allOut+"人");
System.out.println(host+"下线了");
synchronized (allOut) {
allOut.remove(pw);
}
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
之前写过的一些代码,感觉和你描述的问题相近,你可以参考下
那是因为你代码有问题