关于socket通讯close之后,网络不通的问题

tangfenghehe 发布于 2015/05/13 17:55
阅读 868
收藏 0

碰到一个问题,请大家帮帮忙! 这是一段本地(客户端)发送报文到服务端的代码;服务端接收到通知报文,会到客户端读取数据.现在碰到的问题是,执行finally中的内容后,客户端与服务端的网络就断开了,请大神指点指点!(备注一下,客户端与服务端的网络,是通过电话拨号连接的)

 

public Boolean send20002(String reportDate) throws Exception {
        
        Socket client = null;
        BufferedOutputStream outputStream = null;
        InputStream inputStream = null;
        BufferedReader bufferedReader = null;
        try {
            /** 报文结构:8位通讯头、报文头、MAC校验域、报文体 **/
            //8位通讯头
            String     len = "";
            //报文头
            String  sender = NumberUtil.addZeroForNum(Constants.UNS_SENDER, 20);//报文发起机构
            String  recver = NumberUtil.addZeroForNum(Constants.UNS_RECVER, 20);//接受机构
            Date      date = new Date();
            String sendDat = DateUtil.date2String(date, "yyyyMMdd");//报文发起日期
            String sendTim = DateUtil.date2String(date, "HHmmss");//报文发起时间
            String  txnCod = NumberUtil.addZeroForNum(Constants.REPORT_20002, 5);//业务交易码
            String  sLogNo = "00000000000000";//发起方业务流水号
            String header  = sender+recver+sendDat+sendTim+txnCod+sLogNo;
            //MAC校验域
            String  macLen = "0000";//MAC校验值长度
            String  macStr = macLen;
            //报文体
            String batchNo = reportDate+"0001";
            StringBuffer sb=new StringBuffer();
            sb.append(header+macStr+"\n");
            sb.append("\n");
            sb.append("<MSGBODY>");
            sb.append("<OrgCod>"+Constants.ORGCOD+"</OrgCod>");//机构编号
            sb.append("<BusTyp></BusTyp>");//业务类型(预留域)
            sb.append("<DskNo>"+batchNo+"</DskNo>");//批次号 8位日期+4位序号YYYYMMDDXXXX
            sb.append("<SumCnt></SumCnt>");//总笔数 预留域
            sb.append("<SumAmt></SumAmt>");//总金额 预留域
            sb.append("<SndFil>"+Constants.REPORT_NAME+"</SndFil>");//批量请求文件 
            sb.append("<RslFil></RslFil>");//批量结果文件
            sb.append("<UIPAddr>"+Constants.FTPIP+"</UIPAddr>");//上传文件的IP地址
            sb.append("<UUsrNam>"+Constants.FTP_USERNAME+"</UUsrNam>");//上传文件的用户名
            sb.append("<UPin>"+Constants.FTP_PASSWORD+"</UPin>");//上传文件的密码
            sb.append("<UpDir>"+Constants.FTPPATH+Constants.REPORT_20002+"/"+reportDate+"</UpDir>");//上传文件目录
            sb.append("</MSGBODY>");
            
            len = NumberUtil.addZeroForNum(String.valueOf(sb.length()),8);
            StringBuffer buff = new StringBuffer(len+sb.toString());
            log.info("20002报文:"+buff.toString());
            
            /** Socket发送报文 **/
            client = new Socket(Constants.BANK_COMM_IP, Integer.valueOf(Constants.BANK_COMM_PORT));
            outputStream=new BufferedOutputStream(client.getOutputStream());
            outputStream.write(buff.toString().getBytes("UTF-8"));
            outputStream.flush();
            
            System.out.println("20002应答报文开始");
            inputStream = client.getInputStream();
            bufferedReader = new BufferedReader(new InputStreamReader(  
                    inputStream));  
            String readData = bufferedReader.readLine(); 
            if (readData != null)  
            {  
                System.out.println(readData);
                return readData.contains(Constants.SUCCESS_MARK);
            } 
            System.out.println("20002应答报文结束");
            
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        } finally {
            try  
            {  
                if (outputStream != null)  
                    outputStream.close();  
                if (bufferedReader != null)  
                    bufferedReader.close();  
                if (inputStream != null)  
                    inputStream.close();  
                if (client != null)  
                    client.close();  
            } catch (IOException exception)  
            {  
                exception.printStackTrace();  
            }  
        }
        return null;    
    }


加载中
0
霍啸林
霍啸林

是下面这些语句造成的吧

outputStream.close();
bufferedReader.close(); 
inputStream.close();
client.close();



t
tangfenghehe
是的。 不知道你看明白了没!
0
songtzu
songtzu

一个短连接,执行完,主动关闭了,断开连接不是很正常么?

不知道你在描述什么。

songtzu
songtzu
回复 @tangfenghehe : 另外,在第三方设备上面分别ping客户端和服务端。
songtzu
songtzu
回复 @tangfenghehe : 网络状态分析好办,抓包看看网络状态。 在客户端或服务端ping对方。
t
tangfenghehe
回复 @songtzu : socket.close()关闭的是socket通信,不会影响两端之间的网络状况。
songtzu
songtzu
回复 @tangfenghehe : 你自己主动关闭网络连接,断开很正常啊
t
tangfenghehe
我的意思是这样的,正常情况下,socket通信是建立在客户端与服务器网络正常的情况下(ping 服务器/客户端IP 正常)。但是现在执行finally中的代码后,客户端与服务器的网络就断开了(ping 服务器/客户端IP 不通)
下一页
返回顶部
顶部