public interface INetMqAccessor : IDisposable
{
    void StartServer(string endpoint);
    void SendMessage(string message);
    event Action<string> OnMessageReceived;
}
public class NetMqAccessor : INetMqAccessor
{
    private RouterSocket server;
    private NetMQPoller poller;

    public event Action<string> 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>(T message);
    Task<TResponse> SendAndReceive<TRequest, TResponse>(TRequest message);
}

public class NetMqClientAccessor : INetMqClientAccessor
{
    private RequestSocket client;

    public void Connect(string endpoint)
    {
        client = new RequestSocket();
        client.Connect(endpoint);
    }

    public void SendMessage<T>(T message)
    {
        byte[] packed = MessagePackSerializer.Serialize(message);
        client.SendFrame(packed);
    }

    public async Task<TResponse> SendAndReceive<TRequest, TResponse>(TRequest message)
    {
        byte[] packed = MessagePackSerializer.Serialize(message);
        client.SendFrame(packed);

        // Attente de la réponse
        byte[] responseBytes = client.ReceiveFrameBytes();
        TResponse response = MessagePackSerializer.Deserialize<TResponse>(responseBytes);
        return response;
    }

    public void Dispose()
    {
        client?.Dispose();
    }
}
