Как зарегистрировать события в пространствах имен 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
}
}
}