天天看点

Socket编程 (异步通讯,解决Tcp粘包) - Part3

Socket编程 (异步通讯,解决Tcp粘包)

  从上一章的通讯中,我们发现如果使用Tcp连续发送消息会出现消息一起发送过来的情况,这样给我们编程造成一定的问题,给我们的信息解析造成一定的问题。那么这篇文章就将针对以上问题给出解决方案......

问题一般会出现的情况如下,假设我们连续发送两条两天记录("我是liger_zql"):

模拟发送示例:

Socket编程 (异步通讯,解决Tcp粘包) - Part3
Socket编程 (异步通讯,解决Tcp粘包) - Part3

接收端接受两条信息会出现如下三种情况:

  1.(1)我是liger_zql(2)我是liger_zql

  2.(1)我是liger_zql我是(2)liger_zql

  3.(1)我是liger_zql我是liger_zql

通过以上三种情况,显然2、3都不是我们想要的结果。那么如何处理这中情况呢?

解决方案:通过自定义协议...

我们可以以将信息以xml的格式发送出去,列入<protocol>content</protocol>通过正则匹配信息是否完整,如果不完整,我们可以先将本次接受信息缓存接受下一次信息,再次匹配得到相应的结果。

将信息对象转换成一定格式的xml字符串:

Socket编程 (异步通讯,解决Tcp粘包) - Part3
Socket编程 (异步通讯,解决Tcp粘包) - Part3

对接收的信息通过正则进行匹配处理:

Socket编程 (异步通讯,解决Tcp粘包) - Part3
Socket编程 (异步通讯,解决Tcp粘包) - Part3

然后将该定义的协议换换成信息对象,通过对象获取自己想要的信息。

Socket编程 (异步通讯,解决Tcp粘包) - Part3
Socket编程 (异步通讯,解决Tcp粘包) - Part3

最后运行结果如下:

Socket编程 (异步通讯,解决Tcp粘包) - Part3

好了Tcp粘包的问题我们解决了。下一章我们将解决Udp丢包的个人解决方案!