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

我的服务器端在客户端登陆的时候建立了一个和他通讯的线程,用对象流来读取客户端发来的数据:publicvoidrun(){while(!s.isClosed()){try{... 我的服务器端在客户端登陆的时候建立了一个和他通讯的线程,用对象流来读取客户端发来的数据:
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)
展开
 我来答
无奈地摇摇头
2012-10-18 · TA获得超过199个赞
知道答主
回答量:76
采纳率:0%
帮助的人:24.6万
展开全部
客户端和服务器正在通信,你突然关掉了客户端,他肯定要出异常的。这个异常需要你自己来处理(而不是让他打印堆栈信息)。
try{
//代码块
//这里一般会用一个while(//连接中){
//判断接收的信息是退出的标志,是则按正常退出
//否则,处理信息
//继续读
}

}catch(Exception e){ //exception的类型最好写具体的子类
System.out.println("客户端连接中断...."+socket);
}finally{
//在这里关闭这个客户端的socket
socket.close();
}
百度网友ce7f3ccb4
2012-10-20 · TA获得超过1950个赞
知道大有可为答主
回答量:2299
采纳率:0%
帮助的人:1887万
展开全部
楼主啊,socket其实就是2个人堵住中间管子里的水一样,一个人走,水肯定会流出去啊,

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

isClosed()提示连接断开

两个不一样的概念
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
luiprw
2012-10-18 · 超过21用户采纳过TA的回答
知道答主
回答量:87
采纳率:0%
帮助的人:48.2万
展开全部
结束的时候 socket.close().. 之前做socket通讯的时候,报错只要不影响程序正常运行,就让它报去吧.不要把太多的时间放到找错上面,尤其是找了半天没找到的时候.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
歪歪尔奇
2012-10-17 · 超过24用户采纳过TA的回答
知道答主
回答量:68
采纳率:0%
帮助的人:54.7万
展开全部
个人感觉可能是这样:平常里没事,关闭的瞬间出现了错误,可能是出现了线程死锁。一方面服务器等待被关闭的客户机的数据以关闭服务线程,于是服务器无法跳出循环。另一方面其他客户又要向服务器写数据。这里主要是没有使用close();不知道socket里边有没有shutdown()这个函数,如果有的话,close()换成shutdown()会比较好;没有shutdown()你就老实的写close()。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xiaoshan1314yt
2012-10-17 · 超过13用户采纳过TA的回答
知道答主
回答量:69
采纳率:0%
帮助的人:30.2万
展开全部
你程序最后有close()吗
追问
close()什么?端口? 我是一个服务器和多个客户端连接,每个客户端连接进来的时候,为他新建一个保持通讯的连接。要怎么关闭呢?我是初学者,麻烦讲详细点
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式