1 回答
TA贡献1797条经验 获得超4个赞
您不需要心跳或固定大小的消息来确认交付。如果您需要确保交付,则需要应用程序级别的确认。如果您需要确保传递正确的消息,则需要包含一个唯一的消息 ID 以进行确认。如果您需要确保消息未更改,则需要包含校验和或 MAC。
在这里,您似乎在消息框架方面遇到了问题。虽然有很多方法来构建您的消息(简单的长度前缀、类型长度值、HTTP/1.1 等),但一个简单的解决方案是使用内置的json.Encoder和json.Decoder。
示例客户端,每秒发送一条“PING”消息:
type Message struct {
Payload string
}
func sendMessages(c net.Conn) {
message := Message{}
encoder := json.NewEncoder(c)
for i := 0; ; i++ {
message.Payload = fmt.Sprintf("PING %d", i)
err := encoder.Encode(message)
if err != nil {
log.Fatal(err)
}
time.Sleep(time.Second)
}
}
示例服务器:
type Message struct {
Payload string
}
func receiveMessages(c net.Conn) {
m := Message{}
decoder := json.NewDecoder(c)
for {
err := decoder.Decode(&m)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Received: %#v\n", m)
}
}
- 1 回答
- 0 关注
- 186 浏览
添加回答
举报