Как отслеживать установленные соединения с помощью WebSockets
Я пытаюсь оживить чат-сервис для кроссплатформенных устройств в режиме реального времени. Проблема в том, чтоSystem.Net.WebSockets
Пространство имен не позволяет мне напрямую отслеживать установленное соединение. Я мог бы взять sessionID текущего соединения, но как я могу сказать выполнить следующее действиеawait socket.SendAsync(buffer, WebSocketMessageType.Text, CancellationToken.None)
для конкретного клиента?
Если бы я мог использоватьMicrosoft.WebSockets
Я бы имел возможность создатьWebSocketCollection()
и делать что-то вродеclient.Send(message)
, но я не могу отправитьArraySegment<byte[]>
через это. Я также думаю, что это больше предназначено для клиентов и веб-сайтов AJAX и тому подобного.
Теперь у меня есть следующий фрагмент кода:
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;
}
}
}
}
Как я могу расширить свой проект, сохранить сеансы / соединения и вызвать конкретное пользовательское соединение, чтобы отправить ему сообщение?