Skip to content

Commit

Permalink
Merge pull request hantmac#30 from themoonbear/13.5
Browse files Browse the repository at this point in the history
添加13.5
  • Loading branch information
hantmac committed Jan 27, 2019
2 parents e0dfd80 + 3f7398e commit a8fc046
Show file tree
Hide file tree
Showing 3 changed files with 171 additions and 0 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,8 @@
- [13.3 TCP 服务器](https://github.com/hantmac/Mastering_Go_ZH_CN/tree/master/eBook/chapter13/13.3.md)
- [13.3.1 另一个版本的 TCP 服务器](https://github.com/hantmac/Mastering_Go_ZH_CN/tree/master/eBook/chapter13/13.3.1.md)
- [13.4 UDP 客户端](https://github.com/hantmac/Mastering_Go_ZH_CN/tree/master/eBook/chapter13/13.4.md)
- [13.5 UDP 服务器](https://github.com/hantmac/Mastering_Go_ZH_CN/tree/master/eBook/chapter13/13.5.md)


-------
### GitBook
Expand Down
111 changes: 111 additions & 0 deletions eBook/chapter13/13.5.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
# **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 连接它,将产生如下输出:

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

客户端输出如下:

```shell
$ 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!
```
58 changes: 58 additions & 0 deletions eBook/examples/chapter13/UDPserver.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package main

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

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

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
}

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())

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
}
}
}

0 comments on commit a8fc046

Please sign in to comment.