C# Azure上的Websocket服务器
我正在尝试在Azure上托管websockets服务器。我有点困惑,希望你能帮助我 我已经阅读了许多文章,但我的代码与本文中的代码非常接近: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
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);
}
}