Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Golang-TCP上的Gob不稳定性_Go_Tcp_Gob - Fatal编程技术网

Golang-TCP上的Gob不稳定性

Golang-TCP上的Gob不稳定性,go,tcp,gob,Go,Tcp,Gob,在使用gob进行TCP通信时,我遇到了一个不稳定的问题 主要的问题是,如果我将数据“传输到fast”,我要么在服务器终止连接时出错,要么包根本没有到达服务器。现在,如果我在两个包之间添加20毫秒的延迟,那么一切都会按预期运行 遗憾的是,我无法将此链接到Playerd,因为我在三个不同的库中运行它,但我插入了基本/罪魁祸首代码 我的猜测是,如果我没有延迟计时器,我将覆盖流。有什么想法吗 更新:通过将接收器换成bufio.NewReader(c.socket),我实际上能够得到一个错误:“gob:未

在使用gob进行TCP通信时,我遇到了一个不稳定的问题

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

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

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

更新:通过将接收器换成bufio.NewReader(c.socket),我实际上能够得到一个错误:“gob:未知类型id或损坏的数据”,这有点像

//客户端->服务器,作为goroutine运行
func(c*客户端)变送器(){
d:=20*时间。毫秒
timer:=time.NewTimer(d)//愚蠢的黑客
为了{
挑选{

案例gd:=您反复使用新解码器包装相同的连接,每个解码器可能都有缓冲数据。根据我的研究,使用新解码器这样做应该可以。但是,我正在接近使用bufio.ReadWrite的工作系统。如果该研究包括阅读文档,您可以看到
NewDec订单
声明:“如果
r
也没有实现
io.ByteReader
,它将被包装在
bufio.Reader
”中。
//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)
    }
}