0

0

Go如何实现简单TCP服务器_Go TCP服务端基础实现

P粉602998670

P粉602998670

发布时间:2026-01-15 15:02:02

|

275人浏览过

|

来源于php中文网

原创

Go标准库无listenAndServe,须手动net.Listen+for循环Accept;每个conn需goroutine处理并设Read/Write deadline,Read/Write要检查n和err,避免阻塞与泄漏。

go如何实现简单tcp服务器_go tcp服务端基础实现

listenAndServe 不存在,得用 net.Listen + accept 循环

Go 标准库没有类似 http.ListenAndServe 那样开箱即用的 TCP 服务启动函数。你必须手动调用 net.Listen 创建监听套接字,再用 Accept 持续接收连接——这是最基础、也最容易漏掉循环控制的地方。

  • net.Listen("tcp", ":8080") 返回 net.Listener,只负责监听,不处理连接
  • 必须显式写 for 循环调用 listener.Accept(),否则程序启动后立即退出
  • 每个 connnet.Conn 接口,需单独 goroutine 处理,否则会阻塞下一个连接
  • 忘记关闭 conn 会导致文件描述符泄漏,尤其在高并发时很快 hit ulimit

读写要用 conn.Read/Write,不是 fmt.Scan/Fprintln

TCP 连接是字节流,fmt 包的函数默认操作 os.Stdin/os.Stdout,不能直接用于 net.Conn。必须用 conn.Readconn.Write,且要处理返回的 n(实际读写字节数)和 err

  • conn.Read([]byte) 是阻塞调用,直到有数据或连接关闭;返回 n, errn == 0 && err == nil 表示对端关闭写入(EOF)
  • conn.Write([]byte) 不保证一次发完,但标准实现中对小包通常能全写,仍建议检查 n 是否等于预期长度
  • 不要用 fmt.Fscanf(conn, "%s", &buf):它依赖空格/换行分隔,而 TCP 无消息边界,容易卡住或错读
  • 简单回显场景可用 io.Copy(conn, conn),但生产环境务必加超时和缓冲控制

必须设 Read/Write deadline,否则连接卡死无法释放

没有超时的 TCP 服务在客户端异常断连、网络中断或发送半截数据时,conn.Read 会永久阻塞,goroutine 泄漏,最终耗尽资源。

  • accept 后立刻调用 conn.SetReadDeadlineconn.SetWriteDeadline
  • 时间点用 time.Now().Add(30 * time.Second),不是固定间隔;每次读写前都需重设
  • 超时错误是 net.ErrDeadlineExceeded,可据此主动关闭连接
  • 如果用 io.ReadFullbufio.Reader,deadline 仍需手动设置,它们不自动继承
package main

import ( "log" "net" "time" )

func handleConn(conn net.Conn) { defer conn.Close() conn.SetReadDeadline(time.Now().Add(30 time.Second)) conn.SetWriteDeadline(time.Now().Add(30 time.Second))

buf := make([]byte, 1024)
for {
    n, err := conn.Read(buf)
    if err != nil {
        if netErr, ok := err.(net.Error); ok && netErr.Timeout() {
            log.Println("read timeout", conn.RemoteAddr())
        }
        return
    }
    if n == 0 {
        return
    }
    _, _ = conn.Write(buf[:n])
    conn.SetReadDeadline(time.Now().Add(30 * time.Second))
    conn.SetWriteDeadline(time.Now().Add(30 * time.Second))
}

}

Shakespeare
Shakespeare

一款人工智能文案软件,能够创建几乎任何类型的文案。

下载

func main() { lis, err := net.Listen("tcp", ":8080") if err != nil { log.Fatal(err) } defer lis.Close()

log.Println("TCP server listening on :8080")
for {
    conn, err := lis.Accept()
    if err != nil {
        log.Println("accept error:", err)
        continue
    }
    go handleConn(conn)
}

}

真正麻烦的从来不是“怎么启动”,而是连接生命周期管理:什么时候关、谁来关、超时怎么判、错误怎么分。哪怕只是 echo 服务,SetDeadlinedefer conn.Close() 漏掉任何一个,跑两天就出事。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

738

2023.08.22

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1018

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

62

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

402

2025.12.29

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

337

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

406

2023.11.14

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

1727

2024.03.12

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1969

2024.08.16

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

4

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.7万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号