关于TCP粘包和半包的处理

今日,在编程过程中需要在局域网内不同的电脑间传输文件,遇到了TCP协议的粘包和半包现象。经过思考和借鉴,找到了一个比较好的解决方法。因为在传输文件时要先传输文件名和文件大小,然后再传输文件,所以电脑间的应用程序实现了一个小的协议。这个协议需要解码TCP传输的内容。在有粘包和半包的现象时,会发现有时候文件名和大小以及文件内容混在了一块,有时候,文件内容没有传完,就显示接收到的数据包已经小于设定的缓冲区长度了。

         解决办法,协议不变,将发送和接受的数据设为定长的一帧帧的数据,比如1024个字节,比如文件名和文件大小需要先传,虽然内容不满1024个字节,但通过增加特定字符,使内容填满一个1024的帧,然后发送;文件内容传输的时候也是一1024个字节为一个发送帧大小,文件末尾不足1024个字节时,也用字符将1024个字节填满,然后发出。接收端按照1024个字节的帧大小提取每一帧。在开始接受到的第一帧中提取文件名和文件大小,然后继续接受文件内容,并利用第一帧获得的文件大小来判断是否该结束写入,应写入多少字节。

         通过这个办法,较好的解决了TCP协议粘包和半包的问题。这个方法最关键的一点就是发送方和接受方使用相同的帧长,这样就把问题解决了。这个解决方法比较简单一些,容易实现。

展开阅读全文

没有更多推荐了,返回首页