为什么我的程序里当客户端或服务端关闭了,另一端都会抛出一个Socket Reset的异常。是Socket 中数据流的问题,还是怎么会事?

解决方案 »

  1.   

    我遇到过
    是在SOCKET正常关闭之前产生了异常
    造成socket非正常关闭
    于是就会产生Socket Reset的异常
      

  2.   

    比如client端在关闭socket之前强行关闭了程序
    那么server端就会产生这么一个异常
      

  3.   

    我原来也遇到过类似的问题。我的解决方式是,设置一个简单的传输协议:
    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回答问题,献丑啦~~~~)
      

  4.   

    java的Socket类的close()方法会发送套接字关闭信息吗?
      

  5.   

    好像Socket类的close()方法不会给对方对方的Socket发送相关信息。Socket类没有检测对方是否先关闭的方法。isConnected()与isClosed()方法都只能判断自身是否连接与关闭。不过,如果你以后找到了更好的方法,请不吝赐教
      

  6.   

    但tcp协议断开时,不是有握手协议的嘛
    要发一个fin过去嘛。还有用你上面那种方法,那对方发来的刚好是一个“exit”怎么办?
      

  7.   

    用你上面那种方法,那对方发来的刚好是一个“exit”怎么办?
    -----------------------------------------------------------------------------
    当然,简单发送"exit"字符串给对方,可能会与正常情况下发送"exit"字符串发生混淆,你应该尽量设计好协议关键字,比如产生一个随机N位串,并使之留为关键字,并设定信息发送方不能发送该关键字。