各位,小弟目前正开发一个项目,涉及到java后台和前置机(C开发的)间的通讯。
当数据量不大时(6000B左右)时正常,但当数据超过13000B时,每次java后台接收前置机返回的数据时都抛出connection reset异常(debug时发现为 in.readLine()时异常)。不知真正原因在哪里(下面为java后台相关代码),急盼高人的解答。急,在线等……
        ……
        //建立网络连接
        Socket client;
        try
        {
            client = new Socket(ip, Integer.parseInt(port));            int soTimeOut = Integer.parseInt(timeOut);            if (soTimeOut > 0)
            {
                //设置超时毫秒数
                client.setSoTimeout(soTimeOut);
            }            BufferedReader in = new BufferedReader(new InputStreamReader(client
                    .getInputStream()));            PrintWriter out = new PrintWriter(client.getOutputStream());
            //增加报头信息 客户现场
            String branch = DataTools.getBranchByIP(ip);
            
            String size = String.valueOf(xmlString.getBytes().length);
            String titleXml = com.neusoft.finance.common.DataTools.leftMendStringLen(size,8,' ');
            String branchXml= com.neusoft.finance.common.DataTools.leftMendStringLen(branch,8,' ');
            
            xmlString = titleXml.concat(branchXml).concat(xmlString);
            log.info("发送的xml:"+xmlString);
            out.println(xmlString);            out.flush();            //前置机返回数据
            returnString = in.readLine();            
            log.info("返回的xml:"+returnString);
            client.close();
        }
        catch (NumberFormatException e)
        {
            ExcAct.doHandle(e);
            throw new SystemException(e);
        }
        catch (UnknownHostException e)
        {
            ExcAct.doHandle(e);
            throw new SystemException(e);
        }
        catch (IOException e)
        {
            ExcAct.doHandle(e);
            throw new SystemException(TradeConstCodeList.CONNECT_TIME_OUT,e,ip);
        }
        catch (Exception e){
         ExcAct.doHandle(e);
         throw new SystemException(e);
        }
     ……

解决方案 »

  1.   

    东软!!哈哈!!BufferedReader(Reader in, int sz) 使用这个构造一次。报文接受很严格。过大过小都不行。即使南天平台也基本是一个固定方式。这可能和你的硬件配置有关。其次在增加报头信息交互客户现场应该延迟处理。sleep 几百毫秒。是否in读取操作之前影响了client的状态?
      

  2.   


    莫非你也是?呵呵
    “BufferedReader(Reader in, int sz) 使用这个构造一次”,你是指对BufferedReader in = new BufferedReader(new InputStreamReader(client 
                        .getInputStream()))?
      

  3.   

    我可不是东软人!意思是你设置一下默认缓冲区大小,参照JDK DOC!
      

  4.   

    防火墙有啊。但如我上面说的,当数据量不大时(6000B左右)时正常,但当数据超过13000B时就抛connection reset 异常了。
      

  5.   

    http://hi.baidu.com/injava/blog/item/5e9525fa84e70918a9d31177.html
    看下这个吧
      

  6.   

    Connection reset和Connection reset by peer到底有何区别啊?搞糊涂了
      

  7.   

    这个问题我自己已经解决了,是服务器端发送完后立马就关闭了连接,而客户端还在读数据而导致了connection reset异常。解决方法为在服务器端发送数据后Sleep段时间,比如2秒,以等待客户端读完数据发送了关闭请求后才关闭连接。
    结贴去了。