Каков наилучший способ записи нескольких потоков tcp в отдельные файлы?

#go

#Вперед

Вопрос:

У меня есть несколько двоичных входящих потоков 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
    }
}
  

Ответ №1:

Некоторые замечания по коду:

  • Обработка ошибок.
  • defer connection.Close() в handleConnection . В противном случае соединение не будет закрыто до завершения работы программы.
  • Переместите две строки кода в handleConnection out из цикла for и отмените цикл for. Цикл ничего не делает.
  • Добавьте defer fileWriter.Flush() для очистки любой последний бит данных, буферизованный в writer (но см. Следующий пункт).
  • Попросите файл скопировать напрямую из соединения.

Вот код:

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

Комментарии:

1. Вы забыли закрыть файл.