关闭Socket 的问题 为什么我的程序里当客户端或服务端关闭了,另一端都会抛出一个Socket Reset的异常。是Socket 中数据流的问题,还是怎么会事? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我遇到过是在SOCKET正常关闭之前产生了异常造成socket非正常关闭于是就会产生Socket Reset的异常 比如client端在关闭socket之前强行关闭了程序那么server端就会产生这么一个异常 我原来也遇到过类似的问题。我的解决方式是,设置一个简单的传输协议:1、在客户端与服务器端的退出事件前发送一个简单的字符串给对方,比如"exit"(就当是协议的关键字吧~),对方可以根据你发送这一字符串与你的socket,判断你已关闭了连接。2、在客户端与服务器端的监听传入流事件中都加上if条件判断,Socket socket;//已连接对方的SOCKETInputStreamReader 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回答问题,献丑啦~~~~) java的Socket类的close()方法会发送套接字关闭信息吗? 好像Socket类的close()方法不会给对方对方的Socket发送相关信息。Socket类没有检测对方是否先关闭的方法。isConnected()与isClosed()方法都只能判断自身是否连接与关闭。不过,如果你以后找到了更好的方法,请不吝赐教 但tcp协议断开时,不是有握手协议的嘛要发一个fin过去嘛。还有用你上面那种方法,那对方发来的刚好是一个“exit”怎么办? 用你上面那种方法,那对方发来的刚好是一个“exit”怎么办?-----------------------------------------------------------------------------当然,简单发送"exit"字符串给对方,可能会与正常情况下发送"exit"字符串发生混淆,你应该尽量设计好协议关键字,比如产生一个随机N位串,并使之留为关键字,并设定信息发送方不能发送该关键字。 SCJP考题一道:线程安全 运行jar时提示 java.lang.NoClassDefFoundError: org/apache/logger 如何转换 调查:JAVA市场占有率如今怎样 关于JAVA 多线程 同步的问题,附源代码。 Java多线程(请高手作答) 高分! 有关数据刷新问题?(急) applet嵌入网页的问题 JavaMail接收邮件,如何判断邮件为新邮件,邮件接收采用POP3 帮我看看这个正则表达式该怎么写? 在线等!这段代码到底有什么问题?????????? 写入与读取中文字符的问题!
是在SOCKET正常关闭之前产生了异常
造成socket非正常关闭
于是就会产生Socket Reset的异常
那么server端就会产生这么一个异常
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回答问题,献丑啦~~~~)
要发一个fin过去嘛。还有用你上面那种方法,那对方发来的刚好是一个“exit”怎么办?
-----------------------------------------------------------------------------
当然,简单发送"exit"字符串给对方,可能会与正常情况下发送"exit"字符串发生混淆,你应该尽量设计好协议关键字,比如产生一个随机N位串,并使之留为关键字,并设定信息发送方不能发送该关键字。