Go 将多个tcp流写入单个文件的最佳方式是什么?
我有多个二进制传入tcp流,在随机时间连续到达。我想把它们都写到单独的文件中。这些文件应该包含从最初打开连接到远程客户端关闭连接的所有内容 我有下面这个,它似乎工作,但这是一个有效的方式这样做吗Go 将多个tcp流写入单个文件的最佳方式是什么?,go,Go,我有多个二进制传入tcp流,在随机时间连续到达。我想把它们都写到单独的文件中。这些文件应该包含从最初打开连接到远程客户端关闭连接的所有内容 我有下面这个,它似乎工作,但这是一个有效的方式这样做吗 //error handling to be added later func main() { listen, _ := net.Listen("tcp4", ":8080") defer listen.Close() for {
//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
- 将
中的两行代码移出for循环,并放弃for循环。循环没有做任何事情handleConnection
- 添加
,以刷新写入程序中缓冲的任何最后一位数据(但请参见下一点)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)
}
}
你忘了关闭文件。