C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C# TCP通信协议

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

作者:工业视觉开发

本文主要介绍了C#基于TCP通信协议的实现示例,详细解释了TCP协议的三次握手和四次挥手过程,并通过生活例子帮助理解网络编程的概念,感兴趣的可以了解一下

一、前言

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

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

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

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

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

1. 什么是网络编程?

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

2. TCP 网络编程核心原理

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

(1)核心特性

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

类比生活中 “打电话”:

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

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

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

代码中

new TcpClient(server, port)

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

AcceptTcpClient()

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

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

类比 “挂电话”:

代码中

stream.Close()

+

client.Close()

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

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

1. TCP 客户端完整代码

using System;
using System.Net.Sockets;
using System.Text;
​
namespace TCpClient
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 定义服务器的IP地址和端口号
            string serverIp = "172.16.0.14"; // 替换为实际服务器IP(本机测试可填127.0.0.1)
            int serverPort = 9898;
​
            TcpClient tcpClient = null;
            NetworkStream networkStream = null;
​
            try
            {
                // 1. 建立TCP连接(底层三次握手)
                tcpClient = new TcpClient(serverIp, serverPort);
                Console.WriteLine($"成功连接到服务器 {serverIp}:{serverPort}");
​
                // 2. 获取网络流(用于数据收发)
                networkStream = tcpClient.GetStream();
​
                // 3. 发送数据到服务器
                Console.WriteLine("请输入要发送的消息:");
                string sendMessage = Console.ReadLine();
                byte[] sendData = Encoding.UTF8.GetBytes(sendMessage);
                networkStream.Write(sendData, 0, sendData.Length);
                Console.WriteLine($"客户端已发送:{sendMessage}");
​
                // 4. 接收服务器响应
                byte[] receiveBuffer = new byte[256]; // 定义缓冲区存储接收的数据
                int receiveBytes = networkStream.Read(receiveBuffer, 0, receiveBuffer.Length);
                string receiveMessage = 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 服务器完整代码

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
​
namespace TCPServer
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 定义监听端口
            int listenPort = 9898;
            TcpListener tcpListener = null;
            TcpClient client = null;
            NetworkStream networkStream = null;
​
            try
            {
                // 1. 初始化监听器并启动监听
                tcpListener = new TcpListener(IPAddress.Any, listenPort);
                tcpListener.Start();
                Console.WriteLine($"服务器已启动,正在监听端口 {listenPort}...");
​
                // 2. 循环等待客户端连接(单线程,仅处理一个客户端)
                while (true)
                {
                    // 阻塞等待客户端连接
                    client = tcpListener.AcceptTcpClient();
                    Console.WriteLine("有客户端成功连接!");
​
                    // 3. 获取网络流,处理数据交互
                    networkStream = client.GetStream();
                    byte[] receiveBuffer = new byte[256];
                    int readBytes;
​
                    // 循环读取客户端发送的数据(直到客户端断开)
                    while ((readBytes = networkStream.Read(receiveBuffer, 0, receiveBuffer.Length)) != 0)
                    {
                        // 解析接收的字节数据为字符串
                        string receiveMessage = Encoding.UTF8.GetString(receiveBuffer, 0, readBytes);
                        Console.WriteLine($"服务器收到客户端数据:{receiveMessage}");
​
                        // 4. 向客户端发送响应
                        string responseMessage = "已收到客户端消息";
                        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. 环境准备

2. 运行步骤

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

再运行

TCP 客户端程序

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

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

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

六、代码拓展与注意事项

1. 代码局限性(进阶优化方向)

2. 实际应用场景

TCP 网络编程广泛用于:

七、总结

本文的示例代码实现了最基础的 TCP 客户端 - 服务器通信:客户端发起连接并发送字符串,服务器监听连接、接收数据并返回响应。背后的核心是 TCP 协议的 “面向连接、可靠性”,通过三次握手建立连接、四次挥手断开连接,借助NetworkStream完成字节级的数据传输。

生活中的 “打电话、快递、点餐” 等例子能帮助理解:网络编程本质是让不同设备按约定规则 “对话”,而 TCP 是保证这次 “对话” 稳定、可靠的 “沟通规则”。初学者掌握基础流程后,可进一步学习多线程服务器、粘包处理、异步 IO 等进阶内容,实现更贴近实际场景的网络程序。

到此这篇关于C#基于TCP通信协议的实现示例的文章就介绍到这了,更多相关C# TCP通信协议内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文