作者回复: 问题很棒! 这里逐一回答一下: 1、2:网络字节序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。 3. 按照每个连接一个 Goroutine 的模型,不是并发写,不存在你说的问题。 4. go doc io.ReadFull一下,一般情况下,ReadFull都会读出你想要的长度的数据。你遇到错误时,ReadFull返回什么error呢。 [upd]: 发现问题了。是client的SetReadDeadline设置为1s,太短了。已改,请pull最新demo代码。
作者回复: 这里的确没必要。但是如果handle ack的goroutine在退出前需要执行一些清理工作,那么done就有必要了。否则可能会出现handle ack的goroutine没有执行完清理工作,send goroutine就退出的进而导致main goroutine退出前某handle ack的goroutine都没有执行完清理工作。
作者回复: 如果没有从quit中收到值,是会轮询啊。不过每次轮询的间隔是5s,程序会先在socket上做阻塞读,直到超时。超时后就回到for开始处,这也给了goroutine一个优雅退出的机会。
作者回复: 字节序是针对size>=2个字节的整型数而言的。payload对于该协议来说只是一个“字节序列”。协议的任务就是解析出payload,然后交给上层处理。
作者回复: 👍
作者回复: 可以直接使用[]byte类型,这里定义FramePayload更多为了强调其是frame的payload,仅此而已。
作者回复: “直接使用 framePayload ” 也没有问题。
作者回复: net.Conn可以理解为io.Reader这个接口类型的方法集合的超集,也就是说所有实现了net.Conn的类型,也都实现了io.Reader接口类型。
作者回复: 你指的是TestEncodeWithWriteFail这个unit test? 这个测试就是为了测试Encode失败的情况。只有err == nil的情况下,才不符合我们的预期。
作者回复: return语句最后的nil是代表err=nil,就是一切ok,没有报错。Encode函数的原型,最后一个返回值是一个error类型。