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

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

1.1主动模式(Active Mode)

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

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

优势

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

局限性与适用性

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

1.2 被动模式(Passive Mode)

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

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

优势

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

局限性与适用性

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

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

2.1 主动模式(Active Mode)

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

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());
        }
    }
}

服务器代码

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)

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

服务器代码

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());
            }
        }
    }
}

客户端代码

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连接。
  • 被动模式: 服务器被动监听端口,等待客户端发起连接。服务器在接收到客户端的连接请求后,接受连接并进行数据交换。

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

查看全部
点赞(146) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部