使用 gob 进行 TCP 通信时,我遇到了不稳定的问题。
主要问题是,如果我“快速”传输数据,我要么在服务器终止连接时出错,要么包根本没有到达服务器。现在,如果我在包之间添加 20 毫秒的延迟,一切都会按预期运行。
可悲的是,我无法将它链接到操场,因为我在三个不同的库中运行它,但我已经插入了基本/罪魁祸首代码。
我的猜测是,如果我没有延迟计时器,我将覆盖流。有任何想法吗?
更新:通过将接收器换成 bufio.NewReader(c.socket) 我实际上能够得到一个错误:“gob:未知类型 id 或损坏的数据”这有点像https://github.com/的相同问题golang/go/issues/1238#event-242248991
//client -> server, running as a goroutine
func (c *Client) transmitter() {
d := 20 * time.Millisecond
timer := time.NewTimer(d) //silly hack
for {
select {
case gd := <- c.broadcast:
<- timer.C
Write(c.socket, gd.Data, gd.NetworkDataType)
timer.Reset(d) //refreshing timer
}
}
}
//server <- client, running as a goroutine
func (c *client) receiver (s *Server){
for {
in, err := Read(c.socket)
if err != nil {
log.println(err)
}
//doing stuff
}
}
func Read(conn net.Conn) (GeneralData, error) {
in := GeneralData{}
if err := gob.NewDecoder(conn).Decode(&in); err != nil {
return in, err
}
return in, nil
}
func Write(conn net.Conn, data interface{}, ndt NetworkDataType) {
err := gob.NewEncoder(conn).Encode(GeneralData{ndt,data})
if err != nil {
log.Println("error in write: ", err)
}
}