Cómo realizar un seguimiento de las conexiones establecidas utilizando WebSockets
Estoy tratando de hacer realidad un servicio de chat en tiempo real para dispositivos multiplataforma. El problema es eseSystem.Net.WebSockets
el espacio de nombres no me permite hacer un seguimiento directo de una conexión establecida. Podría tomar una ID de sesión de la conexión actual, pero ¿cómo puedo decir que realice la siguiente acción?await socket.SendAsync(buffer, WebSocketMessageType.Text, CancellationToken.None)
para un cliente específico?
Si pudiera usarMicrosoft.WebSockets
, Tendría la posibilidad de crear unWebSocketCollection()
y hacer algo comoclient.Send(message)
, pero no puedo enviar unArraySegment<byte[]>
a traves de. También creo que esto está más destinado a clientes y sitios web AJAX y estas cosas.
Ahora tengo el siguiente fragmento de código:
public class WSHandler : IHttpHandler
{
event NewConnectionEventHandler NewConnection;
public void ProcessRequest(HttpContext context)
{
if (context.IsWebSocketRequest)
{
context.AcceptWebSocketRequest(ProcessWSChat);
}
}
public bool IsReusable { get { return false; } }
private async Task ProcessWSChat(AspNetWebSocketContext context)
{
WebSocket socket = context.WebSocket;
int myHash = socket.GetHashCode();
while (true)
{
ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]);
WebSocketReceiveResult result = await socket.ReceiveAsync(
buffer, CancellationToken.None);
if (socket.State == WebSocketState.Open)
{
string userMessage = Encoding.ASCII.GetString(
buffer.Array, 0, result.Count);
userMessage = "You sent: " + userMessage + " at " +
DateTime.Now.ToLongTimeString() + " from ip " +
context.UserHostAddress.ToString();
buffer = new ArraySegment<byte>(
Encoding.ASCII.GetBytes(userMessage));
await socket.SendAsync(
buffer, WebSocketMessageType.Text, true, CancellationToken.None);
}
else
{
break;
}
}
}
}
¿Cómo puedo extender mi proyecto, guardar las sesiones / conexiones y llamar a una conexión de usuario específica para enviarle un mensaje?