登录
首页 >  Golang >  Go教程

Golang实现TCP服务器基础代码示例

时间:2026-01-27 20:39:43 111浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《Golang实现基础TCP服务器代码示例》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!

Go TCP服务器必须显式绑定0.0.0.0:8080才能外网访问,否则默认仅监听127.0.0.1;每个连接需用goroutine并发处理并defer关闭;读取须用bufio.Scanner或循环Read防止丢数据;关闭listener前须用WaitGroup等待活跃连接结束。

Golang编写一个基础的TCP服务器示例

监听地址和端口必须显式绑定 0.0.0.0:8080127.0.0.1:8080

Go 的 net.Listen 不会默认监听所有接口,省略 IP 会导致只绑 127.0.0.1(本地回环),外部机器连不上。生产环境若需外网访问,得写成 "0.0.0.0:8080";仅本机调试可选 "127.0.0.1:8080"

常见错误现象:服务启动无报错,curl localhost:8080 成功,但换一台机器 telnet your-ip 8080 超时——八成是监听地址写成了 ":8080"(Go 会按平台默认解析,Linux 下常为 127.0.0.1)。

每个连接必须用 goroutine 并发处理,否则阻塞后续连接

listener.Accept() 是阻塞调用,返回一个 net.Conn。如果不启 goroutine,整个服务器就卡在当前连接的读写上,无法接受新连接。

  • 正确做法:对每个 conn 启动独立 goroutine,例如 go handleConnection(conn)
  • 错误写法:直接 handleConnection(conn) 同步执行,服务器退化成串行单连接
  • 注意:goroutine 内要 defer conn.Close(),否则连接泄漏

读取客户端数据要用 bufio.Scanner 或循环 conn.Read(),不能只调一次

TCP 是流式协议,conn.Read() 可能只读到部分数据,甚至 0 字节(比如对端关闭连接)。直接读一次就返回,会丢消息或提前退出。

推荐用 bufio.Scanner 简化按行读取:

scanner := bufio.NewScanner(conn)
for scanner.Scan() {
    line := scanner.Text()
    fmt.Fprintf(conn, "echo: %s\n", line)
}
if err := scanner.Err(); err != nil {
    log.Printf("scan error: %v", err)
}

如果需要处理二进制或自定义分隔符,就得手动循环 conn.Read(buf),检查返回字节数和 io.EOF

关闭监听器前要等所有活跃连接结束,否则 panic 或数据截断

listener.Close() 不会自动等待已 Accept 的连接处理完。如果主 goroutine 直接退出,正在运行的 handleConnection 可能被强制终止,导致 write on closed network connection 错误。

  • 简单场景:加个 signal.Notify 捕获 os.Interrupt,用 sync.WaitGroup 计数活跃连接
  • 关键点:Accept 前 wg.Add(1),goroutine 结束前 wg.Done(),关闭 listener 后 wg.Wait()
  • 忽略这点,SIGINT(Ctrl+C)后立刻退出,客户端可能收不到完整响应
TCP 服务器看似几行代码就能跑起来,但连接生命周期管理、并发安全、资源释放这三块最容易出隐蔽问题——尤其是没做连接计数就贸然关 listener,线上重启时丢请求很难排查。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《Golang实现TCP服务器基础代码示例》文章吧,也可关注golang学习网公众号了解相关技术文章。

前往漫画官网入口并下载 ➜
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>