Я настроил сервер для ожидания TCP-соединения и чтения ввода от пользователя:
func main() {
err := godotenv.Load()
if err != nil {
log.Fatal(err)
}
server, err := net.Listen("tcp", ":"+os.Getenv("PORT"))
if err != nil {
log.Fatal(err)
}
log.Println("HTTP Server Listening on port :", os.Getenv("PORT"))
defer server.Close()
for {
conn, err := server.Accept()
if err != nil {
log.Fatal(err)
}
go handleConn(conn)
}
}
Проблема, с которой я столкнулся, связана с моей функцией handleConn
. Я хочу начать чтение ввода в горутину, потому что будет дополнительная обработка данных. Однако, когда я подключаюсь к своему серверу (nc localhost 9000
), мое соединение немедленно прерывается.
func handleConn(conn net.Conn) {
defer conn.Close()
io.WriteString(conn, "Enter a transaction:")
scanner := bufio.NewScanner(conn)
go func() {
for scanner.Scan() {
log.Println("User entered: ")
log.Println(scanner.Text())
}
}()
}
Я вижу сообщение Enter a transaction:
, но я не могу ничего ввести, потому что мое соединение немедленно прерывается, и меня отбрасывают обратно в терминал bash. Что я здесь делаю не так?
Обновлено: я следую этому руководству - https://github.com/mycoralhealth/blockchain-tutorial/blob/master/networking/main.go.
Я попытался переместить scanner.Scan()
за пределы горутины, и это работает, но в приведенном здесь примере кода он находится внутри горутины, и его пример работает. Почему это так?
Поскольку вы создаете горутину в своей функции handleConn
, ей не нужно ждать, пока что-нибудь вернется, поэтому отложенный conn.Close()
запускается и закрывает соединение. Возможно, вам потребуется запустить scanner.Scan()
из горутины, чтобы он блокировал ожидание ввода.
Вероятно, потому что github.com/mycoralhealth/blockchain-tutorial/blob/… блокируется при ожидании получения от этого канала, который горутина отправляет после получения пользовательского ввода.
Отлично, спасибо за объяснение, Карлос! Не понимали, что переменная, которую они использовали, на самом деле была каналом.
Я следовал этому руководству - github.com/mycoralhealth/blockchain-tutorial/blob/master/…. Он также помещает scanner.Scan () в горутину, я протестировал его код, и он работает. Вы знаете, почему это так?