Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/24.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.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
Go net.conn.Read()的[]字节不完整_Go - Fatal编程技术网

Go net.conn.Read()的[]字节不完整

Go net.conn.Read()的[]字节不完整,go,Go,我正在用Golang编写一个socket网站,我想用goroutine在客户端发送数据,并用goroutine在服务器上读取数据。 我的部分代码: 客户: buf := bufio.NewReader(file) var toWrite [][]byte for { w, _, end := buf.ReadLine() if end == io.EOF { break } toWri

我正在用
Golang
编写一个socket网站,我想用goroutine在客户端发送数据,并用goroutine在服务器上读取数据。 我的部分代码:

客户:

    buf := bufio.NewReader(file)
    var toWrite [][]byte
    for {
        w, _, end := buf.ReadLine()
        if end == io.EOF {
            break
        }
        toWrite = append(toWrite, w)
    }

    var wg sync.WaitGroup
    wg.Add(len(toWrite))

    for _, word := range toWrite {
        w := word

        go func() {
            defer wg.Done()
            conn.Write(append(w, byte('\n')))
            log.Info(string(w), "\n")
        }()

    }
    wg.Wait()

服务器:

    for {
        conn, err := listen.Accept()
        defer conn.Close()

        if err != nil {
            log.Fatal("accept err: ", err)
            break
        }
        go func() {
            data := make([]byte, 1024)
            for {
                _, err := conn.Read(data)
                if err != nil {
                    break
                }
                log.Info(string(data))
            }
        }()
    }

然而,当我在终端中运行它们时,有时它会显示一些不完整的单词

INFO[2019-10-15T23:36:11+08:00] increased
based
Up
p       // no "p" in my file
Up
Up
Up
Up

Up
Up
Up
Up
Up
Up
Up
(我在客户端打开的文件中有很多“Up”)
有办法修复它吗?

conn.read()返回它实际能够读入的字节数。从read()返回的内容取决于许多因素,包括tcp缓冲区等。如果要打印格式化文本,需要读入到“\n”,然后继续读取下一行。TCP提供来自对等端的连续数据流。您需要找到一种读取正确字节和正确字节数的方法。

输出来自客户端还是服务器?应用程序记录所有
数据,即使
conn.read(data)
可能只填充了部分
数据。使用调用conn.Read返回的长度。您将忽略读取的字节数。这是正确使用网络连接所必需的。您也可以无缘无故地同时写入每一行,并且可以开始交错写入。