这个问题在这里已经有了答案:
Does ReadString() discard bytes following newline?
(1 个回答)
2年前关闭。
我有一个过程可以在文件之间暂停几分钟,将数据突发到 TCP 端口。我试过下面的代码,我在多个不同的帖子中看到过,但是输出中丢失了大量(多行)数据。我也试过用 C++ 编写类似的代码,结果相同。我发现获得所有输出的唯一可靠方法是使用 nc
进行监听。但我想以编程方式执行此操作,以便我可以使用突发之间的停机时间将输出分成多个文件。有没有人遇到过这个问题?我没有看到丢失数据的任何模式,就像跳过了一些随机行一样。我什至尝试将数据发送到 go chan,以查看 print 语句是否以某种方式减慢了执行速度。任何帮助,将不胜感激!
package main
import (
"bufio"
"fmt"
"net"
"os"
)
func main() {
arguments := os.Args
if len(arguments) == 1 {
fmt.Println("Please provide host:port.")
return
}
CONNECT := arguments[1]
c, err := net.Dial("tcp", CONNECT)
if err != nil {
fmt.Println(err)
return
}
for {
message, _ := bufio.NewReader(c).ReadString('\n')
fmt.Print(message)
}
}
最佳答案
不幸的是,我不能将评论标记为答案,但是正如 Cerise Limón 指出的那样 - 使用 bufio.Scanner() 是解决方案。功能代码如下。谢谢!
package main
import (
"bufio"
"fmt"
"net"
"os"
)
func main() {
arguments := os.Args
if len(arguments) == 1 {
fmt.Println("Please provide host:port.")
return
}
CONNECT := arguments[1]
c, err := net.Dial("tcp", CONNECT)
if err != nil {
fmt.Println(err)
return
}
scanner := bufio.NewScanner(c) // Declare outside of the loop
for scanner.Scan() {
fmt.Println(scanner.Text())
}
}
关于c++ - Golang 从 TCP 端口读取常量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61553595/