Azure 上的 Websocket 服务器

Posted

技术标签:

【中文标题】Azure 上的 Websocket 服务器【英文标题】:Websocket server on Azure 【发布时间】:2017-07-25 11:44:06 【问题描述】:

我正在尝试在 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 发送“告诉设备 B 闪烁”

因为它是一个 websockets 服务器,并且设备 B 已经与服务器通信,所以我应该在某个地方与设备 B 建立连接。当设备 A 向我询问时,我可以向设备 B 发送消息。

但是我怎样才能用我的代码来实现呢?如何找到与设备 B 的连接?如果不可能,我应该怎么做?

我希望我的问题被描述得足够让人理解。

谢谢,

【问题讨论】:

【参考方案1】:

但是我怎样才能用我的代码来实现呢?如何找到与设备 B 的连接?如果不可能,我应该怎么做?

根据您的情况,我遵循了有关 webapi-and-websockets 的教程并实现了可以在客户端之间建立连接的my Web API project。下面是测试截图,大家可以参考一下:

此外,您可以利用 SignalR 并将您的客户端(用户)映射到 signalR 连接。更多详情可以参考Mapping SignalR Users to Connections。另外,您可以参考 git 示例Microsoft.AspNet.SignalR.Samples。

更新:

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

更简单的方法,我们可以将连接和用户信息保存在内存中,更多细节可以参考In-memory storage。基于这个场景,我写了一个样例项目AspDotNet-SignalR-Chat,大家可以参考,下面是截图供测试:

【讨论】:

感谢您的回答!但是,您认为使用 Microsoft.Websockets 是否可以,因为它已不再开发? 至少,它现在可以工作,可以满足要求。长期考虑,我建议您使用 SignalR。 在这种情况下你会如何使用signalR?根据这篇文章:***.com/questions/25668398/… 不可能从 SignalR 的 WebSocketHandler 继承 使用WebSocketHandler用于自己处理websocket处理。在使用 SignalR 时,您需要遵循它提供的功能。我更新了我对你问题的回答,你可以参考一下。

以上是关于Azure 上的 Websocket 服务器的主要内容,如果未能解决你的问题,请参考以下文章

Azure 上的 Node.js 远程调试

Azure 服务总线 http 与 websocket

Azure web appservice 上的 Python websocket 支持?

SignalR Core 未在 Azure 应用服务中使用 Websocket

Azure 中的 websocket 限制故障排除,活动连接

从Azure IoT Edge容器模块打开要托管的端口