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.Server {
///
/// IPC服务器实现
///
public class IPCServer : IIPCServer {
private readonly NamedPipeConnectionManager _connectionManager;
private readonly IServiceRegistry _serviceRegistry;
private readonly HeartbeatManager _heartbeatManager;
private readonly MessageRouter _messageRouter;
private readonly IPCConfiguration _configuration;
private readonly string _serverId;
private bool _disposed;
public bool IsRunning { get; private set; }
public IReadOnlyList ConnectedProcesses => _connectionManager.GetAllProcesses();
public DateTime StartTime { get; internal set; }
public event EventHandler ProcessConnected;
public event EventHandler ProcessDisconnected;
public event EventHandler MessageReceived;
public IPCServer(IPCConfiguration configuration = null) {
_configuration = configuration ?? new IPCConfiguration();
_serverId = $"Server_{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();
StartTime = DateTime.UtcNow;
}
public async Task StartAsync(string address) {
if (IsRunning)
return;
try {
Console.WriteLine($"IPC服务器已启动,地址: {address}");
if (_connectionManager is NamedPipeConnectionManager namedPipeManager) {
await namedPipeManager.StartServerAsync();
}
IsRunning = true;
if (_configuration.EnableHeartbeat) {
_heartbeatManager.SetHeartbeatInterval(_configuration.HeartbeatInterval);
_heartbeatManager.SetTimeoutThreshold(_configuration.ConnectionTimeout);
}
Console.WriteLine($"IPC服务器已启动,地址: {address}");
} catch (Exception ex) {
throw new ConnectionException($"启动服务器失败: {ex.Message}", ex);
}
}
public async Task StopAsync() {
if (!IsRunning)
return;
try {
// 通知所有连接的进程服务器即将关闭
var shutdownMessage = new IPCMessage {
Type = MessageType.Notification,
Method = "ServerShutdown",
SourceProcessId = _serverId
};
await _connectionManager.BroadcastMessageAsync(shutdownMessage);
// 断开所有连接
var processes = ConnectedProcesses.ToList();
foreach (var process in processes) {
await _connectionManager.DisconnectFromProcessAsync(process.ProcessId);
}
IsRunning = false;
Console.WriteLine("IPC服务器已停止");
} 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