在园子里看到很多关于socket的文章,但大多都是关于socket封装相关,似乎都没有提到关于消息并发的情况,比如:
启用了一个监听来等待数据(同步或异步随意),当远程有一消息到达,我们将获取此消息进行处理,此时如果这是一个耗时很长的过程,长到远程又有多条消息到达则到达的消息会累积,而当你处理完之前的消息后再次获取消息则将一次性获得所有累积的消息(分包重组),当然这种重组是区分IP的,即不同地址过来的消息累积会分开进行重组为一条消息……此情况在同步或异步情况均会产生,而在同步情况产生的更明显。
对于这个问题,我目前的解决方式是只能通过利用正则去分析消息拆解后进行循环处理,因为通常实际应用中我们的消息都是有一定的格式规范的,比如消息头有若干个1,消息尾有若干个2等。那么各位高手在实际开发中有没有遇到这种情况?又是如何去处理这种并发底层协议分包重组问题的呢?
如果你用TCP,分包重组的过程在TCP协议中就完成了,不会存在你说的那种情况。
如果你用UDP,是会有这种情况,你需要设计类似停等或者滑窗协议来处理。
另外你说的长时间消息处理导致消息阻塞,建议将你将目前的接受和分包重组的线程和你的业务线程分开,接受进程对包重组后缓存在本地消息队列,然后设计一个发送线程从消息队列中读取这些消息再通过同步或者异步消息发送给业务线程。
会阻塞吗