Welcome

首页 / 软件开发 / .NET编程技术 / Windows 8 Store Apps学习(63) 通信: WebSocket

Windows 8 Store Apps学习(63) 通信: WebSocket2014-09-02 cnblogs webabcd介绍重新想象 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() - 关闭 WebSocketawait 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