1.开发语言:GO语言
2.IDE:Goland
3.开发用时:十分钟
4.源码已上传到我的GitHub,链接:https://github.com/2394799692/UDP 或点此跳转
5.基础知识请参考上一篇文章:【GO语言】实现UDP—C/S设计模式的服务器server端与客户client端即时通信
以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步。——来自考研路上的lwj。QQ:2394799692
说明:UDP的并发和基础的通信模式差别不大,这一章了解即可,我直接把代码放出来,只改动了一小点部分,大家有兴趣可以自己测试一下,重点还是要掌握好TCP的通信。
一、服务器端代码展示package main
import (
"fmt"
"net"
"time"
)
func main() {
//组织一个udp地址结构,指定服务器的IP+port
//srvAddr是地址结构
srvAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8006")
//访问命令:nc -u 127.0.0.1 8006
if err != nil {
fmt.Println("ResolveUDPAddr err:", err)
return
}
fmt.Println("udp 服务器地址结构,创建完成!!!")
//创建用户通信的socket:udpConn
udpConn, err := net.ListenUDP("udp", srvAddr)
if err != nil {
fmt.Println("ListenUD err:", err)
return
}
defer udpConn.Close()
fmt.Println("udp 服务器socket,创建完成!!!")
//读取客户端发送的数据
buf := make([]byte, 4096)
for {
//返回3个值。分别是读取到的字节数,客户端的地址,error
n, cltAddr, err := udpConn.ReadFromUDP(buf) //每有一个客户端连接上来,启动一个go程写数据
if err != nil {
fmt.Println("ReadFromUDP err:", err)
return
}
//模拟处理数据
fmt.Printf("服务器读到%vd的数据:%s\n", cltAddr, string(buf[:n]))
//提取系统当前时间
go func() { //每有一个客户端连接上来,启动一个go程写数据
daytime := time.Now().String() + "\n"
//回写数据给客户端
_, err = udpConn.WriteToUDP([]byte(daytime), cltAddr)
if err != nil {
fmt.Println("WriteToUDP err:", err)
return
}
}()
}
}
二、客户端代码展示
package main
import (
"fmt"
"net"
"time"
)
func main() {
//指定服务器 ip+port创建通信套接字
conn, err := net.Dial("udp", "127.0.0.1:8006")
if err != nil {
fmt.Println("net.dial err:", err)
return
}
defer conn.Close()
for {
//主动写数据给服务器
conn.Write([]byte("are you ready?"))
buf := make([]byte, 4096)
//接收服务器回发的数据
n, err := conn.Read(buf)
if err != nil {
fmt.Println("conn.Read err:", err)
return
}
//处理数据,打印
fmt.Println("服务器回发:", string(buf[:n])) //读了多少显示多少
time.Sleep(time.Second) //一秒启动一次
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)