客户端和服务器已成功建立 TCP 连接【输出解析】

文章目录

      • 图片
      • [**1. 连接状态解析**](#1. 连接状态解析)
        • **第一条记录(服务器监听)**
        • [**第二条记录(客户端 → 服务器)**](#第二条记录(客户端 → 服务器))
        • [**第三条记录(服务器 → 客户端)**](#第三条记录(服务器 → 客户端))
      • [**2. 关键概念澄清**](#2. 关键概念澄清)
        • [**(1) `0.0.0.0` 的含义**](#(1) 0.0.0.0 的含义)
        • [**(2) 端口号的分配规则**](#(2) 端口号的分配规则)
      • [**3. 为什么服务器端的端口号变成了5046?**](#3. 为什么服务器端的端口号变成了5046?)
      • [**4. 验证方法**](#4. 验证方法)
        • [**(1) 客户端代码确认**](#(1) 客户端代码确认)
        • [**(2) 多次连接测试**](#(2) 多次连接测试)
      • [**5. 总结**](#5. 总结)
      • [**1. `netstat` 输出解析**](#1. netstat 输出解析)
      • [**2. 为什么会有两条 `ESTABLISHED` 记录?**](#2. 为什么会有两条 ESTABLISHED 记录?)
      • [**3. 如何验证通信正常?**](#3. 如何验证通信正常?)
        • [**(1) 客户端控制台输出**](#(1) 客户端控制台输出)
        • [**(2) 服务器日志验证**](#(2) 服务器日志验证)
      • [**4. 后续操作建议**](#4. 后续操作建议)
        • [**(1) 确认登录成功逻辑**](#(1) 确认登录成功逻辑)
        • [**(2) 优化心跳机制(可选)**](#(2) 优化心跳机制(可选))
        • [**(3) 处理异常断开**](#(3) 处理异常断开)
      • **总结**

图片

这里也能看,不过我已经关了

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地址)。
    服务器程序(PID 15380)正在监听所有接口 的 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 :
    服务器(PID 15380)通过 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 始终是服务器端口(PID 15380)。
  • 5046 是客户端(PID 17836)的临时端口,用于与服务器通信。

4. 验证方法

(1) 客户端代码确认

检查客户端连接代码:

python 复制代码
s = socket.socket()
s.connect(("192.168.31.222", 54321))  # 客户端明确连接服务器的54321端口
(2) 多次连接测试

每次重启客户端,观察临时端口是否变化:

powershell 复制代码
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,PID 4056)与服务器(端口 54321,PID 20060)建立了双向连接。
    • ESTABLISHED 状态表示连接已建立,正在通信(符合预期)。

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秒,减少网络流量):

    python 复制代码
    time.sleep(30)  # 修改保活线程的休眠时间
(3) 处理异常断开
  • 在客户端和服务器中添加重连逻辑,防止因网络波动导致连接中断后无法自动恢复。

总结

当前 netstat 输出完全正常,说明:

  1. 服务器已正确监听端口54321;
  2. 客户端成功连接并保持通信;
  3. TCP连接双向畅通,数据交互正常。

你可以继续开发上位机的其他功能,或进行跨设备测试(确保防火墙放行端口,使用局域网IP连接)。如果遇到新问题,请提供具体现象或日志,以便进一步分析。

相关推荐
hz5678929 分钟前
涉密视频会议设备配置指南:终端、音视频采集与配套设施选型
服务器·网络·数据库·安全·实时音视频·信息与通信·智能硬件
广州浮点FLOATLIC34 分钟前
许可证服务器迁移后软件打不开:研发 IT 怎样定位连接问题
linux·服务器·数据库
优橙教育38 分钟前
零基础学AI应用开发要多久?3个月能到什么水平
服务器·开发语言·网络·php
AIgorithmGEEK1 小时前
[Linux]从手写报头到内核套路:序列化、反序列化与自定义协议全链路
linux·运维·服务器·网络·序列化·反序列化
Nil2081 小时前
leetcode 139单词拆分
linux·运维·服务器
Starry-sky(jing)1 小时前
BUG: unable to handle kernel paging request 完整排查:dmesg 四要素与三路定罪
linux·运维·服务器·内核·排障
mounter6251 小时前
从硬件互连到操作系统变革:CXL 技术演进与 Linux 内核工程挑战
linux·运维·服务器
zhengqweasd1 小时前
机房托管服务器怎么选硬盘,机械盘和 SSD 托管场景差异
运维·服务器·github
xh didida3 小时前
Linux -- 基础IO
linux·服务器·开发语言·c++