导入
概览
了解 SignalR 的重要性。
引言
我们的应用程序必须能够与服务器进行异步且实时的通信,这一点至关重要。此外,我们可能已经意识到,传统的请求-响应通信模式并不完全适用于现代应用。有时,我们的客户端应用(无论是网页、移动应用,还是物联网设备上的服务)需要能够接收来自服务器的实时更新,而这些更新是由服务器端事件触发的,而非由客户端发起请求所导致。
这种功能在日常生活中随处可见。当我们使用即时通讯应用时,期望一旦有人发送消息,就能立即收到;当我们远程控制物联网设备时,也期望设备能在我发出指令后立刻响应。
然而,实现此类功能往往并不容易。我们仍可采用传统的请求-响应模型,持续向服务器发送请求,直到接收到期望的响应。但这显然效率低下。如果客户端应用的带宽有限,甚至可能根本无法实现。因为频繁向服务器发起请求会迅速耗尽全部带宽。此外,实现这种机制的代码也会远比应有的复杂。

...
客户端与服务器之间的双向通信
...
SignalR 标志
1private static async Task ReceiveAsync(ClientWebSocket ws) 2{ 3 var buffer = new byte[4096]; 4 while (true) 5 { 6 var result = await ws.ReceiveAsync(new ArraySegment<byte>(buffer), CancellationToken.None); 7 if(result.MessageType == WebSocketMessageType.Close) 8 { 9 await ws.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None); 10 break; 11 } 12 else 13 { 14 Console.WriteLine(Encoding.Default.GetString(Decode(buffer))); 15 buffer = new byte[4096]; 16 } 17 } 18} 19 20private static byte[] Decode(byte[] packet) 21{ 22 var i = packet.Length - 1; 23 while (i >= 0 && packet[i] == 0) 24 { 25 --i; 26 } 27 var temp = new byte[i + 1]; 28 Array.Copy(packet, temp, i + 1); 29 return temp; 30}