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

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

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

  • 28
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
C#与三菱PLC基于TCP/IP技术进行通信,并读写数据的步骤如下: 1. 首先,确保PLC和计算机在同一个网络,并且能够相互访问。 2. 在C#,使用Socket类来实现与PLC之间的通信。你可以创建一个Socket对象,并设置其连接参数,包括PLC的IP地址和端口号。 3. 使用Socket对象的Connect方法连接到PLC。如果连接成功,你就可以发送接收数据了。 4. 在通信过程,你需要了解PLC的通信协议。三菱PLC通常使用MC Protocol进行通信。你需要根据协议规范构造正确的请求和响应消息。 5. 读取数据: - 构造读取数据的请求消息,包括要读取的寄存器地址、数据类型和读取长度等信息。 - 使用Socket对象的Send方法将请求消息发送到PLC。 - 使用Socket对象的Receive方法接收来自PLC的响应消息。 - 解析响应消息,提取所需的数据。 6. 写入数据: - 构造写入数据的请求消息,包括要写入的寄存器地址、数据类型和写入的数据等信息。 - 使用Socket对象的Send方法将请求消息发送到PLC。 - 使用Socket对象的Receive方法接收来自PLC的响应消息,以确认写入操作是否成功。 需要注意的是,具体的读写数据的请求和响应消息格式可能因PLC型号、通信协议和你的需求而有所不同。请参考三菱PLC的通信手册和C#的Socket编程文档,以获得更详细的信息和示例代码。 此外,还要考虑数据的格式转换、字节顺序等问题,以确保数据C#和PLC之间正确传输和解析
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白话Learning

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值