Go语言搭建简易TCP服务器代码示例
本文介绍了使用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网络编程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













