java程序,如何在客户端关闭后,服务器端把相应的连接客户端的线程终止

我的服务器端在客户端登陆的时候建立了一个和他通讯的线程,用对象流来读取客户端发来的数据:
public void run()
{

while(!s.isClosed())
{

try {
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
Message m = (Message) ois.readObject();

……
……
}
}

平时运行起来是正常的,但是客户端关闭后,服务端要报异常:

java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:113)
at java.io.ObjectInputStream$PeekInputStream.read(ObjectInputStream.java:2266)
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2279)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:2750)
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
at com.server.model.SerConClientThread.run(SerConClientThread.java:51)

客户端和服务器正在通信,你突然关掉了客户端,他肯定要出异常的。这个异常需要你自己来处理(而不是让他打印堆栈信息)。
try{
//代码块
//这里一般会用一个while(//连接中){
//判断接收的信息是退出的标志,是则按正常退出
//否则,处理信息
//继续读
}

}catch(Exception e){ //exception的类型最好写具体的子类
System.out.println("客户端连接中断...."+socket);
}finally{
//在这里关闭这个客户端的socket
socket.close();
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-10-20
楼主啊,socket其实就是2个人堵住中间管子里的水一样,一个人走,水肯定会流出去啊,

Connection reset代表客户端程序退出( system.exit(0) ), 堵管子的人直接走了,水流出(内存溢出)
isClosed()代表socket.closed();堵管子的人把阀门关闭,然后走了,水照样还在管子里面
你考虑不全啊
把你的这个Connection reset异常catch一下,提示客户端程序退出

isClosed()提示连接断开

两个不一样的概念
第2个回答  2012-10-18
结束的时候 socket.close().. 之前做socket通讯的时候,报错只要不影响程序正常运行,就让它报去吧.不要把太多的时间放到找错上面,尤其是找了半天没找到的时候.
第3个回答  2012-10-17
个人感觉可能是这样:平常里没事,关闭的瞬间出现了错误,可能是出现了线程死锁。一方面服务器等待被关闭的客户机的数据以关闭服务线程,于是服务器无法跳出循环。另一方面其他客户又要向服务器写数据。这里主要是没有使用close();不知道socket里边有没有shutdown()这个函数,如果有的话,close()换成shutdown()会比较好;没有shutdown()你就老实的写close()。本回答被网友采纳
第4个回答  2012-10-17
你程序最后有close()吗追问

close()什么?端口? 我是一个服务器和多个客户端连接,每个客户端连接进来的时候,为他新建一个保持通讯的连接。要怎么关闭呢?我是初学者,麻烦讲详细点

java线程关闭时会执行结束线程的方法吗
当你调用System.exit()或者通过其他方式(例如:在Spring Boot应用中使用\/shutdown端点)正常关闭应用时,Java虚拟机会尝试停止所有的非守护线程。如果线程在合理的时间内没有响应停止请求,那么Java虚拟机会使用更强硬的手段来停止它们。你可以通过在线程上调用Thread.interrupt()方法来中断线程。这将设置线程...

java Socket问题:服务器端等待客户端的请求,但是客户端连上后再关闭...
两种办法,1)客户端关闭前 先往服务端写一段特定的信息,服务端捕捉后就把该连接关闭。 这样关闭客户端也不会出错。2)用多线程来处理:1、Server创建 Socket s ; ServerSocket ss 并监听端口 run = true ; while(run) { s = ss.acept();} 2、Client 连接 Server , Server 接...

java线程如何停止
2. 使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。3. 使用interrupt方法中断线程。 1. 使用退出标志终止线程 当run方法执行完后,线程就会退出。但有时run方法是永远不会结束的。如在服务端程序中使用线程进行监听客户端请求,或是其他的需要...

java socket 客户端关闭,服务器端抛出java.net.SocketException: Con...
会不会是p2p的模式造成的,服务器端使用多线程模式了么?客户端发送一次消息后,是不是线程就结束了,然后关闭连接了啊

Java中如何正确而优雅的终止运行中的线程
2、使用volatile标志位 看一个简单的例子:首先,实现一个Runnable接口,在其中定义volatile标志位,在run()方法中使用标志位控制程序运行 public class MyRunnable implements Runnable { \/\/定义退出标志,true会一直执行,false会退出循环 \/\/使用volatile目的是保证可见性,一处修改了标志,处处都要去...

java web页面,关闭浏览器,让一个操作继续执行?
这要看你的程序是客户端还是服务器端 如果是客户端执行,也就是说是浏览器去执行,那关闭之后是不能继续执行了。比如一个客户端的分页,这里假设分页的效率比较低,分页执行可能需要5秒,如果在这5秒内你关闭浏览器,这个分页就没有执行成功了,这种是显而易见的情况 如果是服务器端,还要看执行完成...

...的tcp连接,如果客户端异常断开连接,服务器端如何获知,有什么方法...
这个得用java心跳处理机制。就是客户端每隔一段时间向服务器发送指定信息,如果服务器没有收到客服端发来的信息,这时服务器和客服端连接就已经断开。具体的心跳实现百度上很多。

java.net.SocketException: Software caused connection abort...
然后分配给此socket连接的线程退出,那么客户端在while(true){..}循环,读取流时便会发java.net.SocketException:Software caused connection abort: recv failed异常。已知会导致这种异常的一个场景如下:客户端和服务端建立tcp的短连接,每次客户端发送一次请求,服务端响应后关闭与客户端的连接.如果客户端在...

java中终止程序的执行
(1)让程序在一个单独的线程中运行,然后在终止时,可以用线程的终止方法来结束它。(2)退出Java程序时尽量不要使用java.lang.System的exit方法。Exit 方法可以终止JVM,从而终止程序,但如果同时运行了另一个Java程序,使用exit方法就会让该程序也关闭,这显然不是希望看到的情况!!!要退出Java程序...

java中socket如何让服务端一直等待,客户端每隔一段时间链接一次_百度...
1、服务端 使用ServerSocket 在确定端口之后,调用accept() 方法 。 这样 服务端就会阻塞在accept() 这里 直到有客户端请求过来 才会接着往下执行,后面你就写获取文件夹内容的具体逻辑代码 然后写入流里面 传回给客户端就可以了 2、客户端 客户端你要求每隔一段时间 有很多种方法可以实现 比如说写...

相似回答