to javahui(阶级斗争要年年讲,月月讲,天天讲。):
代码很长啊 测试分两种情况:一种情况是客户端接收到服务器端的回复信息后再关闭连接,这种情况不会出现该异常;另一种情况是客户端连续发送所有的请求,发送完后关闭连接,服务器端读取(这时读取出现异常)客户端发送的信息再进行处理。现在的问题就是:如果能在客户端关闭了socket的前提下服务器端仍然可以读取缓冲区中未读取的信息,你明白我的意思了吗?代码跟通用的服务器端代码是一样的,关键是跟客户端的配合处理

解决方案 »

  1.   

    你的Exception是服务器端抛出的还是客户端抛出的?
      

  2.   

    to  javahui(阶级斗争要年年讲,月月讲,天天讲。):我晕,当然是服务器端抛出的了客户端操作:打开连接>>发送>>关闭连接服务器端操作:接受连接>>读数据>>关闭方式一:客户端等待服务器端发出"读完了"信号后再关闭连接,此时正常方式二:客户端一发送完就关闭,不等待服务器是否读完,此时抛出异常好像有什么方法可以设置socket读完所有缓冲区信息的,哪位有设置过的呢?
      

  3.   

    我想是发送端断开连接造成的,
    建立二次握手就好了
    请求-------->
    <------------发送
    <------------发送结束
    接受结束---->
    <------------断开连接
      

  4.   

    to pzl686(阿虎):问题是客户端是其他软件供应商开发的呀,客户端已开发好了,就是建立连接>>发送>>断开有没有办法让服务器端在客户端断开的状态下接收缓冲区中的信息呢?
      

  5.   

    to pzl686(阿虎):应该是可以的
    因为别的服务器相同的客户端程序难接收到信息好像是设置socket的某些属性可以使得客户端要断开连接时必须等待某种状态才能真正断开的,也就是说客户端发出了断开连接命令,但真正的连接还是连在一起的,只是客户端不再接收和发送数据而已但我就是不知道设置哪个属性
      

  6.   

    这样的话,你找jdk文档看看,也许会有收获
      

  7.   

    to pzl686(阿虎):
    在C++下好像有set_sockopt之类的函数可以必变socket的属性的我手上没有jdk啊我就是希望有人做过,那我就不用找了,直接搬来用岂不妙哉??
      

  8.   

    public void setSoLinger(boolean on,
                            int linger)
                     throws SocketException
    Enable/disable SO_LINGER with the specified linger time in seconds. The maximum timeout value is platform specific. The setting only affects socket close.
    Parameters:
    on - whether or not to linger on.
    linger - how to linger for, if on is true.
    Throws:
    SocketException - if there is an error in the underlying protocol, such as a TCP error.
    IllegalArgumentException - if the linger value is negative.
      

  9.   

    to pzl686(阿虎):
    第二个参数应该设什么值呢?
    比方说:1表示什么,2表示什么,3表示什么之类的,你知道吗?
      

  10.   

    to pzl686(阿虎):
    我试了用setSoLinger(true,10)在accept前调用了一次不行在accept后再调用一次还是不行还是抛出相同的exception