这节开发的 UDP 服务器的目的是给它的 UDP 客户端返回从 1 到 1,000 的随机数。 这个程序命名为 UDPserver.go, 并分为 4 个部分。
UDPserver.go 的第一部分如下:
package mainimport("fmt""math/rand""net""os""strconv""strings""time")func random(min, max, int) int {return rand.Intn(max-min) + min}
UDPserver.go 的第二部分如下:
func main() {arguments := os.Argsif 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 的第三部分如下:
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 余下代码如下:
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-> STOPExiting UDP server!
客户端输出如下:
$ go run UDPclient.go localhost:8001The UDP server is 127.0.0.1:8001>> Hello!Reply: 156>> Another random number please :)Reply: 944>> Leaving...Reply: 491>> STOPExiting UDP client!