标签:style ar 使用 for sp 数据 on 问题 代码
很惭愧TCP/IP协议卷一还没有看完,实在是毅力问题。
在使用TCP的时候一向怀疑数据是否能够完整接受,先发送一个"hello"字符串后再发送一个“world”字符串,可能就会在你不知道的时候底层开始进行包的重组,重组成
"hellowo"和"rld"两个字符串。特别是在数据发送频繁,和网络延时的时候.如果你在接受方直接recv()缓冲区所有数据的时候,这种情况尤为常见。
我的解决方法是在程序内部使用一个栈区来解决这个问题,当每当socket缓冲区有数据的时候就将数据入栈,然后通过判断栈的长度或者栈中数据来判断是否完整接受了一次数据。如果栈中有了一个完整了发送方发送的数据(这个前提是双方协定好每次数据的固定长度)那么就将栈底的这些数据读取,然后重新排列一下栈区。
python描述
while True: ... ... receive=currentarmsocket.recv(1024) for i in receive: stack.append(i) if len(stack)<8: continue if len(stack)>10240: stack=list() break receive=stack[0:8] stack=stack[8:(len(stack)-8)] ... ...
上面这段代码能够很好地工作,然后保证到达地下的receive是一个完整的来自发送方发送的数据。
标签:style ar 使用 for sp 数据 on 问题 代码
原文地址:http://my.oschina.net/000quanwei/blog/337230