Golang 学习二十五(UDP 编程)
文章目录
- 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 编程)相关推荐
- Golang学习(二十四)家庭记账项目
一.项目开发流程 需求分析-->设计阶段-->实现阶段(代码)-->测试阶段-->实施阶段-->维护阶段 二.项目需求说明 1.模拟实现基于文本界面的 <家庭记账软 ...
- Java多线程学习二十五:阻塞和非阻塞队列的并发安全原理||如何选择适合自己的阻塞队列?
阻塞和非阻塞队列的并发安全原理. 之前我们探究了常见的阻塞队列的特点,以 ArrayBlockingQueue 为例, 首先分析 BlockingQueue 即阻塞队列的线程安全原理,然后再看看它的兄 ...
- opencv学习(二十五)之开运算、闭运算、形态梯度、顶帽、黑帽
上一篇介绍了形态学的基本操作膨胀和腐蚀,我们这一篇将利用膨胀和腐蚀操作实现对图像更高级的形态学操作,而这些都是建立在膨胀和腐蚀操作基础之上. 首先形态学的主要用途是获取物体拓扑和结果信息,它通过物体和 ...
- Golang学习(二十九)序列化和反序列化
我们不同编程语言之间的数据是无法直接交互的,我们想要解决这个问题 就需要将不同语言之间传输的数据做一个统一规范,而json是目前最流行的数据格式 一.json是什么 json 是一种数据交换格式,主要 ...
- 未处理异常和C++异常——Windows核心编程学习手札之二十五
未处理异常和C++异常 --Windows核心编程学习手札之二十五 当一个异常过滤器返回EXCEPTION_CONTINUE_SEARCH标识符时是告诉系统继续上溯调用树,寻找另外的异常过滤器,但当每 ...
- 【Vue2.0学习】—Vuex工作原理图(二十五)
[Vue2.0学习]-Vuex工作原理图(二十五) 一. Vuex 是什么? 概念: 专门在Vue中实现集中式状态(数据)管理的一个Vue插件,对Vue应用中多个组件的共享状态进行集中式的管理(读/写 ...
- 零基础带你学习MySQL—unique 唯一(二十五)
零基础带你学习MySQL-unique 唯一(二十五) unqiue 使用细节 如果没有指定 not null 则 unique 字段可以有多个 null 如果一个列(字段) 是 unique not ...
- JavaScript学习(二十五)—实现无缝滚动
JavaScript学习(二十五)-实现无缝滚动 效果如下: 代码如下: <!DOCTYPE html> <html lang="en"><head& ...
- 深度学习之图像分类(二十五)-- S2MLPv2 网络详解
深度学习之图像分类(二十五)S2MLPv2 网络详解 目录 深度学习之图像分类(二十五)S2MLPv2 网络详解 1. 前言 2. S2MLPv2 2.1 S2MLPv2 Block 2.2 Spat ...
最新文章
- java whois_Java如何实现简单的whois查询
- 萨克斯维修服务器,萨克斯常见故障修理方法
- 4K观影体验需要网络端到端带宽50M-100M,时延RTT<=20ms,丢包率PLR<=3.4*10
- rsync命令_浅谈利用rsync服务的攻击
- win7打开计算机死机,怎么样解决Win7系统运行程序引起的死机问题
- linux 多个秘钥,linux管理多个ssh公钥密钥
- 为什么编程语言要从c语言学起,在那么多编程语言中,为什么推荐初学者学 C 语言?...
- 台阶问题(洛谷P1192题题解,Java语言描述)
- 官宣了!受疫情影响,程序员可免费领这些!
- TensorFlow:卷积神经网络
- 【PowerShell】PS中 the fuck 插件(PoShFuck)将 wtf 搜索引擎从 Google 改为 Baidu 或者 Bing
- 51与JDY31蓝牙模块通讯,51驱动JDY31蓝牙APP点灯
- Word中批量更新域的两个小方法;更新角标;更新引用
- ES6 模板字符串方法
- 2021年国外网络安全博客和网站排名
- u-boot2020.04移植(3、lowlevel_init.S)
- 查看检测排名各网站的网站
- Mysql:Got error 28 from storage engine
- Spring Data Elasticsearch 和 x-pack 用户名/密码验证连接
- 简述keepalived和其工作原理,keepalived搭建mysql高可用,vip飘逸,避免单点故障@xinxin