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) 展开
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) 展开
5个回答
展开全部
客户端和服务器正在通信,你突然关掉了客户端,他肯定要出异常的。这个异常需要你自己来处理(而不是让他打印堆栈信息)。
try{
//代码块
//这里一般会用一个while(//连接中){
//判断接收的信息是退出的标志,是则按正常退出
//否则,处理信息
//继续读
}
}catch(Exception e){ //exception的类型最好写具体的子类
System.out.println("客户端连接中断...."+socket);
}finally{
//在这里关闭这个客户端的socket
socket.close();
}
try{
//代码块
//这里一般会用一个while(//连接中){
//判断接收的信息是退出的标志,是则按正常退出
//否则,处理信息
//继续读
}
}catch(Exception e){ //exception的类型最好写具体的子类
System.out.println("客户端连接中断...."+socket);
}finally{
//在这里关闭这个客户端的socket
socket.close();
}
展开全部
楼主啊,socket其实就是2个人堵住中间管子里的水一样,一个人走,水肯定会流出去啊,
Connection reset代表客户端程序退出( system.exit(0) ), 堵管子的人直接走了,水流出(内存溢出)
isClosed()代表socket.closed();堵管子的人把阀门关闭,然后走了,水照样还在管子里面
你考虑不全啊
把你的这个Connection reset异常catch一下,提示客户端程序退出
isClosed()提示连接断开
两个不一样的概念
Connection reset代表客户端程序退出( system.exit(0) ), 堵管子的人直接走了,水流出(内存溢出)
isClosed()代表socket.closed();堵管子的人把阀门关闭,然后走了,水照样还在管子里面
你考虑不全啊
把你的这个Connection reset异常catch一下,提示客户端程序退出
isClosed()提示连接断开
两个不一样的概念
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
结束的时候 socket.close().. 之前做socket通讯的时候,报错只要不影响程序正常运行,就让它报去吧.不要把太多的时间放到找错上面,尤其是找了半天没找到的时候.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
个人感觉可能是这样:平常里没事,关闭的瞬间出现了错误,可能是出现了线程死锁。一方面服务器等待被关闭的客户机的数据以关闭服务线程,于是服务器无法跳出循环。另一方面其他客户又要向服务器写数据。这里主要是没有使用close();不知道socket里边有没有shutdown()这个函数,如果有的话,close()换成shutdown()会比较好;没有shutdown()你就老实的写close()。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你程序最后有close()吗
追问
close()什么?端口? 我是一个服务器和多个客户端连接,每个客户端连接进来的时候,为他新建一个保持通讯的连接。要怎么关闭呢?我是初学者,麻烦讲详细点
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询