UDP сервер и клиент
Написал тестовый UDP сервер
func server() {
destinationAddress, err := net.ResolveUDPAddr("udp", "192.168.0.255:8080")
if err != nil {
fmt.Println(err)
return
}
connection, err := net.DialUDP("udp", nil, destinationAddress)
if err != nil {
fmt.Println(err)
return
}
defer connection.Close()
for {
connection.Write([]byte("1111"))
}
}
UDP клиент
func client() {
serverAddress, err := net.ResolveUDPAddr("udp", ":8080")
if err != nil {
fmt.Println(err)
return
}
connection, err := net.ListenUDP("udp", serverAddress)
if err != nil {
fmt.Println(err)
return
}
defer connection.Close()
for {
inputBytes := make([]byte, 1024)
connection.ReadFromUDP(inputBytes)
fmt.Println(string(inputBytes))
}
}
Получается у меня сервер рассылает broadcast сообщения внутри сети 192.168.0.0, клиенту для получения сообщения необходимо прочесть сообщение со своего порта 8080
Можно ли написать UDP сервер и клиента так, чтоб для получения информации клиентом ему необходимо было подключиться к определенному серверу? Если такое возможно, то приведите пример кода сервера и клиента
Ответы (1 шт):
Да, это возможно. Для того, чтобы клиент подключался к определенному серверу, необходимо изменить адреса, на которые сервер и клиент будут слушать соединения. В вашем коде сервер рассылает broadcast сообщения на адрес 192.168.0.255:8080, а клиент слушает соединения на адресе :8080. Чтобы клиент подключался к определенному серверу, нужно указать адрес сервера в качестве аргумента для функции DialUDP, которую использует клиент для подключения к серверу. Также сервер должен слушать соединения на определенном адресе, а не на адресе 192.168.0.255:8080.
Вот пример кода сервера и клиента, которые позволяют клиенту подключаться к определенному серверу.
Сервер:
func server() {
serverAddress, err := net.ResolveUDPAddr("udp", ":8080")
if err != nil {
fmt.Println(err)
return
}
connection, err := net.ListenUDP("udp", serverAddress)
if err != nil {
fmt.Println(err)
return
}
defer connection.Close()
for {
inputBytes := make([]byte, 1024)
_, clientAddress, err := connection.ReadFromUDP(inputBytes)
if err != nil {
fmt.Println(err)
continue
}
fmt.Println("Received message from", clientAddress)
fmt.Println(string(inputBytes))
// отправляем сообщение клиенту
_, err = connection.WriteToUDP([]byte("Hello, client!"), clientAddress)
if err != nil {
fmt.Println(err)
continue
}
}
}
Клиент:
func client() {
serverAddress, err := net.ResolveUDPAddr("udp", "server-address:8080")
if err != nil {
fmt.Println(err)
return
}
connection, err := net.DialUDP("udp", nil, serverAddress)
if err != nil {
fmt.Println(err)
return
}
defer connection.Close()
for {
_, err := connection.Write([]byte("Hello, server!"))
if err != nil {
fmt.Println(err)
continue
}
inputBytes := make([]byte, 1024)
_, err = connection.Read(inputBytes)
if err != nil {
fmt.Println(err)
continue
}
fmt.Println(string(inputBytes))
}
}
В этом примере сервер слушает соединения на адресе :8080, а клиент подключается к серверу с адресом server-address:8080. Обратите внимание, что в коде клиента нужно указывать адрес сервера, на который нужно подключаться