关闭Socket 的问题

gcgan 2006-04-29 02:30:56
为什么我的程序里当客户端或服务端关闭了,另一端都会抛出一个Socket Reset的异常。是Socket 中数据流的问题,还是怎么会事?
...全文
268 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
InfiniteP 2006-05-06
  • 打赏
  • 举报
回复
用你上面那种方法,那对方发来的刚好是一个“exit”怎么办?
-----------------------------------------------------------------------------
当然,简单发送"exit"字符串给对方,可能会与正常情况下发送"exit"字符串发生混淆,你应该尽量设计好协议关键字,比如产生一个随机N位串,并使之留为关键字,并设定信息发送方不能发送该关键字。
gcgan 2006-05-06
  • 打赏
  • 举报
回复
但tcp协议断开时,不是有握手协议的嘛
要发一个fin过去嘛。还有用你上面那种方法,那对方发来的刚好是一个“exit”怎么办?
gcgan 2006-05-06
  • 打赏
  • 举报
回复
呵呵
谢谢哈
InfiniteP 2006-05-05
  • 打赏
  • 举报
回复
好像Socket类的close()方法不会给对方对方的Socket发送相关信息。Socket类没有检测对方是否先关闭的方法。isConnected()与isClosed()方法都只能判断自身是否连接与关闭。不过,如果你以后找到了更好的方法,请不吝赐教
InfiniteP 2006-05-05
  • 打赏
  • 举报
回复
我原来也遇到过类似的问题。我的解决方式是,设置一个简单的传输协议:
1、在客户端与服务器端的退出事件前发送一个简单的字符串给对方,比如"exit"(就当是协议的关键字吧~),对方可以根据你发送这一字符串与你的socket,判断你已关闭了连接。
2、在客户端与服务器端的监听传入流事件中都加上if条件判断,
Socket socket;//已连接对方的SOCKET
InputStreamReader reader;
BufferedReader input;
String str;//对方发来的信息
reader=new InputStreamReader(socket.getInputStream());
input=new BufferedReader(reader);
str=input.readLine();
boolean LISTEN_CLOSED=false;//设置关闭的条件
while(!(LISTEN_CLOSED)&&(!(socket.isClosed())))
{
if((str.equals("exit"))
{
socket.close();
LISTEN_CLOSED=true;
}
else
{
//正常情况读取对方信息
......
str=input.readLine();
}
}


如果你是说对方强行关闭,假如对方的窗口界面的话,你可以在窗口的关闭事件中发送"exit"给对方,说明你已关闭了。

当然,简单发送"exit"字符串给对方,可能会与正常情况下发送"exit"字符串发生混淆,你应该尽量设计好协议关键字。
-_-(第一次在CSDN回答问题,献丑啦~~~~)
gcgan 2006-05-05
  • 打赏
  • 举报
回复
java的Socket类的close()方法会发送套接字关闭信息吗?
gcgan 2006-05-03
  • 打赏
  • 举报
回复
就是象楼上说的那样但怎么做才不会呢?
zhmt 2006-04-29
  • 打赏
  • 举报
回复
比如client端在关闭socket之前强行关闭了程序
那么server端就会产生这么一个异常
zhmt 2006-04-29
  • 打赏
  • 举报
回复
我遇到过
是在SOCKET正常关闭之前产生了异常
造成socket非正常关闭
于是就会产生Socket Reset的异常
  • 打赏
  • 举报
回复
不一定
yanhan0615 2006-04-29
  • 打赏
  • 举报
回复
代码?

62,634

社区成员

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

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