13.5 UDP 服务器
这节开发的 UDP 服务器的目的是给它的 UDP 客户端返回从 1 到 1,000 的随机数。 这个程序命名为 UDPserver.go, 并分为 4 个部分。
UDPserver.go 的第一部分如下:
1
package main
2
3
import(
4
"fmt"
5
"math/rand"
6
"net"
7
"os"
8
"strconv"
9
"strings"
10
"time"
11
)
12
13
func random(min, max, int) int {
14
return rand.Intn(max-min) + min
15
}
Copied!
UDPserver.go 的第二部分如下:
1
func main() {
2
arguments := os.Args
3
if len(arguments) == 1 {
4
fmt.Println("Please provide a port number!")
5
return
6
}
7
PORT := ":" + arguments[1]
8
9
s, err := net.ResolveUDPAddr("udp4", PORT)
10
if err != nil {
11
fmt.Println(err)
12
return
13
}
Copied!
UDPServer.go 的第三部分如下:
1
connection, err := net.ListenUDP("udp4", s)
2
if err != nil {
3
fmt.Println(err)
4
return
5
}
6
7
defer connection.Close()
8
buffer := make([]byte, 1024)
9
rand.Seed(time.Now().Unix())
Copied!
对于 UDP 网络,net.ListenUDP() 函数作用类似于 net.ListenTCP()
UDPserver.go 余下代码如下:
1
for {
2
n, addr, err := connection.ReadFromUDP(buffer)
3
fmt.Print("->", string(buffer[0:n-1]))
4
5
if strings.TrimSpace(string(buffer[0:n])) == "STOP" {
6
fmt.Println("Exiting UDP server!")
7
return
8
}
9
10
data := []byte(strconv.Itoa(random[1, 1001]))
11
fmt.Printf("data: %s\n", string(data))
12
_, err = connection.WriteToUDP(data, addr)
13
if err != nil {
14
fmt.Println(err)
15
return
16
}
17
}
18
}
Copied!
ReadFromUDP() 函数允许您使用一个字节切片缓冲区从 UDP 连接读取数据。
执行 UDPserver.go 并用 UDPclient.go 连接它,将产生如下输出:
1
$ go run UDPserver.go 8001
2
-> Hello!
3
data: 156
4
-> Another random number please :)
5
data: 944
6
-> Leaving...
7
data: 491
8
-> STOP
9
Exiting UDP server!
Copied!
客户端输出如下:
1
$ go run UDPclient.go localhost:8001
2
The UDP server is 127.0.0.1:8001
3
>> Hello!
4
Reply: 156
5
>> Another random number please :)
6
Reply: 944
7
>> Leaving...
8
Reply: 491
9
>> STOP
10
Exiting UDP client!
Copied!
Last modified 2yr ago
Copy link