章节

17.1 TCP 服务端

本篇学习 Go TCP 服务端的监听、接收连接与读写流程,并能启动一个基础 TCP 服务。

TCP 服务端

概念说明

TCP 是面向连接的传输协议。
服务端通常先监听一个地址和端口,然后等待客户端连接。

每个连接都可以看作一个 net.Conn
服务端从连接中读取客户端数据,再把响应写回连接。

语法/规则

  1. 使用 net.Listen("tcp", address) 监听 TCP 地址。
  2. 使用 listener.Accept() 等待客户端连接。
  3. 使用 conn.Read(buffer) 读取客户端数据。
  4. 使用 conn.Write(data) 写回响应。
  5. 每个连接处理结束后要关闭 conn
  6. 服务端通常用 goroutine 处理每个客户端连接。

TCP 服务端示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package main

import (
	"fmt"
	"net"
)

func handleConn(conn net.Conn) { // 每个连接单独处理
	defer conn.Close()

	buffer := make([]byte, 1024)
	n, err := conn.Read(buffer)
	if err != nil {
		fmt.Println("read error:", err)
		return
	}

	message := string(buffer[:n]) // 只取本次真正读到的数据
	fmt.Println("server receive:", message)

	_, err = conn.Write([]byte("pong"))
	if err != nil {
		fmt.Println("write error:", err)
	}
}

func main() {
	listener, err := net.Listen("tcp", "127.0.0.1:9000")
	if err != nil {
		panic(err)
	}
	defer listener.Close()

	fmt.Println("tcp server listen on 127.0.0.1:9000")
	for {
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("accept error:", err)
			continue
		}
		go handleConn(conn) // 每个客户端连接交给新的 goroutine
	}
}

运行结果:

1
tcp server listen on 127.0.0.1:9000

常见错误

  1. 服务端启动后没有一直等待连接,导致程序立即退出。
  2. 读取数据时直接使用整个 buffer,导致混入未写入的空字节。
  3. 忘记关闭连接,长时间运行后可能造成资源泄漏。
  4. 服务端和客户端地址、端口不一致,导致连接失败。
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字