go语言通过Goroutine实现高效TCP并发处理,使用net.Listen监听端口,Accept接收连接并启Goroutine处理,配合超时控制与WaitGroup优雅关闭,确保高并发下的稳定性与资源安全。
go语言(golang)以其轻量级的Goroutine和强大的标准库,非常适合构建高并发的TCP服务器。在处理多个客户端连接时,Go能通过简单的语法实现高效的并发模型。下面介绍如何用Golang编写一个能并发处理TCP连接的服务器。
基本TCP服务器结构
一个基础的TCP服务器使用net.Listen监听端口,通过Accept接收客户端连接。每次有新连接到来时,服务器可以启动一个独立的Goroutine来处理,从而实现并发。
示例代码:
package main <p>import ( "bufio" "fmt" "net" )</p><p>func main() { listener, err := net.Listen("tcp", ":8080") if err != nil { fmt.Println("监听失败:", err) return } defer listener.Close()</p><pre class='brush:php;toolbar:false;'>fmt.Println("服务器启动,监听端口 8080...") for { conn, err := listener.Accept() if err != nil { fmt.Println("接受连接失败:", err) continue } // 每个连接启动一个Goroutine处理 go handleConnection(conn) }
}
立即学习“go语言免费学习笔记(深入)”;
func handleConnection(conn net.Conn) { defer conn.Close() scanner := bufio.NewScanner(conn) for scanner.Scan() { message := scanner.Text() fmt.printf(“收到消息: %sn”, message)
// 回显消息 conn.Write([]byte("echo: " + message + "n")) }
}
立即学习“go语言免费学习笔记(深入)”;
并发处理的核心:Goroutine
关键在于go handleConnection(conn)这一行。每当有新连接建立,服务器不阻塞等待处理完成,而是立即启动一个Goroutine来处理该连接,主循环继续等待下一个连接。
- Goroutine开销小,成千上万个并发连接也能轻松应对
- 每个连接独立运行,互不干扰
- 无需手动管理线程池,语言层面自动调度
连接超时与资源控制
在生产环境中,应考虑连接超时和资源限制,防止恶意连接耗尽系统资源。
可以为连接设置读写超时:
func handleConnection(conn net.Conn) { defer conn.Close() <pre class='brush:php;toolbar:false;'>// 设置读取超时 conn.SetReadDeadline(time.Now().Add(30 * time.Second)) scanner := bufio.NewScanner(conn) for scanner.Scan() { message := scanner.Text() fmt.Printf("收到: %sn", message) // 处理后重置超时 conn.SetReadDeadline(time.Now().Add(30 * time.Second)) conn.Write([]byte("echo: " + message + "n")) }
}
立即学习“go语言免费学习笔记(深入)”;
优雅关闭与连接管理
当服务器需要关闭时,应等待所有连接处理完成。可使用sync.WaitGroup或上下文(context)进行协调。
例如,使用WaitGroup记录活跃连接数:
var wg sync.WaitGroup <p>// 接受连接时 wg.Add(1) go func() { defer wg.Done() handleConnection(conn) }()</p><p>// 关闭服务器前 wg.Wait() // 等待所有连接处理完毕</p>
基本上就这些。Golang通过Goroutine让TCP并发编程变得简单高效,合理设置超时和资源控制后,就能构建稳定可靠的网络服务。不复杂但容易忽略的是连接的生命周期管理和错误处理,建议每个handle函数都加上recover避免崩溃。
评论(已关闭)
评论已关闭