C#中网口数据(TCP/IP)发送与接收的主动模式与被动模式解析

在C#中,进行网络数据传输时,我们常常需要通过串口(网口)来进行数据的发送与接收。在串口通信中,有两种主要的通信模式:主动模式和被动模式。本文将详细阐述这两种模式之间的区别,以及在实际应用中的不同场景和优势。

1.主动模式与被动模式的区别

1.1主动模式(Active Mode)

在主动模式下,通信双方中的主动方(通常为主机)负责发起数据传输请求,而被动方(通常为从机)则处于被动接收的状态。
特点

  • 主动方负责发起连接和数据传输,控制权在主动方手中。
  • 被动方只需响应主动方的请求,无需主动发起通信。
  • 通常适用于客户端-服务器架构。

优势

  • 易于管理和控制,因为主动方可以决定何时发送数据。
  • 在某些应用场景中,如实时监控系统,可以确保数据的实时性和准确性。

局限性与适用性

  • 局限性:主动模式下,如果主动方发送数据过快,而被动方处理数据较慢,可能导致数据丢失或缓冲区溢出。
  • 适用性:适用于客户端需要周期性获取数据的应用场景,如远程监控、数据采集等。

1.2 被动模式(Passive Mode)

在被动模式下,通信双方中的被动方(通常为主机)负责等待数据传输请求,而主动方(通常为从机)则负责发起请求。
特点

  • 被动方负责等待并接收数据,控制权在被动方手中。
  • 主动方在需要发送数据时,主动发起请求,但需等待被动方的响应。
  • 通常适用于点对点通信。

优势

  • 适用于从机数量较多的场景,因为每个从机仅需响应来自主机的请求。
  • 可以有效避免数据冲突和网络拥塞,因为从机不会同时发送数据。

局限性与适用性

  • 局限性:被动模式下,如果从机数量较多,主机可能会面临较大的响应压力。
  • 适用性:适用于从机数量较多,且通信较为简单的应用场景,如家居自动化、小型局域网等。

2.主动模式与被动模式的应用实例

2.1 主动模式(Active Mode)

在主动模式下,客户端负责发起网络连接。客户端知道服务器的IP地址和端口,因此它会向这些信息发起TCP连接。客户端会主动向服务器发送数据,并等待服务器响应。
客户端代码

csharp 复制代码
using System;
using System.Net.Sockets;
using System.Text;
using System.Threading;
class TcpClientExample
{
    public void SendReceiveData(string serverIp, int serverPort)
    {
        try
        {
            TcpClient client = new TcpClient(serverIp, serverPort);
            NetworkStream stream = client.GetStream();
            byte[] data = Encoding.ASCII.GetBytes("Hello, Server!");
            stream.Write(data, 0, data.Length);
            byte[] buffer = new byte[1024];
            int read = stream.Read(buffer, 0, buffer.Length);
            string receivedData = Encoding.ASCII.GetString(buffer, 0, read);
            Console.WriteLine("Received data from server: " + receivedData);
            client.Close();
        }
        catch (SocketException socketException)
        {
            Console.WriteLine("SocketException " + socketException.ToString());
        }
    }
}

服务器代码

csharp 复制代码
using System;
using System.Net.Sockets;
using System.Text;
using System.Threading;
class TcpServerExample
{
    private TcpListener tcpListener;
    private Thread tcpListenerThread;
    public void StartServer(int port)
    {
        tcpListenerThread = new Thread(() => ListenForIncomingRequests(port));
        tcpListenerThread.IsBackground = true;
        tcpListenerThread.Start();
    }
    private void ListenForIncomingRequests(int port)
    {
        try
        {
            tcpListener = new TcpListener(IPAddress.Any, port);
            tcpListener.Start();
            Byte[] bytes = new Byte[1024];
            while (true)
            {
                using (TcpClient client = tcpListener.AcceptTcpClient())
                {
                    using (NetworkStream stream = client.GetStream())
                    {
                        int length;
                        while ((length = stream.Read(bytes, 0, bytes.Length)) != 0)
                        {
                            var incomingData = new byte[length];
                            Array.Copy(bytes, 0, incomingData, 0, length);
                            var clientMessage = Encoding.ASCII.GetString(incomingData);
                            Console.WriteLine("Received data from client: " + clientMessage);
                            byte[] responseData = Encoding.ASCII.GetBytes("Received your message!");
                            stream.Write(responseData, 0, responseData.Length);
                        }
                    }
                }
            }
        }
        catch (SocketException socketException)
        {
            Console.WriteLine("SocketException " + socketException.ToString());
        }
    }
}

