100元话费+500莫元咨询TCP 黏包服务器怎么处理的问题

2020-01-01 17:38发布

本帖最后由 lindabell 于 2017-1-12 16:42 编辑

事情是这样的,我做了一台设备可以通过app控制,也可以上报温湿度等信息的;使用透传的WIFI模块。
设备从关机到开机会发生很多状态变化,都会上传这些状态;通过串口发送到WIFI模块,然后到服务器。
在服务器接收那边就会出现黏包的现象,由于黏包服务器处理起来非常耗时,应该是3~4s的数据到了数据库看居然花了26s左右。

另外我数据的格式是这样的 55AA+MAC+len+CRC8,黏包就是多包数据被TCP封成一个包了。

希望做个服务器 (要专业做服务器的,不是专业的意见不接受)的坛友,给个意见这样的黏包服务器能不能处理,怎样处理?

注:我是做单片机软件的对服务器一点不懂,但是我需要的是专业的回答,另外回答的不错的;可能还会付费咨询更加详细的,报酬方面可谈。


修改:增加到200元话费,高手希望提示一下
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
88条回答
semonpic
1楼-- · 2020-01-07 17:24
我很负责任的告诉你,能做的了。看看我的数据包格式
0xa5a5xxx; xxxx表示协议版本
packetLen ;数据包总长度。
aa
bb
cc
.. ..以上是数据包头,下面是附加数据
accachLen ;附加数据长度
data;附加数据数组
farmerzhangdl
2楼-- · 2020-01-07 19:49
黏包的原因不必找,任何服务器都存在黏包的可能,这是TCP协议决定的。除了黏包,TCP还会分包,就是你接到的数据未必是一个整包,可能存在一包分多次才能接受完整的情况。处理的方法很简单,就是在服务器端对接收到的数据进行缓存,然后另外一个线程负责解析这些数据,典型的生产者消费者模式。你这个协议做的有问题,通常有两种方法,一是先发数据长度,服务器端根据长度来收后边的数据,收够了就认为是一包完整的数据,然后再收长度,再收数据,规定好数据长度的固定字节,比如说2字节一般。第二种方法就是指定一个帧开头和结尾,中间的数据全部做16进制变换,可以避免数据与帧开头结尾冲突,也可以采用转义字符的方式处理。你你这种格式很有可能碰到数据与开头相同的问题,黏包的时候就分不开了。
leafstamen
3楼-- · 2020-01-07 23:53
黏包了就拆包啊,收到数据后先摘出来一包的数据,如果还有没处理的字节就再摘出一包数据来,直至本次收到的数据全处理完成。
mark82
4楼-- · 2020-01-08 00:09
 精彩回答 2  元偷偷看……
ljt80158015
5楼-- · 2020-01-08 03:47


应用层把黏包解开  不就可以了吗?     我们都是这样做的


javenreal
6楼-- · 2020-01-08 06:48
TCP是流式的,就像自来水水流过水管。 实际上并没有“包”的概念。  所谓的“黏包”是伪命题。

包,你可以自己封装。 每“一堆”数据加上头尾,做成一个所谓的“包”,服务器收到后根据头尾解析。在头中包含长度,这样更可靠。

不过服务器也要写得好才行。比如你一个包是20字节发了2个包。有可能服务器第一次收到了30字节,是第一个包以及第二个包的前前半部分。 然后过了一会儿才收到最后10字节。

服务器必须要能可靠的处理这种情况,才能长期稳定工作。

一周热门 更多>