Go语言实现UDP版聊天小工具的示例详解

南乔
南乔
发布时间:2026-10-15| 5人浏览过
原创

本教程讲解如何利用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语言聊天工具的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。