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

news2025/6/9 9:14:45

文章目录

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

检查客户端连接代码:

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,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秒,减少网络流量):
    time.sleep(30)  # 修改保活线程的休眠时间
    
(3) 处理异常断开
  • 在客户端和服务器中添加重连逻辑,防止因网络波动导致连接中断后无法自动恢复。

总结

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2405174.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day26-计算机网络-4

1. tcp的11种状态 ss -ant -a 表示看所有状态 -n 表示不将ip解析为主机名 -t 表示tcp 1.1. closed状态(客户端、服务端) 客户端发起建立连接前的状态服务端启动服务前的状态 1.2. listen状态(服务端) 服务端软件运行的时候状…

国防科技大学计算机基础慕课课堂学习笔记

1.信息论 香农作为信息论的这个创始人,给出来了这个信息熵的计算方法,为我们现在的这个生活的很多领域奠定了基础,我第一次听说这个信息熵是在这个数学建模里面的理论学习中有关于这个:决策树的模型,在那个问题里面&a…

【第七篇】 SpringBoot项目的热部署

简介 本文介绍了热部署(Hot Deployment)的概念、使用场景及在IDEA中的配置方法。热部署可在不重启应用的情况下动态更新代码,提升开发效率,适用于调试、微服务架构和自动化测试等场景。文章详细说明了热部署的实现步骤&#xff08…

解决pycharm同一个文件夹下from *** import***仍显示No module named

1、,from ***import *,同文件夹中已有.py文件但是仍然报错No module named 原因是因为pycharm没有把文件夹设置为根目录,只需要在文件夹的上一级设置为根目录即可,测试过如果仅仅将当前的文件夹设置仍然报错,如果把最上…

使用 Redisson 实现分布式锁—解决方案详解

Redisson 是 Redis 官方推荐的 Java 客户端,提供了一系列分布式服务实现,其中分布式锁是其核心功能之一。本文将深入解析 Redisson 分布式锁的实现原理、高级特性和最佳实践。 一、Redisson 分布式锁的优势 与传统实现的对比 特性手动实现Redisson 实现…

结合三维基因建模与智能体技术打造工业软件无码平台

通过深度整合 Protocol Buffers (Protobuf)、gRPC 及 Microsoft AI 技术,构建面向智能制造的高性能、智能化 PLM 平台。 一、Protocol Buffers 深度集成 1. 基因模型标准化定义 三维基因容器 Protobuf 规范: protobuf syntax "proto3"; pa…

Python Day46

Task: 1.不同CNN层的特征图:不同通道的特征图 2.什么是注意力:注意力家族,类似于动物园,都是不同的模块,好不好试了才知道。 3.通道注意力:模型的定义和插入的位置 4.通道注意力后的特征图和热力…

基于PostGIS的各地级市路网长度统计及Echarts图表可视化实践-以湖南省为例

目录 前言 一、路网长度计算 1、地级市列表查询 2、地级市路网长度查询 二、Echarts可视化实现 1、Echarts后端生成 2、引入Colormap配色 3、前端微调 三、总结 前言 在当今快速发展的社会中,交通路网的建设与布局对于一个地区的经济发展、居民生活以及城市…

mac版excel如何制作时长版环形图

设置辅助列 创建簇状柱形图 将辅助列绘制在次坐标轴 工作时长在主坐标轴,右键分别更改图表类型为圆环。 辅助列圆环全部为灰色,边框为白色 辅助列设置透明度100% 设置辅助列和工作时长列同样的圆环大小 可得 核心:只要辅助列边框不透明…

【MySQL系列】MySQL 执行 SQL 文件

博客目录 一、MySQL 执行 SQL 文件的常见场景二、MySQL 执行 SQL 文件的主要方法1. 使用 MySQL 命令行客户端2. 在 MySQL 交互界面中使用 source 命令3. 使用 MySQL Workbench 等图形化工具4. 使用编程语言接口 三、执行 SQL 文件时的注意事项1. 字符集问题2. 事务处理3. 错误处…

论文MR-SVD

每个像素 7 个 FLOPs意思: FLOPs(浮点运算次数):衡量算法计算复杂度的指标,数值越小表示运算越高效。含义:对图像中每个像素进行处理时,仅需执行7 次浮点运算(如加减乘除等&#xf…

Java 日期时间类全面解析

Java 日期时间类全面解析:从传统到现代的演进 一、发展历程概览 二、传统日期类(Java 8前) 1. java.util.Date - 日期表示类 Date now new Date(); // 当前日期时间 System.out.println(now); // Wed May 15 09:30:45 CST 2023// 特定时间…

【工具-Wireshark 抓包工具】

工具-Wireshark 抓包工具 ■ Wireshark 抓包工具■ 通过IP指定查看■■ ■ Wireshark 抓包工具 抓包工具】win 10 / win 11:WireShark 下载、安装、使用 Wireshark下载 阿里云镜像 ■ 通过IP指定查看 ■ ■

设备驱动与文件系统:06 目录与文件

磁盘使用的最后一层抽象:文件系统 今天我们讲第31讲,这一讲将完成磁盘对磁盘使用的最后一层抽象。对此板使用最后一层抽象,抽象出来的是什么呢? 实际上我们使用过磁盘,大家应该有这样的认识,最后不管这个磁…

Linux 系统中的算法技巧与性能优化

引言​ Linux 系统以其开源、稳定和高度可定制的特性,在服务器端、嵌入式设备以及开发环境中得到了极为广泛的应用。对于开发者而言,不仅要掌握在 Linux 环境下实现各类算法的方法,更要知晓如何利用系统特性对算法进行优化,以提升…

【C++系列】模板类型特例化

1. C模板类型特例化介绍 ​​定义​​:模板类型特例化(Template Specialization)是C中为模板的特定类型提供定制实现的机制,允许开发者对通用模板无法处理的特殊类型进行优化或特殊处理。 ​​产生标准​​: C98/03…

K8S认证|CKS题库+答案| 7. Dockerfile 检测

目录 7. Dockerfile 检测 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、修改 Dockerfile 3)、 修改 deployment.yaml 7. Dockerfile 检测 免费获取并激活 CKA_v1.31_模拟系统 题目 您必须在以…

基于Scala实现Flink的三种基本时间窗口操作

目录 代码结构 代码解析 (1) 主程序入口 (2) 窗口联结(Window Join) (3) 间隔联结(Interval Join) (4) 窗口同组联结(CoGroup) (5) 执行任务 代码优化 (1) 时间戳分配 (2) 窗口大小 (3) 输出格式…

c++对halcon的动态链接库dll封装及调用(细细讲)

七个部分(是个大工程) 一,halcon封装函数导出cpp的内容介绍 二,c++中对halcon环境的配置 三,在配置环境下验证halcon代码 四,dll项目创建+环境配置 五,编辑dll及导出 六,调用打包好的动态链接库的配置 七,进行测试 一,halcon的封装及导出cpp的介绍 1,我这里…

【优选算法】分治

一&#xff1a;颜色分类 class Solution { public:void sortColors(vector<int>& nums) {// 三指针法int n nums.size();int left -1, right n, i 0;while(i < right){if(nums[i] 0) swap(nums[left], nums[i]);else if(nums[i] 2) swap(nums[--right], num…