> For the complete documentation index, see [llms.txt](https://wskdsgcf.gitbook.io/mastering-go-zh-cn/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wskdsgcf.gitbook.io/mastering-go-zh-cn/13.0/13.5.md).

# 13.5 UDP 服务器

这节开发的 UDP 服务器的目的是给它的 UDP 客户端返回从 1 到 1,000 的随机数。 这个程序命名为 UDPserver.go， 并分为 4 个部分。

UDPserver.go 的第一部分如下：

```go
package main

import(
    "fmt"
    "math/rand"
    "net"
    "os"
    "strconv"
    "strings"
    "time"
)

func random(min, max, int) int {
    return rand.Intn(max-min) + min
}
```

UDPserver.go 的第二部分如下：

```go
func main() {
    arguments := os.Args
    if len(arguments) == 1 {
        fmt.Println("Please provide a port number!")
        return
    }
    PORT := ":" + arguments[1]

    s, err := net.ResolveUDPAddr("udp4", PORT)
    if err != nil {
        fmt.Println(err)
        return
    }
```

UDPServer.go 的第三部分如下：

```go
    connection, err := net.ListenUDP("udp4", s)
    if err != nil {
        fmt.Println(err)
        return
    }

    defer connection.Close()
    buffer := make([]byte, 1024)
    rand.Seed(time.Now().Unix())
```

对于 UDP 网络，`net.ListenUDP()` 函数作用类似于 `net.ListenTCP()`。

UDPserver.go 余下代码如下：

```go
    for {
        n, addr, err := connection.ReadFromUDP(buffer)
        fmt.Print("->", string(buffer[0:n-1]))

        if strings.TrimSpace(string(buffer[0:n])) == "STOP" {
            fmt.Println("Exiting UDP server!")
            return
        }

        data := []byte(strconv.Itoa(random[1, 1001]))
        fmt.Printf("data: %s\n", string(data))
        _, err = connection.WriteToUDP(data, addr)
        if err != nil {
            fmt.Println(err)
            return
        }
    }
}
```

`ReadFromUDP()` 函数允许您使用一个**字节切片**缓冲区从 UDP 连接读取数据。

执行 UDPserver.go 并用 UDPclient.go 连接它，将产生如下输出：

```
$ go run UDPserver.go 8001
-> Hello!
data: 156
-> Another random number please :)
data: 944
-> Leaving...
data: 491
-> STOP
Exiting UDP server!
```

客户端输出如下：

```
$ go run UDPclient.go localhost:8001
The UDP server is 127.0.0.1:8001
>> Hello!
Reply: 156
>> Another random number please :)
Reply: 944
>> Leaving...
Reply: 491
>> STOP
Exiting UDP client!
```
