文章目录

  • 1. 服务端配置
  • 2. 客户端配置
  • 3. 实现双向聊天
  • 4. 优化多客户端实现通讯

UDP 是用户数据报协议,是一种无连接传输协议,不需要建立连接就可以直接发送和接收数据,属于不可靠的,没有时序的通信,UDP 实时性好,适合直播环境。

1. 服务端配置

示例

package mainimport ("fmt""net"
)/* UDP 服务端 */func main() {// 1. 监听listener,err := net.ListenUDP("udp",&net.UDPAddr {IP:     net.ParseIP("127.0.0.1"),Port:    30000,})if err != nil {fmt.Println("启动 server 失败,err:",err)return}// 退出时关闭资源defer listener.Close()// 循环收发数据for {var buf [1024]byte// 因为是无连接,所以需要知道对方地址 Addrn,addr,err := listener.ReadFromUDP(buf[:])if err != nil {fmt.Println("接收消息失败,err:",err)return}fmt.Printf("接收到来自 %v 的消息:%v\n",addr,string(buf[:n]))// 回复消息n,err = listener.WriteToUDP([]byte("hi"),addr)if err != nil {fmt.Println("回复失败,err:",err)return}}
}

2. 客户端配置

示例

package mainimport ("fmt""net"
)/* UDP 客户端 */func main() {// 连接 UDP 服务器conn,err := net.Dial("udp","127.0.0.1:30000")if err != nil {fmt.Println("连接失败,err:",err)return}defer conn.Close()// 发送消息n,err := conn.Write([]byte("hello"))if err != nil {fmt.Println("发送失败,err:",err)return}// 接收消息var buf [1024]byten,err = conn.Read(buf[:]) // n 为返回的有效字节个数if err != nil {fmt.Println("接收消息失败,err:",err)return}fmt.Println("收到回复:",string(buf[:n]))
}

实现效果

3. 实现双向聊天

修改客户端

