forked from hantmac/Mastering_Go_ZH_CN
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request hantmac#30 from themoonbear/13.5
添加13.5
- Loading branch information
Showing
3 changed files
with
171 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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! | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} | ||
} | ||
} |