我试图在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的连接?如果不可能,我该怎么做?
我希望我的问题能够被理解为足以理解。
谢谢,
答案 0 :(得分:2)
但是如何使用我的代码实现这一目标?如何找到与设备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,您可以参考它,这是测试的屏幕截图: