如何使用Golang监听TCP端口_Golang net包TCP服务器实践方法
发布时间 - 2026-01-22 00:00:00 点击率:次端口被占用时应启用SO_REUSEADDR或改用随机端口":0";accept后须用goroutine并发处理连接;Read需区分io.EOF与真实错误;上线前需检查监听地址、本地防火墙及云安全组规则。
listen 函数启动监听时端口被占用怎么办
直接调用 net.Listen("tcp", ":8080") 会 panic 报错 listen tcp :8080: bind: address already in use,这不是代码写错了,而是系统层面端口冲突。常见于上次程序没正常退出、其他服务占用了该端口,或快速重启时 TIME_WAIT 状态未释放。
解决方法不是“等几秒再试”,而是让 socket 复用地址:
ln, err := net.Listen("tcp", ":8080")
if err != nil {
log.Fatal(err)
}
// 启用 SO_REUSEADDR(Go 默认已设,但某些系统需显式确认)
// 实际更关键的是:确保上一次连接彻底关闭,或换端口调试
开发阶段建议用随机空闲端口测试:net.Listen("tcp", ":0"),之后用 ln.Addr().(*net.TCPAddr).Port 获取实际分配的端口。
accept 后不处理连接会导致服务器假死
ln.Accept() 是阻塞调用,每次只返回一个 net.Conn。如果在 for 循环里接收后不做 goroutine 并发处理,新连接会排队等待,看起来“服务器卡住”——其实是在串行处理。
必须为每个连接启动独立 goroutine:
- 不加 goroutine:所有连接按顺序处理,延迟随并发数线性增长
- 加 goroutine:每个连接独立读写,但要注意资源控制(如最大连接数、超时)
- 典型错误是忘记 recover,导致 panic 使整个 accept 循环中断
for {
conn, err := ln.Accept()
if err != nil {
log.Println("accept error:", err)
continue // 别 break,否则监听直接结束
}
go handleConnection(conn) // 必须在这里启 goroutine
}
conn.Read 调用时客户端断开怎么避免 panic
conn.Read() 在对方关闭连接时返回 io.EOF,不是错误,不应记录为异常。但若忽略判断直接继续读,可能触发重复 close 或 panic。
正确做法是区分三类返回值:
-
n == 0 &&:罕见,通常可忽略或重试
err == nil
-
err == io.EOF:对方正常关闭,应 clean up 并 return -
err != nil && err != io.EOF:真实网络错误(如 timeout、broken pipe),需记录并关闭
buf := make([]byte, 1024)
for {
n, err := conn.Read(buf)
if err != nil {
if err == io.EOF {
log.Println("client closed connection")
} else {
log.Println("read error:", err)
}
break
}
// 处理 buf[:n]
}
conn.Close()
为什么 TCP 服务器上线后立刻被防火墙拦截
本地跑通不代表线上可用。Linux 服务器默认启用 iptables 或 nftables,且云厂商(如阿里云、AWS)安全组默认拒绝所有入向流量。
检查项必须逐个确认:
- 运行
ss -tlnp | grep :8080确认 Go 进程确实在监听0.0.0.0:8080(不是127.0.0.1:8080) - 执行
sudo ufw status或sudo iptables -L INPUT -n查看本地防火墙规则 - 登录云控制台,检查安全组是否放行对应端口的 TCP 入向规则
- 若用 systemd 管理服务,确认
Capabilities=CAP_NET_BIND_SERVICE(如需绑定 1024 以下端口)
Go 本身不处理防火墙,但 listen 地址写成 ":8080" 等价于 "0.0.0.0:8080",这点容易被忽略——写成 "127.0.0.1:8080" 就只能本机访问。
# linux
# go
# golang
# 防火墙
# 端口
# 阿里云
# ai
# 解决方法
# 为什么
# EOF
# for
# 循环
# nil
# 并发
# input
# 的是
# 云安
# 是在
# 在这里
# 不代表
# 错了
# 用了
# 这不是
# 线上
# 不做
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
深圳网站制作培训,深圳哪些招聘网站比较好?
免费视频制作网站,更新又快又好的免费电影网站?
宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
郑州企业网站制作公司,郑州招聘网站有哪些?
jQuery validate插件功能与用法详解
黑客如何通过漏洞一步步攻陷网站服务器?
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
JS中对数组元素进行增删改移的方法总结
Laravel如何实现用户密码重置功能?(完整流程代码)
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
如何在新浪SAE免费搭建个人博客?
Laravel如何实现事件和监听器?(Event & Listener实战)
如何用PHP快速搭建CMS系统?
如何为不同团队 ID 动态生成多个“认领值班”按钮
bing浏览器学术搜索入口_bing学术文献检索地址
5种Android数据存储方式汇总
php结合redis实现高并发下的抢购、秒杀功能的实例
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
Python函数文档自动校验_规范解析【教程】
Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
javascript日期怎么处理_如何格式化输出
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决
如何用wdcp快速搭建高效网站?
济南网站建设制作公司,室内设计网站一般都有哪些功能?
如何快速搭建虚拟主机网站?新手必看指南
Laravel如何使用withoutEvents方法临时禁用模型事件
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
动图在线制作网站有哪些,滑动动图图集怎么做?
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
百度输入法全感官ai怎么关 百度输入法全感官皮肤关闭
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
bootstrap日历插件datetimepicker使用方法
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
如何用好域名打造高点击率的自主建站?
EditPlus 正则表达式 实战(3)
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
*服务器网站为何频现安全漏洞?