package mainimport ("bufio""fmt""net""os"
)/* UDP 客户端 */func main() {for {// 连接 UDP 服务器conn, err := net.Dial("udp", "127.0.0.1:30000")if err != nil {fmt.Println("连接失败,err:", err)return}defer conn.Close()defer conn.Close()reader := bufio.NewReader(os.Stdin)input, err := reader.ReadString('\n')if err != nil {fmt.Println("获取信息失败,err:", err)return}_, err = conn.Write([]byte(input))if err != nil {fmt.Println("发送消息失败,err:", err)return}}
}

实现效果

4. 优化多客户端实现通讯

修改服务端

package mainimport ("fmt""net"
)/* UDP 服务端 */func process(listener net.UDPConn) {defer listener.Close()// 循环收发数据for {var buf [1024]byte// 因为是无连接,所以需要知道对方地址 Addrn, addr, err := listener.ReadFromUDP(buf[:])if err != nil {fmt.Println("接收消息失败,err:", err)return}fmt.Printf("接收到来自 %v 的消息:%v\n", addr, string(buf[:n]))// 回复消息n, err = listener.WriteToUDP([]byte("hi"), addr)if err != nil {fmt.Println("回复失败,err:", err)return}}
}func main() {// 1. 监听listener,err := net.ListenUDP("udp",&net.UDPAddr {IP:      net.ParseIP("127.0.0.1"),Port:    30000,})if err != nil {fmt.Println("启动 server 失败,err:",err)return}process(*listener)
}

开两个客户端看看效果


PS:可以将服务端和客户端打成 exe 文件,发给不同的人,修改 IP,实现群聊效果。go 语言不同于 java,python …,golang 可以直接打成 exe 文件,不需要依赖环境直接运行,但同时也有安全性问题。


Golang 学习二十五(UDP 编程)相关推荐

  1. Golang学习(二十四)家庭记账项目

    一.项目开发流程 需求分析-->设计阶段-->实现阶段(代码)-->测试阶段-->实施阶段-->维护阶段 二.项目需求说明 1.模拟实现基于文本界面的 <家庭记账软 ...

  2. Java多线程学习二十五:阻塞和非阻塞队列的并发安全原理||如何选择适合自己的阻塞队列?

    阻塞和非阻塞队列的并发安全原理. 之前我们探究了常见的阻塞队列的特点,以 ArrayBlockingQueue 为例, 首先分析 BlockingQueue 即阻塞队列的线程安全原理,然后再看看它的兄 ...

  3. opencv学习(二十五)之开运算、闭运算、形态梯度、顶帽、黑帽

    上一篇介绍了形态学的基本操作膨胀和腐蚀,我们这一篇将利用膨胀和腐蚀操作实现对图像更高级的形态学操作,而这些都是建立在膨胀和腐蚀操作基础之上. 首先形态学的主要用途是获取物体拓扑和结果信息,它通过物体和 ...

  4. Golang学习(二十九)序列化和反序列化

    我们不同编程语言之间的数据是无法直接交互的,我们想要解决这个问题 就需要将不同语言之间传输的数据做一个统一规范,而json是目前最流行的数据格式 一.json是什么 json 是一种数据交换格式,主要 ...

  5. 未处理异常和C++异常——Windows核心编程学习手札之二十五

    未处理异常和C++异常 --Windows核心编程学习手札之二十五 当一个异常过滤器返回EXCEPTION_CONTINUE_SEARCH标识符时是告诉系统继续上溯调用树,寻找另外的异常过滤器,但当每 ...

  6. 【Vue2.0学习】—Vuex工作原理图(二十五)

    [Vue2.0学习]-Vuex工作原理图(二十五) 一. Vuex 是什么? 概念: 专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对Vue应用中多个组件的共享状态进行集中式的管理(读/写 ...

  7. 零基础带你学习MySQL—unique 唯一(二十五)

    零基础带你学习MySQL-unique 唯一(二十五) unqiue 使用细节 如果没有指定 not null 则 unique 字段可以有多个 null 如果一个列(字段) 是 unique not ...

  8. JavaScript学习(二十五)—实现无缝滚动

    JavaScript学习(二十五)-实现无缝滚动 效果如下: 代码如下: <!DOCTYPE html> <html lang="en"><head& ...

  9. 深度学习之图像分类(二十五)-- S2MLPv2 网络详解

    深度学习之图像分类(二十五)S2MLPv2 网络详解 目录 深度学习之图像分类(二十五)S2MLPv2 网络详解 1. 前言 2. S2MLPv2 2.1 S2MLPv2 Block 2.2 Spat ...

最新文章

  1. java whois_Java如何实现简单的whois查询
  2. 萨克斯维修服务器,萨克斯常见故障修理方法
  3. 4K观影体验需要网络端到端带宽50M-100M,时延RTT<=20ms,丢包率PLR<=3.4*10
  4. rsync命令_浅谈利用rsync服务的攻击
  5. win7打开计算机死机,怎么样解决Win7系统运行程序引起的死机问题
  6. linux 多个秘钥,linux管理多个ssh公钥密钥
  7. 为什么编程语言要从c语言学起,在那么多编程语言中,为什么推荐初学者学 C 语言?...
  8. 台阶问题(洛谷P1192题题解,Java语言描述)
  9. 官宣了!受疫情影响,程序员可免费领这些!
  10. TensorFlow:卷积神经网络
  11. 【PowerShell】PS中 the fuck 插件(PoShFuck)将 wtf 搜索引擎从 Google 改为 Baidu 或者 Bing
  12. 51与JDY31蓝牙模块通讯,51驱动JDY31蓝牙APP点灯
  13. Word中批量更新域的两个小方法;更新角标;更新引用
  14. ES6 模板字符串方法
  15. 2021年国外网络安全博客和网站排名
  16. u-boot2020.04移植(3、lowlevel_init.S)
  17. 查看检测排名各网站的网站
  18. Mysql:Got error 28 from storage engine
  19. Spring Data Elasticsearch 和 x-pack 用户名/密码验证连接
  20. 简述keepalived和其工作原理,keepalived搭建mysql高可用,vip飘逸,避免单点故障@xinxin

热门文章

  1. Android APP微信支付开发的步骤
  2. oc和java的优点缺点_oc语言的优点和缺点
  3. 非抽样小波变换 matlab,基于Matlab和Python的非采样离散小波变换
  4. Eclipse优化,关闭不必要的验证,简单粗暴!
  5. 多媒体技术与应用之图像Huffman编解码
  6. 61850协议服务器端开发,IEC61850报告服务端开发.doc
  7. 中创易票通打印票据支票 v2.3 bt
  8. 服务器部署之Jenkins搭建(失败了)
  9. kubectl :命令技巧大全
  10. 电信光纤猫HG8245 超级密码 及路由功能启用