微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Golang - Gob over TCP 的不稳定

如何解决Golang - Gob over TCP 的不稳定

我在使用 gob 进行 TCP 通信时遇到不稳定问题。

主要问题是,如果我“快速”传输数据,我会在服务器终止连接时出错,或者包根本没有到达服务器。现在,如果我在包之间添加 20 毫秒的延迟,一切都会按预期运行。

遗憾的是,我无法将其链接到 Playground,因为我在三个不同的库中运行它,但我已经插入了基本/罪魁祸首代码

我的猜测是,如果我没有延迟计时器,我将覆盖流。有什么想法吗?

更新:通过将接收器更换为 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)
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。