最近在开发银行业务时,遇到与工行的一个SOKCET问题。socket 服务端在收取客户端数据时,只有当客户端超时后,客户端才能将数据读取完毕。
找了好久明白其中的道理。
客户端发送数据:
<html>
<data>
<name>懒惰的勺子</name>
<age>30</age>
</data>
</html>
服务端在读取客户端数据时:
while ((i = input.read(b)) != -1) {
buff.append(new String(b, 0, i, "GBK"));
}
以上代码是读取数据的代码,但因为客户端没有明确的结束符号,所在服务端在读取数据时无法结束,一直在while中循环。
三种解决方案:
1、修改服务端代码如下:
1 while ((i = input.read(b)) != -1) { 2 buff.append(new String(b, 0, i, "GBK")); 3 if(buff.lastIndexOf("</html>")>-1){ 4 break; 5 } 6 }
注:在读取数据时,手工加入一个结束标记,这样就有条件的结束while循
2、客户端加入指定代码
os.write(strXml.getBytes("GBK"));
os.flush();
socket.shutdownOutput();
注:注意最后一句话,这句话的意思相当于为传输数据加入一个结束符,关闭输入流后就意味着输入结束,服务端就可以顺利的读完数据。
3、数据包前几位加入数据包长度(此类方法资源最小)
好多银行会在数据包的最前边几位加入长度字符,我们在读取数据时,先读前几位获取数据包长度,再向后读取指定数据包长度,强制结束。
这个问题困扰了好久,网上一些方法也说的不明不白。