Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于拆包 #15

Closed
xhaoxiong opened this issue Nov 1, 2019 · 3 comments
Closed

关于拆包 #15

xhaoxiong opened this issue Nov 1, 2019 · 3 comments

Comments

@xhaoxiong
Copy link

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

@MrChang0
Copy link

MrChang0 commented Nov 1, 2019

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

@itlabers
Copy link

itlabers commented Nov 6, 2019

使用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
Copy link

MrChang0 commented Nov 7, 2019

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants