【golang】实现基于UDP协议的简单的C-S架构
2019-07-25 本文已影响0人
七八个星天
与TCP相比,UDP的服务器和客户端之间不用建立持久的连接,数据传输更加高效,但稳定性和安全性较差
一、服务器
package main
import (
"fmt"
"net"
"time"
)
func main() {
//建立udp服务器结构体
udpServer, err := net.ResolveUDPAddr("udp", "127.0.0.1:8001")
if err != nil {
fmt.Println("net.ResolveUDPAddr err", err)
return
}
//创建udp监听服务
conn, err := net.ListenUDP("udp", udpServer)
defer conn.Close()
if err != nil {
fmt.Println("net.ListenUDP err", err)
return
}
for {
//读取客户端数据
buf := make([]byte, 1024)
n, udpClient, err := conn.ReadFromUDP(buf)
if err != nil {
fmt.Println("conn.ReadFromUDP err", err)
}
fmt.Printf("%s:%d发来数据:%s\n", udpClient.IP, udpClient.Port, string(buf[:n]))
//向客户端发送当前时间
now := time.Now().String()
conn.WriteToUDP([]byte(now), udpClient)
}
}
二、客户端
package main
import (
"fmt"
"net"
"os"
)
func main() {
//发送请求,获取连接
conn, err := net.Dial("udp", "127.0.0.1:8001")
defer conn.Close()
if err != nil {
fmt.Println("net.Dial err:", err)
return
}
for {
//输入数据并发送给服务器
str := make([]byte, 4096)
//读取键盘输入
n, err := os.Stdin.Read(str)
if err != nil {
fmt.Println("os.Stdin.Read err:", err)
}
conn.Write(str[:n])
if n == 0 {
continue
}
}
}