本文概述了银企平台实操课程中关于读取流失败的问题分析,主要聚焦于银行前置机/服务器的配置及通信异常场景。文中列举了多种通信错误及其原因,如端口未监听、路由问题、服务器关闭连接等,并提供了针对不同错误码和异常的解析。最后,提出了当确认为银行前置机问题时,引导银行分析日志,必要时使用抓包工具进行分析,并提供了部分银行前置机端口的默认值供参考。
【银企平台】实操课程汇总:
https://vip.kingdee.com/school/topic/69107813888248320?productLineId=8
目的:以下说明可以告诉你为什么看到读取流失败一般是银行前置机/银行服务器的问题。
前提:有一个重要的前提,就是你在银企平台的前置机配置处维护的前置机ip和对应协议端口(协议在银企平台每个前置机配置下方都会显示协议类型,如:http或 tcp)是否正确(这个要和银行确认好,是前置机ip和前置机服务器上开放的对应协议的端口,记住不要配成了银行那边的ip和端口)
一般通信架构为:
erp业务系统(星空/EAS/WISE/KIS等) -- 银企平台 --- 银行前置机(目前大部分银行都需要安装前置机)-- 银行
读取流失败各种场景报错解析(以下客户端可理解为银企平台,服务器是银行前置机/银行服务器):
1、Connection refuesd
当得到Connection refused: connect 异常的时候表示从本地客户端到目标IP地址的路由是正常的,但是该目标端口没有进程在监听,然后服务端拒绝掉了连接。这种问题一般就是服务器没有正常启动,或者客户端配置的请求端口错误。
当得到 Connection timed out: connect 的时候表示TCP路由不正常,原因有很多,可能是服务器无法ping通,可能是服务器(防火墙等)丢弃了该请求报文包,也可能是服务器应答太慢等
导致“Connection reset”的原因是服务器端因为某种原因关闭了Connection,而客户端依然在读写数据,此时服务器会返回复位标志“RST”,然后此时客户端就会提示“java.net.SocketException: Connection reset”
5、Server returned HTTP response code: 400 for URL
类似这种可以看到是因为服务端返回400 错误码(或者其他4XX,5XX),例如工商银行查余额报错举例:
Caused by: java.io.IOException: Server returned HTTP response code: 400 for URL: http://192.168.108.64:448/servlet/ICBCCMPAPIReqServlet
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1441)
at com.kingdee.bos.ebgateway.communication.protocol.impl.HttpClientImpl.getInputStream(HttpClientImpl.java:104)
6、Caused by: java.io.FileNotFoundException:http://..........
这种报错是因为服务端这个请求地址没有正常返回文件流,服务器内部异常导致,例如民生银行查余额报错举例:
at com.kingdee.bos.ebgateway.communication.protocol.impl.HttpClientImpl.getInputStream(HttpClientImpl.java:104)
7、java.net.SocketException: Unexpected end of file from server
“意外的文件结束”意味着远程服务器接受并关闭连接,而不发送响应。远程系统可能太忙,无法处理请求,或者有网络错误随机丢弃连接。
8、java.io.IOException: Bogus chunk size
at sun.net.www.http.ChunkedInputStream.processRaw(Unknown Source)
at sun.net.www.http.ChunkedInputStream.readAheadBlocking(Unknown Source)
at sun.net.www.http.ChunkedInputStream.readAhead(Unknown Source)
at sun.net.www.http.ChunkedInputStream.read(Unknown Source)
at java.io.FilterInputStream.read(Unknown Source)
看jdk源码可知,这里是由于服务端返回了非法的响应头,服务器或网络问题,资料参考:
https://stackoverflow.com/questions/8090817/java-io-ioexceptionbogus-chunk-size
总结:
问题1、上述说的前提配置确认没问题之后,且前置机配置测试连接能通(其实就是端口能通),但是查询余额还是报错,什么原因呢?
答:那么报错肯定不会是上述情况1(Connection refuesd),也就是说现在请求可以正常送达到对应端口的前置机服务器进程,后面就是前置机服务器处理的问题。
问题2、这时候有人会问,那就算证明是银行前置机那边的问题,应该如何引导银行那边分析呢?
答:银行前置机(银行服务器) 那边一般情况 也会有日志(如果没有那我无话可说,让银行自己折腾吧),他们收到请求肯定会有日志打印,让银行技术分析其具体原因。
补充:不是说让银行技术分析就一定是银行那边的问题。
让银行分析是因为服务端的报错,银企平台作为客户端没法看到问题真实原因,需要在服务端来分析出具体原因,然后如果原因是银企平台这边请求报文中哪里不对导致那么告知于银企平台技术再配合分析处理即可。
如果沟通仍然无果,请在银企平台和银行前置机服务器上分别安装wireshark软件对本地连接的网卡进行抓包,测试完成停止抓包,保存两边的抓包文件(.pcapng)给到我们分析。
补充2:
某些银行前置机开放的端口有默认值,经验积累举例,仅供参考:
招商银行前置机http服务器端口:8080
中国工商银行前置机签名服务器端口:449;http交易服务器端口:448 另外记得证书ID需要配置一下
上海浦东发展银行前置机签名服务器端口:4437;http交易服务器端口:5775
交通银行前置机http服务器端口:8899
中国农业银行公网版tcp服务器端口:15999
中国建设银行外联版tcp服务器端口:12345
光大银行直连版http服务器端口:8000
中国银行BOCNET版http服务器端口:8080
民生银行3.0版http服务器端口:8080
兴业银行http服务器端口:8007
中信银行http服务器端口:6789