
本文介绍使用 go 语言读取 json 配置文件,动态遍历 tcp/udp 端口列表并执行连接测试的完整实现,包含结构体定义、文件解析、错误处理与可扩展设计。
本文介绍使用 go 语言读取 json 配置文件,动态遍历 tcp/udp 端口列表并执行连接测试的完整实现,包含结构体定义、文件解析、错误处理与可扩展设计。
在实际运维或网络健康检查场景中,常需对目标主机的一组关键端口(如 HTTP 80、HTTPS 443、DNS 53、SSH 22 等)进行连通性验证。手动硬编码每个 net.Dial 调用既不灵活也不可维护。Go 提供了简洁而强大的标准库支持——通过 encoding/json(或 gopkg.in/yaml.v3)解析外部配置,并结合 net.Dial 实现声明式端口探测。
以下是一个生产就绪的示例程序,支持从 ports.json 文件读取协议类型与端口号,并逐项发起连接尝试:
package main
import (
"encoding/json"
"fmt"
"net"
"os"
"time"
)
// portDef 定义单个端口探测项:协议 + 端口号
type portDef struct {
Port int `json:"port"`
Protocol string `json:"protocol"`
}
func main() {
host := "golang.org" // 可替换为命令行参数或环境变量,提升复用性
// 1. 打开配置文件
file, err := os.Open("ports.json")
if err != nil {
fmt.Fprintf(os.Stderr, "❌ 无法打开配置文件: %v\n", err)
os.Exit(1)
}
defer file.Close()
// 2. 解析 JSON 到结构体切片
var ports []portDef
if err := json.NewDecoder(file).Decode(&ports); err != nil {
fmt.Fprintf(os.Stderr, "❌ JSON 解析失败: %v\n", err)
os.Exit(1)
}
// 3. 遍历并探测每个端口(带超时控制)
fmt.Printf("? 开始检测 %s 的 %d 个端口...\n", host, len(ports))
for i, p := range ports {
addr := fmt.Sprintf("%s:%d", host, p.Port)
// 设置 3 秒连接超时,避免阻塞
conn, err := net.DialTimeout(p.Protocol, addr, 3*time.Second)
if err != nil {
fmt.Printf(" [%d] %s://%s → ❌ 失败: %v\n", i+1, p.Protocol, addr, err)
continue
}
conn.Close()
fmt.Printf(" [%d] %s://%s → ✅ 成功\n", i+1, p.Protocol, addr)
}
fmt.Println("✅ 端口检测完成。")
}
? 配置文件示例(ports.json):
[
{"port": 80, "protocol": "tcp"},
{"port": 443, "protocol": "tcp"},
{"port": 53, "protocol": "udp"},
{"port": 22, "protocol": "tcp"}
]
✅ 关键增强点说明:
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
- 使用
net.DialTimeout替代net.Dial,防止因防火墙/丢包导致无限等待; - 每次连接后显式调用
conn.Close(),释放系统资源; - 错误输出重定向至
os.Stderr,符合 Unix 哲学; - 添加序号与状态图标(✅/❌),提升终端可读性;
- 支持任意合法协议名(如
"tcp"、"tcp4"、"udp"、"udp4"),由net.Dial底层自动处理。
? 进阶建议:
- 若需 YAML 支持,可引入第三方库
gopkg.in/yaml.v3,仅需将json.NewDecoder(...)替换为yaml.NewDecoder(...),结构体 tag 改为`yaml:"port"`; - 可通过
flag包接收-host和-config参数,实现 CLI 工具化; - 对高并发需求,可用
sync.WaitGroup+ goroutine 并行探测(注意控制并发数,避免触发目标限流)。
该方案兼顾简洁性、健壮性与可扩展性,是 Go 网络诊断脚本的典型实践范式。










