using IpcLibrary.Connection;
using IpcLibrary.Core;
using IpcLibrary.Core.Exceptions;
using IpcLibrary.Serialization;
using IpcLibrary.Services;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IpcLibrary.Client {
///
/// IPC客户端实现
///
public class IPCClient : IIPCClient {
private readonly NamedPipeConnectionManager _connectionManager;
private readonly IServiceRegistry _serviceRegistry;
private readonly HeartbeatManager _heartbeatManager;
private readonly MessageRouter _messageRouter;
private readonly IPCConfiguration _configuration;
private readonly string _processId;
private bool _disposed;
public string ProcessId => _processId;
public bool IsConnected { get; private set; }
public event EventHandler ProcessConnected;
public event EventHandler ProcessDisconnected;
public event EventHandler MessageReceived;
public IPCClient(IPCConfiguration configuration = null) {
_configuration = configuration ?? new IPCConfiguration();
_processId = $"Client_{Environment.ProcessId}_{Guid.NewGuid():N}";
var serializer = new CompositeMessageSerializer();
_connectionManager = new NamedPipeConnectionManager(serializer, _configuration, "IPCPipe");
_serviceRegistry = new ServiceRegistry();
_heartbeatManager = new HeartbeatManager();
var methodCallHandler = new MethodCallHandler(_serviceRegistry);
_messageRouter = new MessageRouter(methodCallHandler);
InitializeEventHandlers();
}
public async Task ConnectAsync(string serverAddress) {
try {
var success = await _connectionManager.ConnectToProcessAsync(_processId, serverAddress);
if (success) {
IsConnected = true;
if (_configuration.EnableHeartbeat) {
_heartbeatManager.StartMonitoring(_processId);
_ = Task.Run(SendHeartbeats);
}
}
return success;
} catch (Exception ex) {
throw new ConnectionException($"连接失败: {ex.Message}", ex);
}
}
public async Task DisconnectAsync() {
if (!IsConnected)
return;
try {
_heartbeatManager.StopMonitoring(_processId);
await _connectionManager.DisconnectFromProcessAsync(_processId);
IsConnected = false;
} catch (Exception ex) {
throw new ConnectionException($"断开连接失败: {ex.Message}", ex);
}
}
public async Task CallMethodAsync(string targetProcessId, string serviceName, string methodName, params object[] parameters) {
var result = await CallMethodAsync(targetProcessId, serviceName, methodName, typeof(T), parameters);
return result is T typedResult ? typedResult : default(T);
}
public async Task