Golang从TCP端口读取常量数据[重复]。

问题描述 投票:0回答:1

我有一个进程,它向一个TCP端口连续输出数据,文件之间有几分钟的暂停。我试过下面的代码,我在多个不同的帖子中看到过,但是大量的数据(多行)从输出中丢失。我也试过用C++写类似的代码,结果一样。我找到的唯一可靠的方法是使用下面的方法监听所有的输出。nc 但我想用编程的方式来完成这个任务,这样我就可以利用突发事件之间的停机时间来将输出分离成多个文件。以前有人遇到过这个问题吗?我没有看到任何数据缺失的模式,只是好像一些随机的行被跳过了。我甚至尝试着将数据发送到一个go chan,看看是否打印语句以某种方式降低了执行速度。如果有任何帮助,我将感激不尽

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)
    }
}
c++ bash sockets go netcat
1个回答
-1
投票

不幸的是,我不能把评论标记为答案,然而正如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()) 
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.