Azure上的Websocket服务器

时间:2017-07-25 11:44:07

标签: c# azure websocket

我试图在Azure上托管websockets服务器。我有点困惑,希望你能帮助我。

我已经关注了很多文章,但我的代码与本文中的代码很接近:https://azure.microsoft.com/en-us/blog/introduction-to-websockets-on-windows-azure-web-sites/

public void ProcessRequest(HttpContext context)
{
    if (context.IsWebSocketRequest)
    {
        context.AcceptWebSocketRequest(ProcessWS);
    }
}

public bool IsReusable { get { return false; } }

private async Task ProcessWS(AspNetWebSocketContext context)
{
    try
    {
        WebSocket socket = context.WebSocket;
        while (true)
        {
            var url = context.RequestUri;
            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.UTF8.GetString(buffer.Array, 0, result.Count)
                                            .Trim(new char[] { ' ' }); // We remove the spaces before and after
                // DO SOMETHING
            }
            else
            {
                break;
            }
        }
    }
    catch (Exception e)
    {
        Log.Info("Exception" + e.Message + " >>>" + e.StackTrace);
    }
}

这很好用,我可以从我的设备上获取消息并回复它们。

但在某些情况下,我需要向其他设备发送消息,例如:

设备A发送&#34;告诉设备B闪烁&#34;

由于它是一个websockets服务器,而Device B已经与服务器通信过,我应该在某处与Device B建立连接。当Device A要求我这样做时,我可以向Device B发送一条消息。

但是如何使用我的代码实现这一目标?如何找到与设备B的连接?如果不可能,我该怎么做?

我希望我的问题能够被理解为足以理解。

谢谢,

1 个答案:

答案 0 :(得分:2)

  

但是如何使用我的代码实现这一目标?如何找到与设备B的连接?如果不可能,我该怎么做?

根据您的方案,我按照本教程关于 webapi-and-websockets并实施可以在客户端之间建立连接的my Web API project。这是测试的屏幕截图,你可以参考它:

enter image description here

此外,您可以利用SignalR并将您的客户端(用户)映射到signalR连接。有关详细信息,请参阅Mapping SignalR Users to Connections。另外,您可以参考git示例Microsoft.AspNet.SignalR.Samples

<强>更新

  

在这种情况下你会如何使用signalR?

简单来说,我们可以保留存储在内存中的连接和用户信息。有关详细信息,请参阅In-memory storage。基于这种情况,我编写了一个示例项目AspDotNet-SignalR-Chat,您可以参考它,这是测试的屏幕截图:

enter image description here