使用Socket做了一个服务程序,与客户端建立连接后,首先由客户端发过来一个XML请求,服务器端接收到请求后,根据XML内容进行业务处理,处理完成后,再把处理结果返回给客户端,并关闭Socket链接。
目前,由于数据库压力问题,经常导致服务器端业务处理时间过长,客户端由于始终没有得到回应,认为处理已经超时,会主动断开Socket链接。
因此,当超时情况发生时,服务器端在向客户端回写数据时,系统应该能够弹出IO异常,以提示写入失败或链接断开的。但是目前代码中未有任何的提示,进行逐步代码排查时,发现客户端向服务器端写入数据后,主动关闭了scoket的输出流sock.shutdownOutput();如果把该行代码注释掉时,当出现超时时服务器端就可以正常检查出来回写失败,如果加入就检查不出来,现在想问问大家这到底是什么原因?

解决方案 »

  1.   

    客户端代码示例:
    client = new Socket(ip,9000);
            
    client.setSoTimeout(0x927c0);
    out = new DataOutputStream(client.getOutputStream());byte request[] = RequestInfo.getStrInfo(strID).getBytes;           
    System.out.println(new Date());
    System.out.println((new String(request, "GBK")).trim());
    out.write(request);
    out.flush();
    client.shutdownOutput();in = new DataInputStream(client.getInputStream());
    byte reply[] = new byte[2048];
    in.read(reply);
    System.out.println(new Date());
    System.out.println((new String(reply, "GBK")).trim());
      

  2.   

    如果客户端加入sock.shutdownOutput(),那就说明客户端只是纯监听服务器端的socket,这样当然服务器端因为超时断开,客户端也就只是断开而已,不会有异常。如果不加入,那客户端继续会维持连接去服务器端,这样如果服务器超时断开,客户端就无法继续连到服务器,也就有异常出现了。
      

  3.   


    是的,加上client.shutdownOutput(); 
    行代码后,客户端即使给关掉了,服务器仍然可以往客户端写数据,并且不提示任何异常
      

  4.   


    这个超时是在客户端设置的,服务器端并没有进行超时设置。
    当客户端超时后,整个系统就立即退出,socket应该已经断开,但是断开后,服务器端在继续向socket流里面写数据的话,任何成功,没有任何提示。
      

  5.   

    服务器端的代码有问题。lz可参考:http://www.blogjava.net/xuechen0721/archive/2006/04/29/44040.html
      

  6.   

    client.shutdownOutput(); 这条语句,本来也没必要加上去啊?
    不加就玩了呗
      

  7.   


    服务器端代码:
    InputStream in = clntSock.getInputStream();
    OutputStream out = new OutputStream(clntSock.getOutputStream());byte[] buffer = new byte[BUFSIZE];   // Allocate read/write buffer
    int bytesRead;                       // Number of bytes read
    if ((bytesRead = in.read(buffer)) != -1) {
        out.write(buffer, 0, bytesRead);   <--注意这行代码
    }当客户端没有写client.shutdownOutput(); 时,在服务器端读取数据成功后,在向客户端回写数据前,手动把客户端关掉,当调用write方法时会立刻弹出异常;
    而当客户端写了client.shutdownOutput(); 的时候,其他条件相同,调用write方法就没有任何异常。