@(go语言 黑马)[GO语言]
UDP通信
- 题目:编写UDP通信的并发服务器和客户端
- 知识点:UDP通信
- 逻辑思路(详细的步骤在代码注释中):
_1. 发送端 将文件名发送给 接收端
_2. 接收端 收到文件名后,发送 "ok" 信号给 发送端
_3. 发送端 收到 "ok" 信号后,开始传输文件内容给 接收端
_4. 接收端 接收并保存文件内容
服务器代码如下:
package main
import "fmt"
func main() {
UdpCommunication()
}
//UDP服务器
func UdpCommunication() {
//建立UDP客戶端连接,注意:返回的是服务器地址,不再是listener,不需要监听
clientAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8002")
if err != nil {
fmt.Println("net.ResolveUDPAddr err:", err)
return
}
fmt.Println("clientAddr",clientAddr)
//建立通信socket,使用服务器地址建立
conn, err := net.ListenUDP("udp", clientAddr)
if err != nil {
fmt.Println("net.ListenUDP err:", err)
return
}
defer conn.Close()
buf := make([]byte, 4096)
for {//循环处理客户端数据
n, UdpAddr, err := conn.ReadFromUDP(buf)//返回值多了一个客户端地址
//fmt.Println("UdpAddr:",UdpAddr)//打印客户端地址
if err != nil {
fmt.Println("conn.ReadFromUDP err:", err)
return
}
fmt.Println("读到客户端数据:", string(buf[:n]))
timeNow := time.Now().String()//现在时间
conn.WriteToUDP([]byte(timeNow), UdpAddr)
}
}
客户端代码如下:
package main
import "fmt"
func main() {
Client()
}
func Client() {
conn, err := net.Dial("udp", "127.0.0.1:8002")//与服务器建立连接,协议必须小写
if err != nil {
fmt.Println("net.Dial err:", err)
return
}
defer conn.Close()//不要忘记关闭
for {//循环发送请求
requst := make([]byte, 4096)
n, err := os.Stdin.Read(requst)
//os.Stdin是标准输入,返回的是一个文件指针,所以后面直接可以读取数据到缓冲切片中
if err != nil {
fmt.Println("os.Stdin.Read err:", err)
return
}
conn.Write(requst[:n])
buf := make([]byte, 4096)
n, err = conn.Read(buf)
if err != nil {
fmt.Println("conn.Read err:", err)
return
}
fmt.Println("读到客户端回发数据:", string(buf[:n]))
}
}