在Golang中实现TCP服务器监听端口并接收客户端数据,主要依赖标准库中的net包,该包封装了底层网络操作的接口,开发者不需要处理复杂的系统调用就能完成网络服务的开发。整个实现流程逻辑清晰,适合新手入门网络编程。

核心实现步骤
1. 创建TCP监听
首先需要调用net.Listen函数创建TCP监听对象,指定网络类型为tcp,同时传入需要监听的端口地址。如果端口被占用或者权限不足,该函数会返回错误,需要进行错误处理。
package main
import (
"fmt"
"net"
"os"
)
func main() {
// 监听本地8080端口,网络类型为tcp
listener, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Printf("创建监听失败: %vn", err)
os.Exit(1)
}
// 函数退出前关闭监听
defer listener.Close()
fmt.Println("TCP服务器已启动,正在监听8080端口")
}
2. 循环接收客户端连接
监听创建成功后,需要循环调用监听对象的Accept方法接收客户端的连接请求。该方法会阻塞等待,直到有新的客户端连接进来,返回连接对象和可能的错误。通常我们会启动一个单独的goroutine处理每个客户端的连接,避免阻塞主线程接收其他连接。
func main() {
listener, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Printf("创建监听失败: %vn", err)
os.Exit(1)
}
defer listener.Close()
fmt.Println("TCP服务器已启动,正在监听8080端口")
// 循环接收客户端连接
for {
conn, err := listener.Accept()
if err != nil {
fmt.Printf("接收连接失败: %vn", err)
continue
}
// 启动goroutine处理单个客户端连接
go handleConn(conn)
}
}
3. 处理客户端数据接收
每个客户端连接对应一个net.Conn对象,该对象实现了读写接口,我们可以通过它的Read方法读取客户端发送过来的数据。读取到数据后可以进行对应的业务逻辑处理,处理完成后关闭连接即可。
// 处理单个客户端连接的函数
func handleConn(conn net.Conn) {
// 函数退出前关闭连接
defer conn.Close()
// 获取客户端地址
clientAddr := conn.RemoteAddr().String()
fmt.Printf("客户端 %s 已连接n", clientAddr)
// 创建缓冲区存储读取到的数据
buf := make([]byte, 1024)
for {
// 读取客户端发送的数据,n为实际读取的字节数
n, err := conn.Read(buf)
if err != nil {
fmt.Printf("客户端 %s 断开连接: %vn", clientAddr, err)
return
}
// 打印接收到的数据
fmt.Printf("收到客户端 %s 的数据: %sn", clientAddr, string(buf[:n]))
}
}
完整可运行代码
将上面的代码片段整合后,就是完整的TCP服务器实现,可以直接运行测试。
package main
import (
"fmt"
"net"
"os"
)
// 处理单个客户端连接的函数
func handleConn(conn net.Conn) {
defer conn.Close()
clientAddr := conn.RemoteAddr().String()
fmt.Printf("客户端 %s 已连接n", clientAddr)
buf := make([]byte, 1024)
for {
n, err := conn.Read(buf)
if err != nil {
fmt.Printf("客户端 %s 断开连接: %vn", clientAddr, err)
return
}
fmt.Printf("收到客户端 %s 的数据: %sn", clientAddr, string(buf[:n]))
}
}
func main() {
listener, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Printf("创建监听失败: %vn", err)
os.Exit(1)
}
defer listener.Close()
fmt.Println("TCP服务器已启动,正在监听8080端口")
for {
conn, err := listener.Accept()
if err != nil {
fmt.Printf("接收连接失败: %vn", err)
continue
}
go handleConn(conn)
}
}
测试与注意事项
运行上述代码后,服务器会在本地8080端口监听,我们可以使用telnet或者nc工具测试连接:
# 使用nc连接服务器,输入内容后回车即可发送 nc 127.0.0.1 8080
实际开发中需要注意几个问题:首先Read方法读取的是字节流,TCP本身没有消息边界,如果需要处理完整的业务消息,需要自己定义分包规则,比如固定长度、添加长度头或者特殊分隔符。其次如果客户端长时间没有发送数据,可以设置连接的读取超时,避免goroutine一直阻塞,通过conn.SetReadDeadline方法即可实现。另外高并发场景下需要考虑goroutine的数量控制,避免无限制创建goroutine导致资源耗尽。
GolangTCP_server监听端口接收客户端数据network_programming修改时间:2026-07-22 15:06:26