当前位置: 首页 > news >正文

C#基于TCP通信协议的实现示例

1. 客户端代码(TCpClient/Program.cs)

该代码实现了一个基础的 TCP 客户端程序,核心逻辑是与指定 IP 和端口的 TCP 服务器建立连接,向服务器发送控制台输入的字符串数据,并接收服务器的响应数据,最后释放连接资源。核心步骤包括:

  • 定义服务器 IP(172.16.0.14)和端口(9898);
  • 通过TcpClient发起连接(底层触发 TCP 三次握手);
  • 获取NetworkStream网络流,完成数据的发送与接收;
  • 异常捕获与资源释放(关闭流和连接,底层触发 TCP 四次挥手)。

2. 服务器端代码(TCPServer/Program.cs)

该代码实现了一个基础的 TCP 服务器程序,核心逻辑是监听指定端口(9898),等待并接收客户端连接,读取客户端发送的数据,向客户端返回响应,同时保留了另一版监听8888端口的注释代码。核心步骤包括:

  • 绑定并监听9898端口;
  • 阻塞等待客户端连接(AcceptTcpClient());
  • 获取NetworkStream,循环读取客户端数据并返回响应;
  • 异常捕获与资源释放。

二、网络编程核心概念与原理

1. 什么是网络编程?

网络编程是指编写运行在不同设备(计算机、嵌入式设备等)上的程序,通过网络协议实现设备间的数据通信。简单来说,就是让两台 / 多台设备 “对话” 的编程方式。其核心目标是跨设备的数据传输与交互,依赖 TCP/IP 协议族等基础网络协议,TCP 是其中最常用的 “可靠传输协议”。

2. TCP 网络编程核心原理

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接、可靠、基于字节流的传输层协议,也是本次示例代码的核心依赖:

(1)核心特性
  • 面向连接:通信前必须通过 “三次握手” 建立连接,通信结束通过 “四次挥手” 断开连接;
  • 可靠性:通过序列号、确认应答、重传机制保证数据不丢失、不重复、按序到达;
  • 字节流:数据以 “字节” 为单位连续传输,无边界(需通过缓冲区和读取长度判断数据范围)。

(2)三次握手(建立连接)

类比生活中 “打电话”:

客户端 → 服务器:“喂,能听到吗?”(SYN 报文,请求建立连接);

服务器 → 客户端:“能听到,你能听到我吗?”(SYN+ACK 报文,确认请求并反问);

客户端 → 服务器:“能听到,开始沟通吧!”(ACK 报文,连接建立)。

代码中

1

newTcpClient(server, port)

是客户端发起第一次握手,

1

AcceptTcpClient()

是服务器完成三次握手的关键操作。

(3)四次挥手(断开连接)

类比 “挂电话”:

  • 主动方 → 被动方:“我说完了,准备挂了”(FIN 报文,请求断开);
  • 被动方 → 主动方:“知道你说完了,我确认下数据”(ACK 报文,确认断开请求);
  • 被动方 → 主动方:“我也说完了,你可以挂了”(FIN 报文,告知数据发完);
  • 主动方 → 被动方:“好的,挂了”(ACK 报文,断开连接)。

代码中

1

stream.Close()

+

1

client.Close()

是触发四次挥手的核心操作。

三、完整示例代码(可直接运行)

1. TCP 客户端完整代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

usingSystem;

usingSystem.Net.Sockets;

usingSystem.Text;

namespaceTCpClient

