Go语言实现UDP版聊天小工具的示例详解
本教程讲解如何利用Go语言的标准库 net 包搭建一个简单的UDP局域网聊天室。主要功能包括启动服务器监听连接、客户端发起请求以及双方实时交互收发文本消息。
准备工作与环境配置
在开始编写代码前,请确保本地已安装 Go 开发环境。由于 UDP 是无连接的协议,我们需要分别创建两个独立的 Go 文件:server.go(服务端)和 client.go(客户端),并运行在相同的机器或同一局域网内的不同设备上。
服务端代码实现
服务端的核心逻辑是创建一个 UDP 监听器,等待来自客户端的数据包。一旦收到数据,便解析内容并在控制台显示,同时允许用户输入回复消息发送给对应的客户端地址。
第一步:初始化UDP监听与异常处理
入口位于 main 函数。首先使用 net.ListenUDP 绑定本地 IP 127.0.0.1 和端口 10000。务必检查错误并在结束时关闭连接以释放资源。
第二步:主循环处理收发数据
在服务端的主循环中:
- 接收数据:使用
listen.ReadFromUDP读取字节流,获取实际接收字节数、发送方地址addr及可能的错误。 - 解析与打印:将接收到的字节转换为字符串输出,展示来源 IP 和字节长度。
- 等待输入:使用
bufio.NewReader(os.Stdin)捕获用户键盘输入,并通过strings.TrimSpace去除首尾空格。 - 发送回复:调用
listen.WriteToUDP将用户输入的文本原路返回给发送者。
第三步:server.go 完整代码
package main
import (
"bufio"
"fmt"
"io"
"net"
"os"
"strings"
)
// 监听UDP协议进行通信
func main() {
// 建通udp端口, 传入协议名称与,UDPAddr类型的地址与端口
listen, err := net.ListenUDP("udp", &net.UDPAddr{
IP: net.IPv4(127, 0, 0, 1),
Port: 10000,
})
if err != nil {
fmt.Println("listen udp port failed err:", err)
return
}
// 函数结束关闭连接
defer listen.Close()
// 发送与接受数据
for {
var baby [1024]byte
reader := bufio.NewReader(os.Stdin)
// 接受数据,传入切片类型对象,baby[:]表示切片类型吗,返回字节数与发送端地址与错误信息
n, addr, err := listen.ReadFromUDP(baby[:])
if err == io.EOF {
fmt.Println("read ok, ", err)
continue
}
if err != nil {
fmt.Println("read data failed, err:", err)
continue
}
fmt.Printf("Client:%v, remoteaddr:%v bytes:%v\n", string(baby[:n]), addr, n)
// 发送数据
fmt.Print("Server:")
// 对输入对内容进行格式输出,对特殊字符进行转义,传入的字节返回的字符串
text, _ := reader.ReadString('\n')
// 去掉开头或结尾的空格
msg := strings.TrimSpace(text)
_, err = listen.WriteToUDP([]byte(msg), addr)
if err != nil {
fmt.Println("write to udp failed, err:", err)
continue
}
}
}客户端代码实现
客户端的主要任务是连接到指定端口,向服务端发送消息并持续监听服务端的回复。当输入 exit 时程序终止。
第四步:建立连接与发送消息
使用 net.DialUDP 建立 UDP 连接。在循环中,先读取用户输入,若不为空则通过 listen.Write 发送;若输入为 exit 则直接返回退出程序。
第五步:接收服务端响应
发送完本地消息后,立即调用 listen.ReadFromUDP 阻塞等待服务端的回信。成功接收后格式化打印服务端地址和内容。
第六步:client.go 完整代码
package main
import (
"bufio"
"fmt"
"net"
"os"
"strings"
)
func main() {
// 与远端udp进行通信, 传入协议名称与,UDPAddr类型的地址与端口
listen, err := net.DialUDP("udp", nil, &net.UDPAddr{
IP: net.IPv4(127, 0, 0, 1),
Port: 10000,
})
if err != nil {
fmt.Println("connection udp port failed,err:", err)
return
}
// 函数结束关闭连接
defer listen.Close()
// 发送与接受数据
var baby [1024]byte
for {
// 发送数据
fmt.Print("Client:")
reader := bufio.NewReader(os.Stdin)
text, _ := reader.ReadString('\n')
// 去掉开头或结尾的空格
msg := strings.TrimSpace(text)
if msg == "exit" {
return
}
_, err = listen.Write([]byte(msg))
if err != nil {
fmt.Println("发送数据失败,err:", err)
return
}
// 接受数据
n, desaddr, err := listen.ReadFromUDP(baby[:])
if err != nil {
fmt.Println("接收数据失败,err:", err)
return
}
fmt.Printf("Server:%v remoteaddr:%v bytes:%v\n", string(baby[:n]), desaddr, n)
}
}运行效果验证
要测试此 UDP 聊天工具,请先启动服务端,然后打开另一个终端运行客户端。观察控制台输出是否符合预期交互。
D:\Software\godata\src\0115\demo\client>go run main.go
Client:你好
Server:滚 remoteaddr:127.0.0.1:10000 bytes:3
Client:好的
Server:..... remoteaddr:127.0.0.1:10000 bytes:5
Client:exit
以上就是Go语言实现UDP版聊天小工具的详细内容,更多关于Go语言聊天工具的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









