小弟最近在编写一个java的client端,需要实时的与server端连接获得数据。server端采用的是长连接的方式,client端连上后,server端不会主动断开。代码如下,通过如下代码的实现java编写的client端连接后时常会出现client端收不到数据的情况,最后到超时退出抛出异常。通过观察server段的日志和通过其他调试工具收发包的测试,server端收到请求后确实返回了数据,但不知道为什么Java编写的client端就是会出现时常收不到包的情况。请大家帮忙,分不够可以加。不是收不到,而是有的时候收不到,大概50%的机会收不到数据,socket一直处于read的状态,最后到超时退出,由于server端是产品,封闭的,所以只能在client端想办法,请大家救命啦!大家可以帮忙说说以前做的类似的java的client到c的server端通讯中出现的问题如何解决的。代码如下:      public String socketSend(String strIp, int iPort,int iTimeOut, String cmdStr)
      throws java.net.SocketException,java.net.UnknownHostException,java.io.IOException,Exception
      {
       String str="";
        if(cmdStr==null){
              return null;
        }
        java.net.Socket skt = null; 
        try
{
            skt = new java.net.Socket(strIp,iPort);
}catch(Exception e)
{
return "create false";
}
        skt.setSoTimeout( iTimeOut );      InputStream stream_In = null;
      OutputStream stream_Out = null;
      DataInputStream isr = null;
      String strResult  = "";      stream_In = skt.getInputStream();
      stream_Out = skt.getOutputStream();
      isr = new DataInputStream(stream_In);
  
      /*send the Data to the server*/
      PrintWriter writeBuf = new PrintWriter(stream_Out, true);
      writeBuf.print("ZRC   ZRS   000804000&&");
      writeBuf.flush();
      
      int icount = 0;
      try
  {
      while (icount<3)
      {  
        byte[] tmpbuff;
        tmpbuff = new byte[1024];
        isr.read(tmpbuff, 0, 1024);
        String strTmp = new String(tmpbuff);
        strResult  = strResult + strTmp.trim();
        
        icount++;
        System.out.println(strTmp.trim());
      }
  }finally
  {
      isr.close();
      stream_In.close();
      stream_Out.close();
      skt.close();
      skt= null;   }
      System.out.println("result ---->"+strResult);      return strResult;
      
      }

解决方案 »

  1.   

    请大家帮忙啊,我急死了。下面是报错信息:java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.io.DataInputStream.read(Unknown Source)
    at com.founder.util.ZrcClientAll.socketSend(ZrcClientAll.java:165)
    at com.founder.util.ZrcClientAll.main(ZrcClientAll.java:210)
      

  2.   

    可能timed out设置太短了
    不是这个原因,我设置了很大也是这样,而且server返回很实时的。
      

  3.   

    看不懂你读数据的时候为什么这么写,给个解释吧。有几个要点:
    1、你需要检查InputStream的read方法的返回值,这样才能知道是否正常返回以及读出的字节数。
    2、你用的read方法会阻塞,直到读满指定的那个字节数组或者EOF或者Socket关闭。
    3、你的异常应该是这样得到的:你指定的大小超过了服务端写入socket的数据长度,而服务端并没有主动关闭连接。
      

  4.   

    回复:weihthchk(Spectrum)
    我在read的时候,程序就阻塞在这里了,读不到数据的时候,就一直等在这里,但很奇怪的一个情况就是如果我用debug的方式去调试程序一步一步走下去,则可以很稳定的读出数据,只有在程序自己运行的时候读不出来.