答案:使用Golang的net包可快速构建TCP服务器。通过net.Listen监听端口,Accept接收连接,并用goroutine处理并发;利用bufio按行解析消息,实现回显功能;需注意TCP粘包问题,可通过加长度头或分隔符解决;生产环境应设置读写超时、监听中断信号并优雅关闭连接。

用Golang开发TCP服务器其实非常直接,得益于标准库net包的强大支持。你不需要引入第三方框架就能快速搭建一个稳定、高效的TCP服务。下面一步步说明如何实现。
创建基本的TCP服务器
使用net.Listen函数监听指定地址和端口,然后通过循环接受客户端连接。
以下是一个最简单的TCP服务器示例:
package mainimport ( "bufio" "fmt" "log" "net" )
func main() { // 监听本地 8080 端口 listener, err := net.Listen("tcp", ":8080") if err != nil { log.Fatal("监听失败:", err) } defer listener.Close()
fmt.Println("TCP服务器已启动,监听 :8080...") for { // 等待客户端连接 conn, err := listener.Accept() if err != nil { log.Println("接受连接出错:", err) continue } // 启动协程处理每个连接 go handleConnection(conn) }}
立即学习“go语言免费学习笔记(深入)”;
// 处理客户端连接 func handleConnection(conn net.Conn) { defer conn.Close()
scanner := bufio.NewScanner(conn) for scanner.Scan() { data := scanner.Text() fmt.Printf("收到消息: %s\n", data) // 回显消息给客户端 _, _ = conn.Write([]byte("echo: " + data + "\n")) } fmt.Println("客户端断开连接")}
立即学习“go语言免费学习笔记(深入)”;
处理并发连接
Golang的协程(goroutine)让并发处理变得极其简单。每次调用Accept获得新连接后,用go handleConnection(conn)开启一个独立协程处理,互不阻塞。
这种模式可以轻松支持成百上千个并发连接,只要系统资源允许。
SmartB2B 是一款基于PHP、MySQL、Smarty的B2B行业电子商务网站管理系统,系统提供了供求模型、企业模型、产品模型、人才招聘模型、资讯模型等模块,适用于想在行业里取得领先地位的企业快速假设B2B网站,可以运行于Linux与Windows等多重服务器环境,安装方便,使用灵活。 系统使用当前流行的PHP语言开发,以MySQL为数据库,采用B/S架构,MVC模式开发。融入了模型化、模板
- 每个连接独立运行,不会影响其他连接
- 协程开销小,适合高并发场景
- 注意控制资源,避免内存泄漏(比如未关闭连接)
发送与接收数据的细节
TCP是字节流协议,没有消息边界,因此需要自己定义协议来区分每条消息。
上面例子中使用bufio.Scanner按行分割,是一种简单方式,适用于文本协议。
如果是二进制数据或自定义协议,常见做法有:
- 在消息前加长度头(如4字节表示后续数据长度)
- 使用分隔符(如\0或特殊字符)
- 采用结构化格式(如JSON、Protobuf)并配合定长头
读取时建议用bufio.Reader或手动解析字节流,避免因TCP粘包导致数据错乱。
优雅关闭与错误处理
生产环境要考虑连接超时、异常断开、服务关闭等情况。
- 对
conn.Read或Write设置超时:conn.SetReadDeadline(time.Now().Add(30 * time.Second)) - 主程序监听中断信号(如Ctrl+C),关闭listener以停止接受新连接
- 使用
sync.WaitGroup等待已有连接处理完成(可选)
例如监听退出信号:
ch := make(chan os.Signal, 1)
signal.Notify(ch, os.Interrupt)
<-ch
fmt.Println("\n正在关闭服务器...")
listener.Close()
基本上就这些。Golang写TCP服务器简洁高效,核心逻辑清晰。只要理解连接处理、并发模型和数据边界问题,就能构建出可靠的网络服务。









