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

Go 将多个tcp流写入单个文件的最佳方式是什么?,go,Go,我有多个二进制传入tcp流,在随机时间连续到达。我想把它们都写到单独的文件中。这些文件应该包含从最初打开连接到远程客户端关闭连接的所有内容 我有下面这个,它似乎工作,但这是一个有效的方式这样做吗 //error handling to be added later func main() { listen, _ := net.Listen("tcp4", ":8080") defer listen.Close() for {

我有多个二进制传入tcp流,在随机时间连续到达。我想把它们都写到单独的文件中。这些文件应该包含从最初打开连接到远程客户端关闭连接的所有内容

我有下面这个,它似乎工作,但这是一个有效的方式这样做吗

//error handling to be added later

func 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
    }
}

关于代码的一些注释:

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)
    }
}
  • 处理错误
  • 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)
    }
}

你忘了关闭文件。