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

监听地址和端口必须显式绑定 0.0.0.0:8080 或 127.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 字节(比如对端关闭连接)。直接读一次就返回,会丢消息或提前退出。
立即学习“go语言免费学习笔记(深入)”;
在原版的基础上做了一下修正评论没有提交正文的问题特价商品的调用连接问题去掉了一个后门补了SQL注入补了一个过滤漏洞浮动价不能删除的问题不能够搜索问题收藏时放入购物车时出错点放入购物车弹出2个窗口修正主题添加问题商家注册页导航连接问题销售排行不能显示更多问题热点商品不能显示更多问题增加了服务器探测 增加了空间使用查看 增加了在线文件编辑增加了后台管理里两处全选功能更新说明:后台的部分功能已经改过前台
推荐用 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)后立刻退出,客户端可能收不到完整响应









