Como acompanhar as conexões estabelecidas usando WebSockets
Estou tentando obter um serviço de bate-papo em tempo real para dispositivos de plataforma cruzada. O problema é queSystem.Net.WebSockets
O namespace não me permite acompanhar diretamente uma conexão estabelecida. Eu poderia ter um sessionID da conexão atual, mas como posso dizer executar a seguinte açãoawait socket.SendAsync(buffer, WebSocketMessageType.Text, CancellationToken.None)
para um cliente específico?
Se eu pudesse usarMicrosoft.WebSockets
, Eu teria a possibilidade de criar umWebSocketCollection()
e fazer algo comoclient.Send(message)
, mas não consigo enviar umArraySegment<byte[]>
através dele. Eu também acho que isso é mais direcionado para clientes e sites AJAX e essas coisas.
Agora tenho o seguinte trecho 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;
}
}
}
}
Como posso estender meu projeto, salvar as sessões / conexões e chamar uma conexão de usuário específica para enviar uma mensagem?