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返回的长度。您将忽略读取的字节数。这是正确使用网络连接所必需的。您也可以无缘无故地同时写入每一行,并且可以开始交错写入。