C# Azure上的Websocket服务器

C# Azure上的Websocket服务器,c#,azure,websocket,C#,Azure,Websocket,我正在尝试在Azure上托管websockets服务器。我有点困惑,希望你能帮助我 我已经阅读了许多文章,但我的代码与本文中的代码非常接近: public void ProcessRequest(HttpContext上下文) { if(context.IsWebSocketRequest) { AcceptWebSocketRequest(ProcessWS); } } 公共布尔可重用{get{return false;}} 专用异步任务ProcessWS(AspNetWebSocketCon

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

我已经阅读了许多文章,但我的代码与本文中的代码非常接近:

public void ProcessRequest(HttpContext上下文)
{
if(context.IsWebSocketRequest)
{
AcceptWebSocketRequest(ProcessWS);
}
}
公共布尔可重用{get{return false;}}
专用异步任务ProcessWS(AspNetWebSocketContext上下文)
{
尝试
{
WebSocket套接字=context.WebSocket;
while(true)
{
var url=context.RequestUri;
ArraySegment缓冲区=新的ArraySegment(新字节[1024]);
WebSocketReceiveResult结果=等待套接字.ReceiveAsync(缓冲区,CancellationToken.None);
if(socket.State==WebSocketState.Open)
{
string userMessage=Encoding.UTF8.GetString(buffer.Array,0,result.Count)
.Trim(新字符[]{'});//删除前后的空格
//做点什么
}
其他的
{
打破
}
}
}
捕获(例外e)
{
日志信息(“异常”+e.Message+“>>>”+e.StackTrace);
}
}
这很好,我可以从我的设备中获取消息并回答它们

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

设备A发送“通知设备B闪烁”

由于它是一个WebSocket服务器,并且设备B已经与服务器进行了通信,我应该在某个地方打开与设备B的连接。当设备a向我请求时,我可以向设备B发送消息

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

我希望我的问题描述得足够清楚

谢谢,

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

根据您的场景,我按照本教程介绍了如何在客户端之间建立连接。这是测试的截图,您可以参考它:

此外,您可以利用并将客户端(用户)映射到信号器连接。有关更多详细信息,请参阅。此外,您还可以参考git示例

更新:


在这种情况下,您将如何使用信号器

对于一个简单的方法,我们可以保留存储在内存中的连接和用户信息,有关更多详细信息,您可以参考。基于这个场景,我编写了一个示例项目,您可以参考它,下面是测试的屏幕截图:


谢谢您的回答!但是,您认为使用Microsoft.Websockets可以吗,因为它已经不再开发了?至少,它现在可以工作,并且可以满足要求。出于长远考虑,我建议您使用Signal。在这种情况下,您将如何使用Signal?根据这篇文章:不可能从SignalRUse的WebSocketHandler继承
WebSocketHandler
用于自己处理websocket处理。在使用Signal时,您需要遵循它提供的功能。我更新了你问题的答案,你可以参考。
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);
    }
}