UDP 服务器

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

UDPserver.go 的第一部分如下:

  1. package main
  2. import(
  3. "fmt"
  4. "math/rand"
  5. "net"
  6. "os"
  7. "strconv"
  8. "strings"
  9. "time"
  10. )
  11. func random(min, max, int) int {
  12. return rand.Intn(max-min) + min
  13. }

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. s, err := net.ResolveUDPAddr("udp4", PORT)
  9. if err != nil {
  10. fmt.Println(err)
  11. return
  12. }

UDPServer.go 的第三部分如下:

  1. connection, err := net.ListenUDP("udp4", s)
  2. if err != nil {
  3. fmt.Println(err)
  4. return
  5. }
  6. defer connection.Close()
  7. buffer := make([]byte, 1024)
  8. rand.Seed(time.Now().Unix())

对于 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. if strings.TrimSpace(string(buffer[0:n])) == "STOP" {
  5. fmt.Println("Exiting UDP server!")
  6. return
  7. }
  8. data := []byte(strconv.Itoa(random[1, 1001]))
  9. fmt.Printf("data: %s\n", string(data))
  10. _, err = connection.WriteToUDP(data, addr)
  11. if err != nil {
  12. fmt.Println(err)
  13. return
  14. }
  15. }
  16. }

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!

客户端输出如下:

  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!