#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. Вы забыли закрыть файл.