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连接。
- 被动模式: 服务器被动监听端口,等待客户端发起连接。服务器在接收到客户端的连接请求后,接受连接并进行数据交换。
在实际应用中,根据需求选择合适的模式。例如,一个简单的聊天应用程序通常使用主动模式,因为客户端需要主动向服务器发送消息。而一个网页服务器通常使用被动模式,因为它监听来自不同客户端的请求,而不是主动发送数据。