public interface INetMqAccessor : IDisposable { void StartServer(string endpoint); void SendMessage(string message); event Action OnMessageReceived; } public class NetMqAccessor : INetMqAccessor { private RouterSocket server; private NetMQPoller poller; public event Action OnMessageReceived; public void StartServer(string endpoint) { server = new RouterSocket(); server.Bind(endpoint); server.ReceiveReady += (s, e) => { var msg = e.Socket.ReceiveMultipartMessage(); var clientAddress = msg[0]; var content = msg[2].ConvertToString(); OnMessageReceived?.Invoke(content); var response = new NetMQMessage(); response.Append(clientAddress); response.AppendEmptyFrame(); response.Append($"Echo: {content}"); server.SendMultipartMessage(response); }; poller = new NetMQPoller { server }; poller.RunAsync(); } public void SendMessage(string message) { // Optionnel si tu veux aussi gérer un client ici } public void Dispose() { poller?.Stop(); server?.Dispose(); } } //////// public interface INetMqClientAccessor : IDisposable { void Connect(string endpoint); void SendMessage(T message); Task SendAndReceive(TRequest message); } public class NetMqClientAccessor : INetMqClientAccessor { private RequestSocket client; public void Connect(string endpoint) { client = new RequestSocket(); client.Connect(endpoint); } public void SendMessage(T message) { byte[] packed = MessagePackSerializer.Serialize(message); client.SendFrame(packed); } public async Task SendAndReceive(TRequest message) { byte[] packed = MessagePackSerializer.Serialize(message); client.SendFrame(packed); // Attente de la réponse byte[] responseBytes = client.ReceiveFrameBytes(); TResponse response = MessagePackSerializer.Deserialize(responseBytes); return response; } public void Dispose() { client?.Dispose(); } }