Кажется, здесь есть две проблемы:
1) UDP-сервер
Ваш вопрос описывает проблему, когда клиент не может сделать второй запрос к серверу.
Я использовал простой эхо-сервер UDP, а также код, который вы разместили для сервера и клиента, и не могу воспроизвести проблему (я все еще могу сделать несколько запросов к серверу), поэтому я подозреваю, что это связано с Используемый вами UDP-сервер (код, который я не вижу в этом вопросе).
Я предлагаю вам попробовать это на простом UDP-сервере, который просто выводит сообщения обратно:
package main
import (
"fmt"
"net"
)
func main() {
conn, _ := net.ListenUDP("udp", &net.UDPAddr{IP:[]byte{0,0,0,0},Port:1175,Zone:""})
defer conn.Close()
buf := make([]byte, 1024)
for {
n, addr, _ := conn.ReadFromUDP(buf)
conn.WriteTo(buf[0:n], addr)
fmt.Println("Received ", string(buf[0:n]), " from ", addr)
}
}
2) Дополнительная новая строка в TCP-клиенте
Используя точный код, который вы разместили, и тот сервер UDP, который я разместил выше, похоже, это работает, но вывод, который я получаю на клиенте, не тот, который я ожидал.
Кажется, это вызвано второй проблемой, которая является этой строкой в клиенте:
// send to socket
fmt.Fprintf(conn, text + "\n")
Конец строки, которую вы отправляете, заставляет сканер, который вы используете на сервере, читать две строки (текст, который вы отправляете, а затем пустую строку), заставляя сервер записывать две строки обратно клиенту.
Но в клиенте вы читаете только одну строку, поэтому вторая строка кажется ожидающей, пока клиент не подключится снова.
Это можно исправить, просто изменив это на:
// send to socket
fmt.Fprintf(conn, text)
Выход для фиксированного кода
Используя этот UDP-сервер и внося эти изменения в клиент, я получаю вывод при запуске всех трех компонентов:
Text to send: first msg
Message from server: first msg
Text to send: second msg
Message from server: second msg
Text to send: third msg
Message from server: third msg
Text to send:
Затем я могу остановить только клиент, запустить его снова, и он продолжит работать:
Text to send: fourth msg
Message from server: fourth msg
Text to send:
Дополнительные примечания
О двух других строках в коде клиента, которые используют переводы строки:
// read in input from stdin
fmt.Print("Text to send: ")
text,_ := reader.ReadString('\n')
Эта новая строка нужна там, потому что когда вы вводите текст с помощью стандартного ввода, вы заканчиваете строку, используя клавишу ввода (и, таким образом, заканчиваете строку новой строкой), поэтому строка должна читаться до символа \n
.
message, _ := bufio.NewReader(conn).ReadString('\n')
Эта причина необходима, когда сервер записывает ответ на соединение, которое он делает w.WriteString(response+"\n")
. Таким образом, ответ включает в себя новую строку в конце, и вы должны прочитать эту строку при чтении текста ответа.