文章目录
图片
这里也能看,不过我已经关了
PS C:\Users\14733> netstat -ano | findstr “:54321”
TCP 0.0.0.0:54321 0.0.0.0:0 LISTENING 15380
TCP 192.168.31.222:5046 192.168.31.222:54321 ESTABLISHED 17836
TCP 192.168.31.222:54321 192.168.31.222:5046 ESTABLISHED 15380
根据你的 netstat
输出,我来解释这些数字和状态的含义:
1. 连接状态解析
TCP 0.0.0.0:54321 0.0.0.0:0 LISTENING 15380
TCP 192.168.31.222:5046 192.168.31.222:54321 ESTABLISHED 17836
TCP 192.168.31.222:54321 192.168.31.222:5046 ESTABLISHED 15380
第一条记录(服务器监听)
0.0.0.0:54321
:
0.0.0.0
表示所有可用的网络接口(包括本地回环127.0.0.1
和所有网卡的IP地址)。
服务器程序(PID15380
)正在监听所有接口的54321
端口,等待客户端连接。
第二条记录(客户端 → 服务器)
192.168.31.222:5046 → 192.168.31.222:54321
:5046
是客户端临时端口(由操作系统随机分配,范围通常是1024-65535
)。54321
是服务器固定端口(即你在代码中指定的PORT = 54321
)。- 客户端程序(PID
17836
)通过5046
端口向服务器54321
端口发送数据。
第三条记录(服务器 → 客户端)
192.168.31.222:54321 → 192.168.31.222:5046
:
服务器(PID15380
)通过54321
端口向客户端5046
端口回复数据。
2. 关键概念澄清
(1) 0.0.0.0
的含义
监听时:
0.0.0.0:54321
表示服务器监听所有可用网络接口的54321
端口。
客户端可以通过服务器的任何IP地址(如127.0.0.1
、192.168.31.222
或公网IP)连接到该端口。连接时:
0.0.0.0
无意义(因为客户端必须明确指定服务器IP)。
(2) 端口号的分配规则
服务器端口(如
54321
):
由程序显式指定,必须唯一且未被其他程序占用。客户端临时端口(如
5046
):
由操作系统随机分配(范围通常是1024-65535
),用于标识客户端进程。
每次新连接建立时,操作系统会分配一个未被使用的临时端口。
3. 为什么服务器端的端口号变成了5046?
这是一个常见误解:
- 服务器始终使用固定端口(如
54321
)接收所有客户端连接。 - 客户端临时端口(如
5046
)是客户端的出口端口,用于区分同一客户端的不同连接。
在你的输出中:
54321
始终是服务器端口(PID15380
)。5046
是客户端(PID17836
)的临时端口,用于与服务器通信。
4. 验证方法
(1) 客户端代码确认
检查客户端连接代码:
s = socket.socket()
s.connect(("192.168.31.222", 54321)) # 客户端明确连接服务器的54321端口
(2) 多次连接测试
每次重启客户端,观察临时端口是否变化:
PS C:\> netstat -ano | findstr ":54321"
# 第一次连接:客户端临时端口可能是5046
# 第二次连接:客户端临时端口可能变为5047、5048等
5. 总结
0.0.0.0:54321
:服务器监听所有接口的54321
端口。5046
:客户端临时端口,由操作系统随机分配,用于本次连接。- 服务器端口始终不变,客户端临时端口每次连接可能不同。
这种设计允许同一客户端同时建立多个到服务器的连接(每个连接使用不同的临时端口),也允许多个客户端同时连接到同一服务器端口。
1. netstat
输出解析
TCP 0.0.0.0:54321 0.0.0.0:0 LISTENING 20060
TCP 192.168.31.222:4376 192.168.31.222:54321 ESTABLISHED 4056
TCP 192.168.31.222:54321 192.168.31.222:4376 ESTABLISHED 20060
第一条记录:
0.0.0.0:54321 LISTENING 20060
- 服务器正在监听所有接口的54321端口(进程ID 20060,对应Python服务器程序)。
第二、三条记录:
TCP 客户端IP:临时端口 服务器IP:54321 ESTABLISHED 客户端PID TCP 服务器IP:54321 客户端IP:临时端口 ESTABLISHED 服务器PID
- 客户端(IP
192.168.31.222
,临时端口4376
,PID4056
)与服务器(端口54321
,PID20060
)建立了双向连接。 ESTABLISHED
状态表示连接已建立,正在通信(符合预期)。
- 客户端(IP
2. 为什么会有两条 ESTABLISHED
记录?
- TCP连接是双向的:
每条连接包含两个方向的数据流,因此netstat
会显示两个条目,分别表示:- 客户端到服务器的连接(客户端端口 → 服务器端口)
- 服务器到客户端的连接(服务器端口 → 客户端端口)
- 这是正常现象,说明连接完全建立且双向通信畅通。
3. 如何验证通信正常?
(1) 客户端控制台输出
应看到服务器响应的心跳包:
收到服务器响应: b'alive'
这表明客户端发送的 keep_alive
已被服务器正确接收并回应。
(2) 服务器日志验证
服务器日志应显示:
客户端 ('192.168.31.222', 4376) 连接
用户 XXX 登录成功(管理员: ...)
客户端 ('192.168.31.222', 4376) 断开连接(若手动关闭客户端)
或持续记录心跳交互(如 收到 keep_alive
)。
4. 后续操作建议
(1) 确认登录成功逻辑
- 客户端显示
登录成功
弹窗,且能正常接收服务器响应。 - 可在客户端添加更多功能,例如登录后隐藏登录界面,显示上位机主界面。
(2) 优化心跳机制(可选)
- 若不需要持续连接,可在登录成功后按需关闭连接(例如完成验证后断开)。
- 调整心跳间隔(如从5秒改为30秒,减少网络流量):
time.sleep(30) # 修改保活线程的休眠时间
(3) 处理异常断开
- 在客户端和服务器中添加重连逻辑,防止因网络波动导致连接中断后无法自动恢复。
总结
当前 netstat
输出完全正常,说明:
- 服务器已正确监听端口54321;
- 客户端成功连接并保持通信;
- TCP连接双向畅通,数据交互正常。
你可以继续开发上位机的其他功能,或进行跨设备测试(确保防火墙放行端口,使用局域网IP连接)。如果遇到新问题,请提供具体现象或日志,以便进一步分析。