在Golang的网络编程体系中,net包提供了完善的网络操作能力,其中net.Listen方法是创建TCP服务端的核心入口。通过该方法可以快速监听指定网络地址和端口,接收客户端的连接请求,进而实现稳定可靠的网络通信功能。

net.Listen方法基本说明
net.Listen的函数签名如下:
func Listen(network, address string) (Listener, error)
该方法接收两个参数,第一个是网络类型,对于TCP服务需要传入tcp,第二个是监听的地址和端口,格式为ip:port,如果监听所有网卡可以省略IP部分,直接写:端口号。方法返回值是Listener接口实例和可能的错误,Listener接口定义了Accept() (Conn, error)方法用于接收客户端连接。
基础TCP服务实现步骤
1. 启动监听
首先调用net.Listen监听指定端口,处理可能的监听错误:
package main
import (
"fmt"
"net"
)
func main() {
// 监听本地8080端口的TCP连接
listener, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Printf("监听端口失败: %vn", err)
return
}
// 延迟关闭监听器
defer listener.Close()
fmt.Println("TCP服务启动成功,监听端口8080")
}
2. 接收客户端连接
使用循环调用Accept方法接收客户端连接,该方法会阻塞直到有新的客户端连接到来:
for {
conn, err := listener.Accept()
if err != nil {
fmt.Printf("接收连接失败: %vn", err)
continue
}
// 打印客户端地址
fmt.Printf("新的客户端连接: %sn", conn.RemoteAddr().String())
// 处理连接逻辑
go handleConn(conn)
}
3. 处理连接数据
为每个客户端连接启动独立的goroutine处理数据读写,避免阻塞主监听流程:
func handleConn(conn net.Conn) {
// 延迟关闭连接
defer conn.Close()
// 定义缓冲区用于读取数据
buf := make([]byte, 1024)
for {
// 读取客户端发送的数据
n, err := conn.Read(buf)
if err != nil {
fmt.Printf("读取数据失败或连接关闭: %vn", err)
return
}
// 打印接收到的数据
fmt.Printf("接收到客户端数据: %sn", string(buf[:n]))
// 向客户端返回响应
_, err = conn.Write([]byte("已收到你的消息"))
if err != nil {
fmt.Printf("发送响应失败: %vn", err)
return
}
}
}
完整可运行示例
将上述代码整合后得到完整的TCP服务端代码:
package main
import (
"fmt"
"net"
)
func main() {
listener, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Printf("监听端口失败: %vn", err)
return
}
defer listener.Close()
fmt.Println("TCP服务启动成功,监听端口8080")
for {
conn, err := listener.Accept()
if err != nil {
fmt.Printf("接收连接失败: %vn", err)
continue
}
fmt.Printf("新的客户端连接: %sn", conn.RemoteAddr().String())
go handleConn(conn)
}
}
func handleConn(conn net.Conn) {
defer conn.Close()
buf := make([]byte, 1024)
for {
n, err := conn.Read(buf)
if err != nil {
fmt.Printf("读取数据失败或连接关闭: %vn", err)
return
}
fmt.Printf("接收到客户端数据: %sn", string(buf[:n]))
_, err = conn.Write([]byte("已收到你的消息"))
if err != nil {
fmt.Printf("发送响应失败: %vn", err)
return
}
}
}
常见问题与优化
- 端口占用问题:如果启动时提示地址已被使用,需要检查是否有其他进程占用该端口,或者调整监听的端口号。
- 连接超时处理:可以为连接设置读写超时,避免长时间无数据的连接占用资源,使用
conn.SetReadDeadline和conn.SetWriteDeadline方法实现。 - 并发控制:如果客户端连接量过大,可以限制同时处理的goroutine数量,避免资源耗尽。
- 优雅关闭:可以监听系统中断信号,在服务关闭前先关闭监听器,再等待现有连接处理完成。
简单客户端测试代码
可以使用以下简单的TCP客户端测试服务是否正常:
package main
import (
"fmt"
"net"
)
func main() {
conn, err := net.Dial("tcp", "127.0.0.1:8080")
if err != nil {
fmt.Printf("连接服务端失败: %vn", err)
return
}
defer conn.Close()
// 发送数据
_, err = conn.Write([]byte("hello tcp server"))
if err != nil {
fmt.Printf("发送数据失败: %vn", err)
return
}
// 读取响应
buf := make([]byte, 1024)
n, err := conn.Read(buf)
if err != nil {
fmt.Printf("读取响应失败: %vn", err)
return
}
fmt.Printf("接收到服务端响应: %sn", string(buf[:n]))
}
Golangnet_ListenTCP服务socket编程修改时间:2026-06-16 05:18:36