Allenxuxu / gev

🚀Gev is a lightweight, fast non-blocking TCP network library / websocket server based on Reactor mode. Support custom protocols to quickly and easily build high-performance servers.
MIT License
1.73k stars 194 forks source link

关于拆包 #15

Closed xhaoxiong closed 5 years ago

xhaoxiong commented 5 years ago

在关于拆解包的时候,unpacket函数接收的buf 依旧是需要按自己的协议来弄吧,还没有像netty 中的,有多个函数来支持分割那种吧(如按位、按分割等)

MrChang0 commented 5 years ago

@xhaoxiong 我们对unpack的设计和理解应该是从一个tcp原始数据 -> 我们可以用的最基本的数据包,将业务代码和原始报文处理分离。在里面就需要人们根据自己的需求去实现对应的unpack方法。换而言之,netty的各种decoder方法我们都可以基于我们的 unpack 去实现对应功能。 我这里举个例子,如果我们是按长度取数的话,在unpack里就可以 if buffer.virtrualLength() > 100去判断是否有足够的数据,再决定返回内容继续处理还是nil来等待下次数据到来。对于其他的decoder方法都可以类比实现(有机会我们会在库里提供对应实现方便使用)。 当然还有很多不完善和有问题的的地方,如果有更好的意见或者建议请提给我们。

itlabers commented 5 years ago

使用protobuf 序列化 , 通过多线程发报文的情况下,确实有粘报文体,代码如下: top, tail := buffer.PeekAll() data := append(top, tail...) log.Printf("request Host:[%s] msg:%x", c.PeerAddr(), data) var communication protobuf.Communication if e := proto.Unmarshal(data, &communication); e == nil { buffer.RetrieveAll() //逻辑处理 } else { log.Printf("Unmarshal error %v", e) }

communication Unmarshal error:proto: protobuf.Communication: illegal tag 0 (wire type 1)

MrChang0 commented 5 years ago

@itlabers 对于网络处理,一定要有方式去把“数据包”正确完整得取出来。对于你这种推荐在包头用2字节确认后续包长度,可以看ws对于数据包得处理。