登录
首页 >  Golang >  Go问答

使用Golang从TCP端口接收静态数据

来源:stackoverflow

时间:2024-03-14 15:30:15 303浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《使用Golang从TCP端口接收静态数据》,聊聊,我们一起来看看吧!

问题内容

我有一个进程,可以将数据突发发送到 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()) 
    }
}

以上就是《使用Golang从TCP端口接收静态数据》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>