{

internalclassProgram

{

staticvoidMain(string[] args)

{

// 定义服务器的IP地址和端口号

stringserverIp ="172.16.0.14";// 替换为实际服务器IP(本机测试可填127.0.0.1)

intserverPort = 9898;

TcpClient tcpClient =null;

NetworkStream networkStream =null;

try

{

// 1. 建立TCP连接(底层三次握手)

tcpClient =newTcpClient(serverIp, serverPort);

Console.WriteLine($"成功连接到服务器 {serverIp}:{serverPort}");

// 2. 获取网络流(用于数据收发)

networkStream = tcpClient.GetStream();

// 3. 发送数据到服务器

Console.WriteLine("请输入要发送的消息:");

stringsendMessage = Console.ReadLine();

byte[] sendData = Encoding.UTF8.GetBytes(sendMessage);

networkStream.Write(sendData, 0, sendData.Length);

Console.WriteLine($"客户端已发送:{sendMessage}");

// 4. 接收服务器响应

byte[] receiveBuffer =newbyte[256];// 定义缓冲区存储接收的数据

intreceiveBytes = networkStream.Read(receiveBuffer, 0, receiveBuffer.Length);

stringreceiveMessage = Encoding.UTF8.GetString(receiveBuffer, 0, receiveBytes);

Console.WriteLine($"客户端收到服务器响应:{receiveMessage}");

}

catch(Exception ex)

{

Console.WriteLine($"连接/通信异常:{ex.Message}");

}

finally

{

// 5. 释放资源(底层四次挥手)

if(networkStream !=null) networkStream.Close();

if(tcpClient !=null) tcpClient.Close();

}

Console.WriteLine("客户端程序结束,按任意键退出...");

Console.ReadKey();

}

}

}

2. TCP 服务器完整代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

usingSystem;

usingSystem.Net;

usingSystem.Net.Sockets;

usingSystem.Text;

namespaceTCPServer

{

internalclassProgram

{

staticvoidMain(string[] args)

{

// 定义监听端口

intlistenPort = 9898;

TcpListener tcpListener =null;

TcpClient client =null;

NetworkStream networkStream =null;

try

{

// 1. 初始化监听器并启动监听

tcpListener =newTcpListener(IPAddress.Any, listenPort);

tcpListener.Start();

Console.WriteLine($"服务器已启动,正在监听端口 {listenPort}...");

// 2. 循环等待客户端连接(单线程,仅处理一个客户端)

while(true)

{

// 阻塞等待客户端连接

client = tcpListener.AcceptTcpClient();

Console.WriteLine("有客户端成功连接!");

// 3. 获取网络流,处理数据交互

networkStream = client.GetStream();

byte[] receiveBuffer =newbyte[256];

intreadBytes;

// 循环读取客户端发送的数据(直到客户端断开)

while((readBytes = networkStream.Read(receiveBuffer, 0, receiveBuffer.Length)) != 0)

{

// 解析接收的字节数据为字符串

stringreceiveMessage = Encoding.UTF8.GetString(receiveBuffer, 0, readBytes);

Console.WriteLine($"服务器收到客户端数据:{receiveMessage}");

// 4. 向客户端发送响应

stringresponseMessage ="已收到客户端消息";

byte[] responseData = Encoding.UTF8.GetBytes(responseMessage);

networkStream.Write(responseData, 0, responseData.Length);

Console.WriteLine($"服务器已发送响应:{responseMessage}");

}

}

}

catch(Exception ex)

{

Console.WriteLine($"服务器异常:{ex.ToString()}");

}

finally

{

// 5. 释放资源

if(networkStream !=null) networkStream.Close();

if(client !=null) client.Close();

if(tcpListener !=null) tcpListener.Stop();

}

Console.WriteLine("服务器程序结束,按任意键退出...");

Console.ReadKey();

}

}

}

四、代码运行说明

1. 环境准备

  • 开发工具:Visual Studio 2019/2022(或其他支持.NET Framework/.NET Core 的 IDE);
  • 框架版本:.NET Framework 4.5+ 或 .NET Core 3.1+(代码兼容)。

2. 运行步骤

先运行TCP 服务器程序:控制台输出 “服务器已启动,正在监听端口 9898...”;

再运行

TCP 客户端程序

  • 客户端控制台提示 “成功连接到服务器”;
  • 输入任意字符串(如 “Hello Server!”)并回车;
  • 客户端显示 “已发送”,并接收服务器响应 “已收到客户端消息”;
  • 服务器端显示 “有客户端成功连接”,并打印收到的 “Hello Server!”,同时提示 “已发送响应”。

