Как зарегистрировать события в пространствах имен socket.io с помощью socketio4Net?

Я использую SocketIO4Net для создания клиента.NET socket.io в моей рабочей роли, с помощью которого я могу подключиться к своему серверу socket.io. Я смог подключиться к пространству имен после перемещения большого количества кода, чем было упомянуто в документации. Но я все еще не могу отправлять и получать сообщения на события. Ниже приведен мой код, пожалуйста, дайте мне знать, как я могу зарегистрировать события в клиенте socket.io.net. Для моего проекта очень важно, чтобы я мог отправлять сообщения на события сервера socket.io из моей рабочей роли.

broadcastSocketClient = new Client(localSocketUrl);

                broadcastSocketClient.Opened += SocketOpened;
                broadcastSocketClient.Message += SocketMessage;
                broadcastSocketClient.SocketConnectionClosed += SocketConnectionClosed;
                broadcastSocketClient.Error += SocketError;

                while (!broadcastSocketClient.IsConnected)
                {
                    broadcastSocketClient.Connect();
                }

                // register for 'connect' event with io server
                broadcastSocketClient.On("connect", (cn) =>
                {                      

                    var namespaceConnect = broadcastSocketClient.Connect("/namespacename");

                    // register for 'connect' event with io server
                    namespaceConnect.On("connect", (data) =>
                    {
                        namespaceConnect.Emit("test", "CONNECTED");

                        namespaceConnect.On("first", (message) =>
                        {
                            Console.WriteLine(message);

                        });
                    });    
                });                    

1 ответ

Решение

Этот вопрос очень похож на /questions/28998029/v-socketio4net-soobschenij-ne-postupalo/28998041#28998041, но одна область, которая может доставить вам неприятности, связана с вашим кодом для подключения:

while (!broadcastSocketClient.IsConnected)
            {
                broadcastSocketClient.Connect();
            }

Вам следует дождаться сообщения о событии "подключен", а не взрывать несколько попыток подключения. Вы никогда не дадите клиенту возможность подключиться в цикле while.

Попробуйте что-то вроде этого:

public class SampleClient
{
    private Client socket;
    private IEndPointClient nsTarget;
    private string localSocketUrl = "http:your_url_to_socketioserver";

    public void Execute()
    {
        Console.WriteLine("Starting SocketIO4Net Client Events Example...");


        socket = new Client(localSocketUrl);
        socket.Opened += SocketOpened;
        socket.Message += SocketMessage;
        socket.SocketConnectionClosed += SocketConnectionClosed;
        socket.Error += SocketError;

        // register for 'connect' event with io server
        socket.On("connect", (fn) =>
        {       // connect to namespace
            nsTarget = socket.Connect("/namespacename");
            nsTarget.On("connect", (cn) => nsTarget.Emit("test", new { data = "CONNECTED" }));
            nsTarget.On("first", (message) =>
            {
                Console.WriteLine("recv [socket].[update] event");
                Console.WriteLine("  raw message:      {0}", message.RawMessage);
                Console.WriteLine("  string message:   {0}", message.MessageText);
                Console.WriteLine("  json data string: {0}", message.Json.ToJsonString());
            });

        });

        // make the socket.io connection
        socket.Connect();
    }

    void SocketOpened(object sender, EventArgs e)
    {
        Console.WriteLine("SocketOpened\r\n");
        Console.WriteLine("Connected to ICBIT API server!\r\n");
    }

    void SocketError(object sender, ErrorEventArgs e)
    {
        Console.WriteLine("socket client error:");
        Console.WriteLine(e.Message);
    }

    void SocketConnectionClosed(object sender, EventArgs e)
    {
        Console.WriteLine("WebSocketConnection was terminated!");
    }

    void SocketMessage(object sender, MessageEventArgs e)
    {
        // uncomment to show any non-registered messages
        if (string.IsNullOrEmpty(e.Message.Event))
            Console.WriteLine("Generic SocketMessage: {0}", e.Message.MessageText);
        else
            Console.WriteLine("Generic SocketMessage: {0} : {1}", e.Message.Event, e.Message.Json.ToJsonString());
    }
    public void Close()
    {
        if (this.socket != null)
        {
            socket.Opened -= SocketOpened;
            socket.Message -= SocketMessage;
            socket.SocketConnectionClosed -= SocketConnectionClosed;
            socket.Error -= SocketError;
            this.socket.Dispose(); // close & dispose of socket client
        }
    }
}
Другие вопросы по тегам