java tcp粘包

 

原因:

因为TCP是基于流的,粘包可能是发送方造成的,也可能是接收言造成的,

 

 

解决方法:

一:: 可以每次发送同样大小的包,过大的包不予发送,过小的包,后面部分用固定的字符'\0'进行填充.

二:: 将流按字符处理,抽出一个字符做转义字符(通常Java用'\'来做转义字符,比如"\n"表示换行).假如就设'\'为转义字符,发送方如果流当中出现'\',就在后面在追加一个'\',如果包结束,则用'\'做包的结束符.这样,在接收方,若读取一个单独的'\'或者流结束,就标示前面的内容构成一个包,如果连续读取两个'\',就将两个'\'用一个'\'进行替换.这样,就可以保证原来包中的信息不变,同时也能区分出每个包了.

三:: 在发送方发送一个包的时候,先将这个包的长度发送给对方(一般是4个字节表示包长),然后再将包的内容发送过去.接收方先接收4个字节,看看包的长度,然后按照长度来接收包,这样就不会出错了.

 

 

一般我们用第3种方法。

 

refurl:http://bbs.csdn.net/topics/250027309

 

 

 

 

java nio讲解

http://www.ibm.com/developerworks/cn/education/java/j-nio/

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(java)