Go语言搭建简易TCP服务器代码示例

许南星
许南星
发布时间:2026-10-14| 4人浏览过
原创

本文介绍了使用Go语言标准库搭建基础TCP服务器的具体实现方案。核心流程包括端口监听、连接接受以及针对每个客户端建立的goroutine进行数据读写处理。

目标与准备条件

本示例旨在展示Go语言中构建一个简单的TCP服务端,能够接收来自客户端的连接,并处理基础的数据收发。无需第三方依赖,仅使用Go内置的 net 和 fmt 包即可运行。

真实操作顺序

第1步:定义全局常量与服务初始化函数

首先定义读取缓冲的最大长度(maxRead)以及用于控制通信状态的消息标识(msgStop 和 msgStart)。在 initServer 函数中,需要指定监听的Host和Port(如 localhost:54321),并使用 net.ResolveTCPAddr 解析地址,再通过 net.ListenTCP 创建监听器。
注意:启动前请确保端口 54321 未被其他进程占用。

第2步:主循环接受连接

在 main 函数中启动服务后,进入无限循环调用 listener.Accept()。每当有客户端连接进来,立即开启一个新的 goroutine(go connectionHandler(conn))来专门处理该连接,从而实现并发响应多个客户端。

第3步:处理单个连接的生命周期

connectionHandler 负责具体的会话逻辑:
1. 打印客户端地址以确认连接来源。
2. 调用 talktoclients 向客户端发送初始握手消息 cmdContinue。
3. 进入循环读取数据:每次分配 maxRead + 1 字节的缓冲区,读取数据后在最后位置填入 0 以防止缓冲区溢出,并根据错误类型决定是继续处理消息还是断开连接。

第4步:消息解析与资源清理

在 handleMsg 中,对接收到的字节数组进行处理,提取有效字符串并通过 fmt.Printf 输出。当循环退出或发生异常时,执行 conn.Close() 关闭TCP连接,并记录日志表示连接已终止。同时定义了 checkError 辅助函数,一旦发现非空错误即调用 panic 终止程序以便调试。

完整代码参考

package main
import (
	"net"
	"fmt"
)
var (
	maxRead = 1100
	msgStop   = []byte("cmdStop")
	msgStart  = []byte("cmdContinue")
)

func main() {
	hostAndPort := "localhost:54321"
	listener := initServer(hostAndPort)
	for {
		conn, err := listener.Accept()
		checkError(err, "Accept: ")
		go connectionHandler(conn)
	}
}

func initServer(hostAndPort string) *net.TCPListener {
	serverAddr, err := net.ResolveTCPAddr("tcp", hostAndPort)
	checkError(err, "Resolving address:port failed: '" + hostAndPort + "'")
	listener, err := net.ListenTCP("tcp", serverAddr)
	checkError(err, "ListenTCP: ")
	println("Listening to: ", listener.Addr().String())
	return listener
}

func connectionHandler(conn net.Conn) {
	connFrom := conn.RemoteAddr().String()
	println("Connection from: ", connFrom)
	talktoclients(conn)
	for {
		var ibuf []byte = make([]byte, maxRead + 1)
		length, err := conn.Read(ibuf[0:maxRead])
		ibuf[maxRead] = 0 // to prevent overflow
		switch err {
		case nil:
			handleMsg(length, err, ibuf)
		default:
			goto DISCONNECT
		}
	}
DISCONNECT:
	err := conn.Close()
	println("Closed connection:" , connFrom)
	checkError(err, "Close:" )
}

func talktoclients(to net.Conn) {
	wrote, err := to.Write(msgStart)
	checkError(err, "Write: wrote " + string(wrote) + " bytes.")
}

func handleMsg(length int, err error, msg []byte) {
	if length > 0 {
		for i := 0; ; i++ {
			if msg[i] == 0 {
				break
			}
		}
		fmt.Printf("Received data: %v", string(msg[0:length]))
		fmt.Println("  length:",length)
	}
}

func checkError(error error, info string) {
	if error != nil {
		panic("ERROR: " + info + " " + error.Error()) // terminate program
	}
}

完成判断与简要总结

成功编译并运行该代码后,终端将显示 “Listening to...” 提示。此时使用 Telnet 或简单的 TCP 客户端连接 localhost:54321,若收到 cmdContinue 回执且控制台能正确打印后续输入内容,即证明 TCP 服务工作正常。以上就是Go语言实现简单TCP服务方法的详细内容,更多关于Go网络编程的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。