介紹
重新想象 Windows 8 Store Apps 之 通訊
Socket - 與 WebSocket 服務端做 Text 通訊
Socket - 與 WebSocket 服務端做 Stream(Binary) 通訊
樣本
WebSocket 的服務端
WebServer/WebSocketServer.ashx.cs
/* * WebSocket 通訊協定的服務端 * * 需要在 iis 啟用 WebSocket 通訊協定:控制台 -> 程式和功能 -> 啟用或關閉 Windows 功能 -> 開啟 iis 的 WebSocket 通訊協定 */ using System;using System.IO;using System.Net.WebSockets;using System.Text;using System.Threading;using System.Web; namespace WebServer{ public class WebSocketServer : IHttpHandler { // 接收資料的緩衝區的最大大小 private int _maxBufferSize = 64 * 1024; public void ProcessRequest(HttpContext context) { try { // HttpContext.AcceptWebSocketRequest() - 接受一個 WebSocket 請求 context.AcceptWebSocketRequest(async wsContext => // AspNetWebSocketContext { try { byte[] receiveBuffer = new byte[_maxBufferSize]; ArraySegment<byte> buffer = new ArraySegment<byte>(receiveBuffer); // AspNetWebSocketContext.WebSocket - 擷取當前內容相關的 WebSocket 對象 WebSocket socket = wsContext.WebSocket; // HTTP 握手完成 if (socket.State == WebSocketState.Open) { var outputString = "WebSocket Connected: " + DateTime.Now.ToString("mm:ss"); ArraySegment<byte> outputBuffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(outputString)); // WebSocket.SendAsync() - 發送資料 // WebSocketMessageType.Text - 發送的是文本資料 // WebSocketMessageType.Binary - 發送的是位元據 await socket.SendAsync(outputBuffer, WebSocketMessageType.Text, true, CancellationToken.None); } // HTTP 握手完成 while (socket.State == WebSocketState.Open) { // WebSocket.ReceiveAsync() - 接收資料,返回 WebSocketReceiveResult 對象 WebSocketReceiveResult receiveResult = await socket.ReceiveAsync(buffer, CancellationToken.None); // WebSocketReceiveResult.MessageType - 接收到的資料的類型(WebSocketMessageType 枚舉) // WebSocketMessageType.Text - 收到的是文本資料 // WebSocketMessageType.Binary - 收到的是位元據 // WebSocketMessageType.Close - 收到的是來自用戶端的 WebSocket 關閉的訊息 if (receiveResult.MessageType == WebSocketMessageType.Close) { // WebSocket.CloseAsync() - 關閉 WebSocket await socket.CloseAsync( receiveResult.CloseStatus.GetValueOrDefault(), receiveResult.CloseStatusDescription, CancellationToken.None); return; } int offset = receiveResult.Count; // WebSocketReceiveResult.EndOfMessage - 訊息是否被完全接收 while (receiveResult.EndOfMessage == false) { // WebSocket.ReceiveAsync() - 接收資料,返回 WebSocketReceiveResult 對象 receiveResult = await socket.ReceiveAsync(new ArraySegment<byte>(receiveBuffer, offset, _maxBufferSize - offset), CancellationToken.None); offset += receiveResult.Count; } // 收到文本資料 if (receiveResult.MessageType == WebSocketMessageType.Text) { string receivedText = Encoding.UTF8.GetString(receiveBuffer, 0, offset); string sendText = "server to client: \"" + receivedText + "\""; // 發送文本資料到用戶端 ArraySegment<byte> outputBuffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(sendText)); await socket.SendAsync(outputBuffer, WebSocketMessageType.Text, true, CancellationToken.None); } // 收到位元據 else if (receiveResult.MessageType == WebSocketMessageType.Binary) { string sendText = "server to client: binary message received, size: " + receiveResult.Count + " bytes"; // 發送文本資料到用戶端 ArraySegment<byte> outputBuffer = new ArraySegment<byte>(Encoding.UTF8.GetBytes(sendText)); await socket.SendAsync(outputBuffer, WebSocketMessageType.Text, true, CancellationToken.None); } } } catch (Exception ex) { } }); } catch (Exception ex) { } } public bool IsReusable { get { return false; } } }}
1、示範如何通過 MessageWebSocket 與 WebSocket 服務端做 Text 通訊
Communication/Socket/MessageWebSocketDemo.xaml
查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/net/