为了账号安全,请及时绑定邮箱和手机立即绑定

将多个 tcp 流写入单个文件的最佳方法是什么?

将多个 tcp 流写入单个文件的最佳方法是什么?

Go
慕丝7291255 2022-07-11 16:25:49
我有多个二进制传入 tcp 流,不断地随机到达。我想将它们中的每一个写入单独的文件。这些文件应该包含从连接的初始打开到远程客户端关闭连接的所有内容。我在下面有这个,它似乎有效,但这是一种有效的方法吗?//error handling to be added laterfunc main() {    listen, _ := net.Listen("tcp4", ":8080")    defer listen.Close()    for {        connection, _ := listen.Accept()        defer connection.Close()        //"myfile.dat" to be replaced later with variable creating unique names        go handleConnection(connection, "myfile.dat")    }}func handleConnection(connection net.Conn, myFile string) {    outputFile, _ := os.Create(myFile)    defer outputFile.Close()    fileWriter := bufio.NewWriter(outputFile)    for {        serverConnReader := bufio.NewReader(connection)        io.Copy(fileWriter, serverConnReader)        break    }}
查看完整描述

1 回答

?
长风秋雁

TA贡献1757条经验 获得超7个赞

关于代码的一些注释:

  • 处理错误。

  • defer connection.Close()handleConnection. 否则,连接不会关闭,直到程序终止。

  • 将两行代码handleConnection移出for循环,丢弃for循环。循环没有做任何事情。

  • 添加defer fileWriter.Flush()以刷新写入器中缓冲的任何最后一位数据(但请参阅下一点)。

  • 要求文件直接从连接中复制。

这是代码:

func main() {


    listen, err := net.Listen("tcp4", ":8080")

    if err != nil {

        log.Fatal(err)

    }

    defer listen.Close()


    for {

        connection, err := listen.Accept()

        if err != nil {

            log.Fatal(err)

        }

        go handleConnection(connection, "myfile.dat")

    }

}


func handleConnection(connection net.Conn, myFile string) {

    defer connection.Close()

    outputFile, err := os.Create(myFile)

    if err != nil {

        log.Fatal(err)

    }

    defer outputFile.Close()

    _, err = outputFile.ReadFrom(connection)

    if err != nil {

        log.Fatal(err)

    }

}


查看完整回答
反对 回复 2022-07-11
  • 1 回答
  • 0 关注
  • 63 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信