第六章 设计程序架构 之 设计实现WebSocket策略
2015-09-07 17:50
645 查看
[b]1. 概述[/b]
传统网页的通信方式是请求-响应模式,每次请求-响应都是新的连接。连接的建立和断开也是需要消耗资源的。
WebSocket是基于TCP协议,实现单个连接上的双向通信。
本章内容包括: 异步读写字符串和二进制数据、选择连接丢失策略、何时使用WebSocket。
[b]2. 主要内容[/b]
2.1 异步读写字符串和二进制数据
* HTTP polling 是传统的使用一系列AJAX请求来实现客户端服务端长久连接(表面上看起来是长久连接)的方式。
* HTTP long polling 是客户端使用AJAX请求服务端时用到的一种服务端技术。是通过阻塞进入的请求,直到当前请求操作完成 来实现的。在HTTP中,这不是一种好的方式,因为HTTP的请求响应模式不是为这种情形设计的。而且这也不是一种可靠的方式,可能会发生连接中断的情况。
* WebSockets是一种新的支持双工通信的技术。WebSockets使用一种特殊连接取代了客户端/服务器模式的通信协议。
* 使用WebSockets是要考虑不支持HTML5的情况。使用 System.Web.HttpBrowserCapabilities 可以检测。
* 基于WebSockets的通信一般包括三个步骤:
① 通过一次握手在客户端和服务端建立连接。
② 请求WebSockets服务端开启通信监听。
③ 传输数据。
请求WebSockets时,浏览器首先打开一个到服务端的http连接,然后浏览器发送一个升级版请求(如下),如该请求被接收并处理,则握手完成。所有通信通过一个TCP Socket连接进行。
实例: 使用JQuery实现一个客户端WebSockets链接
* WebSockets协议的建立,需要ASP.NET4.5及IIS8环境。 System.Web.WebSockets下的方法用来支持WebSockets相关的开发。
* 通过实现HttpContext.Current.AcceptWebSocketRequest(Func<AspNetWebSocketContext, Task>)来支持WebSockets连接。
下面的C#代码用来管理WebSockets连接
2.2 如何选择连接丢失策略
使用WebSockets时,要考虑如何处理连接意外关闭的情况。除了OnClose 和 OnError事件外,还需要更完善的处理,比如连接重建。
2.3 考虑何时使用WebSockets
当需要跟服务端进行双工通信时,WebSockets是一个理想方案。
但是,也不是任何情况使用都是合适的。有些情况使用传统的客户端timer可能要更好一些。因为目前的HTML5还没有完全普及。
另一种策略是在服务端设置一个开关,可以决定是否使用WebSockets。让服务端决定,可以简化客户端的代码。
WebSockets不包含HTTP头,但是却以HTTP形式发送请求。这对于很多根据HTTP头来监测请求的地方来说,是一个潜在的威胁。是可能会被阻止的。而且这个阻止不能像浏览器是否支持HTML5那样被检测出来,只能是实际创建连接,发送数据,然后根据返回结果来判断。
[b]3. 总结[/b]
① Http polling 是一种利用Javascript方法连续请求服务端来获取数据的方式。虽然不是最高效的,但是具有广泛的浏览器支持。(支持Js即可)
② Http long polling 是长连接方式,服务端收到请求后会保持连接,直到处理完成返回。然后客户端收到返回并处理完成再进行下一次连接。
③ WebSockets是一种在客户端和服务器端提供双工通信的方式。两端可以同时互相通信。客户端通过Http发送一个升级版请求到服务端,服务端收到后就会创建一个WebSockets连接。客户端和服务端都需要写代码来通过socket进行交互。
④ WebSockets适用于长时间的双向通信情况。并不是所有情况都适用,尤其是不支持HTML5的情况。
传统网页的通信方式是请求-响应模式,每次请求-响应都是新的连接。连接的建立和断开也是需要消耗资源的。
WebSocket是基于TCP协议,实现单个连接上的双向通信。
本章内容包括: 异步读写字符串和二进制数据、选择连接丢失策略、何时使用WebSocket。
[b]2. 主要内容[/b]
2.1 异步读写字符串和二进制数据
* HTTP polling 是传统的使用一系列AJAX请求来实现客户端服务端长久连接(表面上看起来是长久连接)的方式。
* HTTP long polling 是客户端使用AJAX请求服务端时用到的一种服务端技术。是通过阻塞进入的请求,直到当前请求操作完成 来实现的。在HTTP中,这不是一种好的方式,因为HTTP的请求响应模式不是为这种情形设计的。而且这也不是一种可靠的方式,可能会发生连接中断的情况。
* WebSockets是一种新的支持双工通信的技术。WebSockets使用一种特殊连接取代了客户端/服务器模式的通信协议。
* 使用WebSockets是要考虑不支持HTML5的情况。使用 System.Web.HttpBrowserCapabilities 可以检测。
* 基于WebSockets的通信一般包括三个步骤:
① 通过一次握手在客户端和服务端建立连接。
② 请求WebSockets服务端开启通信监听。
③ 传输数据。
请求WebSockets时,浏览器首先打开一个到服务端的http连接,然后浏览器发送一个升级版请求(如下),如该请求被接收并处理,则握手完成。所有通信通过一个TCP Socket连接进行。
WebSocket handshake upgrade request GET /mychat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: hy6T&Ui8trDRGY5REWe4r5== Sec-WebSocket-Protocol: chat Sec-WebSocket-Version: 13 Origin: http://example.com HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: Ju6Tr4Ewed0p9Uyt6jNbgFD5t6= Sec-WebSocket-Protocol: chat
实例: 使用JQuery实现一个客户端WebSockets链接
var socket; $(document).ready(function () { socket = new WebSocket("ws://localhost:1046/socket/handle"); socket.addEventListener("open", function (evnt) { $("#display").append('connection');}, false); socket.addEventListener("message", function (evnt) { $("#display ").append(evnt.data);}, false); socket.addEventListener("error", function (evnt) { $("#display ").append('unexpected error.');}, false); ... }); Or using straight method calls: function connect(){ try{ var socket; var host = "ws://localhost:8000/socket/server/start"; var socket = new WebSocket(host); message('<p class="event">Socket Status: '+socket.readyState); socket.onopen = function(){ message('<p class="event">Socket Status: '+socket.readyState+' (open)'); } socket.onmessage = function(msg){ message('<p class="message">Received: '+msg.data); } socket.onclose = function(){ message('<p class="event">Socket Status: '+socket.readyState+' (Closed)'); } } catch(exception){ message('<p>Error'+exception); } }
* WebSockets协议的建立,需要ASP.NET4.5及IIS8环境。 System.Web.WebSockets下的方法用来支持WebSockets相关的开发。
* 通过实现HttpContext.Current.AcceptWebSocketRequest(Func<AspNetWebSocketContext, Task>)来支持WebSockets连接。
下面的C#代码用来管理WebSockets连接
public async Task MyWebSocket(AspNetWebSocketContext context) { while (true) { ArraySegment<byte> arraySegment = new ArraySegment<byte>(new byte[1024]); // open the result. This is waiting asynchronously WebSocketReceiveResult socketResult = await context.WebSocket.ReceiveAsync(arraySegment, CancellationToken.None); // return the message to the client if the socket is still open if (context.WebSocket.State == WebSocketState.Open) { string message = Encoding.UTF8.GetString(arraySegment.Array, 0, socketResult.Count); userMessage = "Your message: " + message + " at " + DateTime.Now.ToString(); arraySegment = new ArraySegment<byte>(Encoding.UTF8.GetBytes(message)); // Asynchronously send a message to the client await context.WebSocket.SendAsync(arraySegment, WebSocketMessageType.Text, true, CancellationToken.None); } else { break; } } }
2.2 如何选择连接丢失策略
使用WebSockets时,要考虑如何处理连接意外关闭的情况。除了OnClose 和 OnError事件外,还需要更完善的处理,比如连接重建。
2.3 考虑何时使用WebSockets
当需要跟服务端进行双工通信时,WebSockets是一个理想方案。
但是,也不是任何情况使用都是合适的。有些情况使用传统的客户端timer可能要更好一些。因为目前的HTML5还没有完全普及。
另一种策略是在服务端设置一个开关,可以决定是否使用WebSockets。让服务端决定,可以简化客户端的代码。
WebSockets不包含HTTP头,但是却以HTTP形式发送请求。这对于很多根据HTTP头来监测请求的地方来说,是一个潜在的威胁。是可能会被阻止的。而且这个阻止不能像浏览器是否支持HTML5那样被检测出来,只能是实际创建连接,发送数据,然后根据返回结果来判断。
[b]3. 总结[/b]
① Http polling 是一种利用Javascript方法连续请求服务端来获取数据的方式。虽然不是最高效的,但是具有广泛的浏览器支持。(支持Js即可)
② Http long polling 是长连接方式,服务端收到请求后会保持连接,直到处理完成返回。然后客户端收到返回并处理完成再进行下一次连接。
③ WebSockets是一种在客户端和服务器端提供双工通信的方式。两端可以同时互相通信。客户端通过Http发送一个升级版请求到服务端,服务端收到后就会创建一个WebSockets连接。客户端和服务端都需要写代码来通过socket进行交互。
④ WebSockets适用于长时间的双向通信情况。并不是所有情况都适用,尤其是不支持HTML5的情况。
相关文章推荐
- 系统架构师考试大纲
- 网页设计的灵感
- 架构设计:负载均衡层设计方案(4)——LVS原理
- 【转】构建可扩展的微博架构(qcon beijing 2010演讲) by Tim Yang
- 局域网中别的机器访问自己本地网站
- git的使用笔记-转自廖前辈的网站
- 网站的安全架构
- 高并发量网站解决方案
- Snail—iOS开发学习博客及网站
- 【工作笔记0011】IIS网站搭建详细完整步骤,附带域名ip绑定(域名解析)的免费软件
- 局域网不同用户同时登录同一个网站,会出现session乱窜的问题
- 学习之路
- 网站关键词排名顺序能否影响排名?
- 开源代码网站
- android架构一
- 网站的可扩展架构
- hadoop笔记2-MR架构体系
- 给敏捷团队中的架构师的10个建议
- 每天进步一点点————MUMA架构优化和应用优化
- 架构之路(二):性能