C# 两个exe通讯方式 两个应用程序通讯方式
1. 命名管道(Named Pipes)
1.1. 概述
命名管道是一种用于在同一台机器或网络中不同进程之间进行双向通信的机制。它支持同步和异步通信,适用于需要高效数据传输的场景。
1.2. 特点
双向通信:支持双向数据传输。
安全性:可以设置访问权限,确保通信的安全性。
跨网络:支持跨网络通信。
1.3. 实现方式
1.3.1. 服务器端(NamedPipeServerStream)
using System;
using System.IO.Pipes;
using System.Text;
using System.Threading.Tasks;
class PipeServer
{
public static async Task StartServer()
{
using (var pipeServer = new NamedPipeServerStream("TestPipe", PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous))
{
Console.WriteLine("等待客户端连接...");
await pipeServer.WaitForConnectionAsync();
Console.WriteLine("客户端已连接。");
// 接收数据
byte[] buffer = new byte[256];
int bytesRead = await pipeServer.ReadAsync(buffer, 0, buffer.Length);
string receivedMessage = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine($"收到消息:{
receivedMessage}");
// 发送回应
string response = "Hello from server!";
byte[] responseBytes = Encoding.UTF8.GetBytes(response);
await pipeServer.WriteAsync(responseBytes, 0, responseBytes.Length);
Console.WriteLine("已发送回应。");
}
}
static void Main(string[] args)
{
Task.Run(() => StartServer()).Wait();
}
}
1.3.2. 客户端(NamedPipeClientStream)
using System;
using System.IO.Pipes;
using System.Text;
using System.Threading.Tasks;
class PipeClient
{
public static async Task StartClient()
{
using (var pipeClient = new NamedPipeClientStream(".", "TestPipe", PipeDirection.InOut, PipeOptions.Asynchronous))
{
Console.WriteLine("尝试连接到服务器...");
await pipeClient.ConnectAsync();
Console.WriteLine("已连接到服务器。");
// 发送数据
string message = "Hello from client!";
byte[] messageBytes = Encoding.UTF8.GetBytes(message);
await pipeClient.WriteAsync(messageBytes, 0, messageBytes.Length);
Console.WriteLine("已发送消息。");
// 接收回应
byte[] buffer = new byte[256];
int bytesRead = await pipeClient.ReadAsync(buffer, 0, buffer.Length);
string response = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine($"收到回应:{
response}");
}
}
static void Main(string[] args)
{
Task.Run(() => StartClient()).Wait();
}
}
1.4. 使用场景
需要高效、双向通信的应用程序。
同一台机器或网络中的进程间通信。
需要传输大量数据或复杂数据结构。
2. 套接字(Sockets)
2.1. 概述
套接字是一种底层的通信机制,支持跨网络的进程间通信。它适用于需要跨不同机器或网络通信的应用程序。
2.2. 特点
灵活性高:支持多种协议(TCP、UDP)。
跨平台:可用于不同操作系统间的通信。
高性能:适用于实时数据传输和高并发应用。
2.3. 实现方式
2.3.1. 服务器端(TCP)
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
class SocketServer
{
public static async Task StartServer()
{
TcpListener listener = new TcpListener(IPAddress.Any, 5000);
listener.Start();
Console.WriteLine("服务器已启动,等待连接...");
using (TcpClient client = await listener.AcceptTcpClientAsync())
{
Console.WriteLine("客户端已连接。");
NetworkStream stream = client.GetStream();
// 接收数据
byte[] buffer = new byte[1024];
int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
string receivedMessage = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine($"收到消息:{
receivedMessage}");
// 发送回应
string response = "Hello from server!";
byte[] responseBytes = Encoding.UTF8.GetBytes(response);
await stream.WriteAsync(responseBytes, 0, responseBytes.Length);
Console.WriteLine("已发送回应。");
}
listener.Stop();
}
static void Main(string[] args)
{
Task.Run(() => StartServer()).Wait();
}
}
2.3.2. 客户端(TCP)
using System;
using System.Net.Sockets;
using System.Text;
using System.Threading.Task