默认
发表评论 6
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
IM服务端读取客户端数据包超过缓冲区长度的问题
阅读(43125) | 评论(6 收藏1 淘帖1
有一个问题是这样的,我自定义了一个包,采用定长的包头20个字节,里面包含了这一个包的长度信息,然后包体采用protobuf变长。服务端读这个tcp socket设置的buffer大小比如是1024byte,客户端发送了一个包加上包头包体大小是1100byte,这样服务端读取这个包就会读两次,第一次是1024byte第二次是76byte,而且这个1024byte和但是服务端每次收到一个包就会交给另一个线程来处理,这样的一个包就分两次交给了这个处理的线程,每次就会当做单独的包来处理,这样肯定是错误的。
我的想法是如果只是增大服务端的buffer大小 可能会造成内存占用过多,限制发包的大小这样不符合客户端的需求。只能从服务器入手的话,那就先读20个字节的包头然后解析出包的长度,再设置一个包体大小的buffer来读取剩下的包体,刚开始接触IM开发,很多地方不太懂,实在找不到相关的做法了,所以想再论文问问各位有没有更好的解决办法。

谢谢各位解答!

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:XMPP开源服务器Openfire组能支持多少人?下一篇:高性能的IM服务器端的数据持久化问题该怎么设计和处理

本帖已收录至以下技术专辑

推荐方案
评论 6
忘记写一点了,一般情况下客户端发的包都很小,如果按照先读包头再读包体的方法,感觉有点复杂,对于那些比较小的包就没有必要这么复杂的处理了,因此想问问有没有更好的办法
少年,不用着急,听哥给你讲。

TCP协议编程时,代码里比较麻烦的就是你说的这种情况:有时客户端包过大越出服务端一个包缓中的大小,就会被分成两次读写的问题。其实,这种问题更专业一点的叫法叫“粘包、缺包”,这是个很普遍的问题,你到网上查查你用的技术相关的解决TCP粘包和缺包问题代码就行了,大家都会遇到。

论坛里有一个MINA的例子,仅供参考:http://www.52im.net/thread-111-1-3.html,其它不管是纯socket的还是用nio框架的都很好找例子(如果是netty的话,貌似官方版本里就已经为你准备好解决方法了)。
引用:JackJiang 发表于 2016-10-26 11:08
少年,不用着急,听哥给你讲。

TCP协议编程时,代码里比较麻烦的就是你说的这种情况:有时客户端包过大 ...

群主正解。

楼主不需要自已去动手写这样的代码,虽然粘包问题处理起来不麻烦,但是如果没有经验的话容易整出bug,建议搜别人给出的经过考虑的代码,直接扒下来用就是了,大家都这么干。
签名: 国庆长假还没有缓过来,请让我静一静,产品狗死远点...
引用:IMDeveloper 发表于 2016-10-26 11:10
群主正解。

楼主不需要自已去动手写这样的代码,虽然粘包问题处理起来不麻烦,但是如果没有经验的话容 ...

谢谢解答!
引用:JackJiang 发表于 2016-10-26 11:08
少年,不用着急,听哥给你讲。

TCP协议编程时,代码里比较麻烦的就是你说的这种情况:有时客户端包过大 ...

谢谢群主解答!
引用:小白白白 发表于 2016-10-26 11:16
谢谢群主解答!

不用客气
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部