五、生活例子理解 TCP 网络编程

例子 1:快递配送(类比 TCP 可靠传输)

  • 服务器 = 快递公司仓库,客户端 = 你(收件人);
  • 建立连接(三次握手):你下单(SYN)→ 仓库确认接单(SYN+ACK)→ 你确认(ACK);
  • 数据传输(可靠):仓库打包商品(数据转字节)→ 快递员配送(网络传输)→ 你签收(确认应答);若快递丢失,仓库重发(重传机制);
  • 断开连接(四次挥手):你确认收完货(FIN)→ 仓库确认(ACK)→ 仓库确认无遗漏(FIN)→ 你确认(ACK),交易结束。

例子 2:餐厅点餐(类比客户端 - 服务器交互)

  • 服务器 = 餐厅(固定位置,监听 “点餐请求”),客户端 = 顾客;
  • 监听:餐厅开门(启动TcpListener),等待顾客;
  • 建立连接:你走进餐厅(客户端发起连接),服务员接待(AcceptTcpClient);
  • 数据交互:你说 “要牛肉面”(客户端发送数据)→ 服务员回复 “好的”(服务器响应);
  • 断开连接:你吃完离开(关闭连接),服务员结束服务(释放资源)。
http://www.jsqmd.com/news/875746/

相关文章:

  • 基于模糊球模型与密度剖面拟合的微凝胶溶胀行为预测
  • 机器学习数据集批判性使用指南:从数据伦理到工程实践
  • 范畴论视角下的机器学习系统:从代数结构到工程实践
  • 聚类数据交叉验证:避免乐观偏差的团队级分割策略与算法选择
  • 基于DK距离的区间值自适应LASSO稀疏回归方法及其应用
  • iOS逆向基础:从沙盒机制到授权验证的实战指南
  • C#中预处理器指令的实现示例
  • 量子机器学习可解释性:打开量子AI黑箱的挑战与方法
  • 量子软件不稳定测试检测:基于机器学习的自动化解决方案
  • 自动驾驶感知安全监控:从不确定性估计到嵌入式部署的工程实践
  • 机器人触觉替代:用LSTM实现视觉点云到触觉信号的跨模态映射
  • C#中协变逆变的实现
  • 别再折腾Linux了!用FreeSSHD+FileZilla在Windows上5分钟搞定SFTP服务器(附Nginx文件预览)
  • 基于柯西-施瓦茨不等式的数据融合与部分识别方法
  • 拓扑信号处理进阶:狄拉克方程与IDESP算法解析
  • 广义随机占优与偏序数据:处理混合尺度数据的鲁棒统计方法
  • 第一性原理与机器学习融合的高通量材料筛选:以无铅钙钛矿为例
  • C#实现ASCII和字符串相互转换的代码示例
  • 别再乱改系统时间了!Linux服务器时间漂移的终极排查与修复指南(hwclock实战)
  • 基于大数据与机器学习的金融风险监控系统架构与实战
  • 机器学习加速高精度CFD:基于分区POD与加权RBF的翼型流场快速预测
  • 量子高斯过程在电网参数辨识中的应用:NISQ时代的工程实践
  • Cortex-R82 AXI接口256位事务机制与优化
  • 语义网与知识图谱:从RDF三元组到LLM融合的技术演进与应用实战
  • SPACIER系统:贝叶斯优化与分子动力学融合的聚合物智能设计
  • 线性最优传输(LOT)在点云数据处理中的应用:从理论到实践
  • VMware里CentOS磁盘挂了别急着重装!记一次xfs文件系统修复实战,省下半天配置时间
  • 量子计算与生成式AI融合:自动化电路生成技术解析
  • 告别混乱:如何在不同Linux发行版(openEuler/Ubuntu)和Windows上彻底卸载AWS CLI v2
  • 几何量子机器学习:利用对称性原理破解贫瘠高原与设计高效算法