怎么让socket断开时直接结束 不再connect reset;

a2584382 2020-10-24 12:10:07
Socket 的服务端与客户端连接
服务器端:
ServerSocket SERVER = new ServerSocket(11111);
System.out.println("服务器已启动,等待用户连接---------");
while(true) {

//连接客户端
Socket socket = SERVER.accept();

ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());


es.execute(new User(oos,ois,socket));

}

User 线程 :while(true){ois.readObject()}

用户端:Socket socket = null;
try {
socket = new Socket("192.168.10.10",11111);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());

while (true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

} catch (IOException e) {
e.printStackTrace();
}

当关闭客户端时服务端一直抛出异常 java.net.SocketException: Connection reset 是要重新连接的意思吗?
如何才能让客户端关闭了就直接结束 让两端直接断开 服务器释放内存?
...全文
8187 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
老紫竹 2020-10-28
  • 打赏
  • 举报
回复
7楼正解。 客户端简单粗暴的关闭了连接。 服务器端必须得抛出异常,谁知道发生了什么。
冰思雨 2020-10-28
  • 打赏
  • 举报
回复
服务端是什么情况下抛出的 java.net.SocketException: Connection reset 异常? 问题的关键是,客户端关闭连接之后,服务端不知道客户端要关闭连接,仍然进行数据读取,然后才抛出的异常。 要想服务端不抛出这个异常,就需要客户端在关闭连接之前,向服务端发送一个信息,告诉服务端客户端要断开连接了,服务端收到这个信息之后,不在读取数据而是断开与客户端的连接,这样的话,服务端就不会抛出这个连接了,除非意外断网。 而上述提到的关于客户端断开连接的信息或者说数据包,需要楼主的应用层协议里面支持即可,就是说,你要自己添加一个这样的数据对象。
qybao 2020-10-26
  • 打赏
  • 举报
回复
引用 4 楼 a2584382 的回复:
我对setsotimeout不太了解 ,
他抛出异常之后Socket会不会被关闭,
还是说只是让read方法过去了没有别的影响,
(api没看懂)

正如你所理解,抛出timeout异常只是终止本次的read,socket不会关闭。否则设置timeout就没意义了,设置timeout就是为了在规定的时间内获得想要的信息,如果超时就主动放弃,重新下一次获得信息。当然。socket断了也会造成timeout,所以在捕获timeout异常后判断socket是否还连接,就是为了区分socket是因为关闭而timeout还是因为网速影响而timeout
a2584382 2020-10-26
  • 打赏
  • 举报
回复
我对setsotimeout不太了解 ,
他抛出异常之后Socket会不会被关闭,
还是说只是让read方法过去了没有别的影响,
(api没看懂)
qq_39936465 2020-10-26
  • 打赏
  • 举报
回复
引用 楼主 a2584382 的回复:
Socket 的服务端与客户端连接 当关闭客户端时服务端一直抛出异常 java.net.SocketException: Connection reset 是要重新连接的意思吗? 如何才能让客户端关闭了就直接结束 让两端直接断开 服务器释放内存?
服务器端改一下试试


   if(!socket.isConnected) {
          socket.close();
    }else{  
          es.execute(new User(oos,ois,socket));
    }
qybao 2020-10-25
  • 打赏
  • 举报
回复
那你就setSoTimeout设置timeout,然后捕获Java.net.SocketTimeoutException异常后再用上面的方法判断socket是否还在连接状态。
a2584382 2020-10-25
  • 打赏
  • 举报
回复
引用 1 楼 qybao 的回复:
把socket传给User线程
User线程:while(true){
if(socket.isClosed() || !socket.isConnected) {//判断socket是否关闭或不联通
break;
}
ois.readObject();
}

刚刚试了一下 还是不行 ;
线程应该是被阻塞到 ois.readObject();
所以就算是socket被关闭了 它还是在readObject();
不会经过上面的判断
qybao 2020-10-24
  • 打赏
  • 举报
回复
把socket传给User线程 User线程:while(true){ if(socket.isClosed() || !socket.isConnected) {//判断socket是否关闭或不联通 break; } ois.readObject(); }

62,614

社区成员

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

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