2. 2 被动模式(Passive Mode)

在被动模式下,服务器被动地监听特定的端口,等待客户端发起连接。当服务器收到客户端的连接请求后,服务器会接受连接并开始通信。在这种模式下,服务器不会主动向客户端发送数据,而是等待客户端发送数据给它。

服务器代码

csharp 复制代码
using System;
using System.Net.Sockets;
using System.Text;
using System.Threading;
class TcpServerExample
{
    private TcpListener tcpListener;
    //private Thread tcpListenerThread;
     public void ListenForIncomingRequests(int port)
        {
            try
            {
                tcpListener = new TcpListener(IPAddress.Any, port);
                tcpListener.Start();
                Byte[] bytes = new Byte[1024];
                while (true)
                {
                    using (TcpClient client = tcpListener.AcceptTcpClient())
                    {
                        using (NetworkStream stream = client.GetStream())
                        {
                            int length;
                            while ((length = stream.Read(bytes, 0, bytes.Length)) != 0)
                            {
                                var incomingData = new byte[length];
                                Array.Copy(bytes, 0, incomingData, 0, length);
                                var clientMessage = Encoding.ASCII.GetString(incomingData);
                                Console.WriteLine("Received data from client: " + clientMessage);
                                byte[] responseData = Encoding.ASCII.GetBytes("Received your message!");
                                stream.Write(responseData, 0, responseData.Length);
                            }
                        }
                    }
                }
            }
            catch (SocketException socketException)
            {
                Console.WriteLine("SocketException " + socketException.ToString());
            }
        }
    }
}

客户端代码

csharp 复制代码
using System;
using System.Net.Sockets;
using System.Text;
using System.Threading;

class TcpClientExample
{
    public void SendReceiveData(string serverIp, int serverPort)
    {
        try
        {
            TcpClient client = new TcpClient(serverIp, serverPort);
            NetworkStream stream = client.GetStream();
            byte[] data = Encoding.ASCII.GetBytes("Hello, Server!");
            stream.Write(data, 0, data.Length);

            byte[] buffer = new byte[1024];
            int read = stream.Read(buffer, 0, buffer.Length);
            string receivedData = Encoding.ASCII.GetString(buffer, 0, read);
            Console.WriteLine("Received data from server: " + receivedData);

            client.Close();
        }
        catch (SocketException socketException)
        {
            Console.WriteLine("SocketException " + socketException.ToString());
        }
    }
}

3. 总结

  • 主动模式: 客户端主动发起连接,服务器被动等待连接。客户端知道服务器的IP地址和端口,并向这些信息发起TCP连接。
  • 被动模式: 服务器被动监听端口,等待客户端发起连接。服务器在接收到客户端的连接请求后,接受连接并进行数据交换。

在实际应用中,根据需求选择合适的模式。例如,一个简单的聊天应用程序通常使用主动模式,因为客户端需要主动向服务器发送消息。而一个网页服务器通常使用被动模式,因为它监听来自不同客户端的请求,而不是主动发送数据。

相关推荐
博客-小覃5 分钟前
Zabbix之华为交换机的日志记录信息操作详细教程
服务器·网络·华为·zabbix
stolentime23 分钟前
FreeDomain 本地开发环境快速搭建指南
运维·服务器·网络
ytdbc1 小时前
OSPF综合实验
网络
kaisun642 小时前
Docker 构建网络问题排查
网络·docker·eureka
雪度娃娃3 小时前
存储器层次结构——磁盘硬盘存储
服务器·网络·数据库·计算机组成原理
YUANQIANG20243 小时前
通信领域进行蒙特卡洛仿真的思路和步骤
网络
eam0511233 小时前
OSPF综合实验
网络
QQ15401828563 小时前
USB转千兆以太网芯片方案
网络·pt153s·千兆以太网芯片·usb转以太网·千兆网口芯片
曦夜日长4 小时前
Linux系统篇,进程概念(一):计算机体系、操作系统的认识、程序的加载过程
linux·运维·网络
似水এ᭄往昔4 小时前
【Linux网络编程】--Socket编程预备
linux·服务器·网络