1. 概述

  传统网页的通信方式是请求-响应模式,每次请求-响应都是新的连接。连接的建立和断开也是需要消耗资源的。

  WebSocket是基于TCP协议,实现单个连接上的双向通信。

  本章内容包括: 异步读写字符串和二进制数据、选择连接丢失策略、何时使用WebSocket。

2. 主要内容

  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[]); // 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, ,
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那样被检测出来,只能是实际创建连接,发送数据,然后根据返回结果来判断。

3. 总结

  ① Http polling 是一种利用Javascript方法连续请求服务端来获取数据的方式。虽然不是最高效的,但是具有广泛的浏览器支持。(支持Js即可)

  ② Http long polling 是长连接方式,服务端收到请求后会保持连接,直到处理完成返回。然后客户端收到返回并处理完成再进行下一次连接。

  ③ WebSockets是一种在客户端和服务器端提供双工通信的方式。两端可以同时互相通信。客户端通过Http发送一个升级版请求到服务端,服务端收到后就会创建一个WebSockets连接。客户端和服务端都需要写代码来通过socket进行交互。

  ④ WebSockets适用于长时间的双向通信情况。并不是所有情况都适用,尤其是不支持HTML5的情况。

第六章 设计程序架构 之 设计实现WebSocket策略的更多相关文章

  1. 第三章 设计程序架构 之 设计实现Windows Azure 角色生命周期

    1. 概述 Windows Azure 是微软的云计算平台.用于 在微软数据中心 通过全局网络 生成.发布和管理应用程序. 本章内容包括 startup tasks 以及  实现 Start, Run ...

  2. 第七章 设计程序架构 之 设计HTTP模块和处理程序

    1. 概述 HTTP模块和处理程序,可以让程序员直接跟HTTP请求交互. 本章内容包括 实现同步和异步模块及处理程序以及在IIS中如何选择模块和处理程序. 2. 主要内容 2.1 实现同步和异步模块及 ...

  3. 【C++】《Effective C++》第六章

    第六章 继承与面向对象设计 条款32:确定你的public继承塑模出is-a关系 public隐含的寓意:每个派生类对象同时也是一个基类对象,反之不成立.只不过基类比派生类表现出更一般化的概念,派生类 ...

  4. MySQL性能调优与架构设计——第9章 MySQL数据库Schema设计的性能优化

    第9章 MySQL数据库Schema设计的性能优化 前言: 很多人都认为性能是在通过编写代码(程序代码或者是数据库代码)的过程中优化出来的,其实这是一个非常大的误区.真正影响性能最大的部分是在设计中就 ...

  5. MySQL性能调优与架构设计——第2章 MySQL架构组成

    第2章 MySQL架构组成 前言   麻雀虽小,五脏俱全.MySQL 虽然以简单著称,但其内部结构并不简单.本章从MySQL物理组成.逻辑组成,以及相关工具几个角度来介绍 MySQL 的整体架构组成, ...

  6. 精通Web Analytics 2.0 (8) 第六章:使用定性数据解答”为什么“的谜团

    精通Web Analytics 2.0 : 用户中心科学与在线统计艺术 第六章:使用定性数据解答"为什么"的谜团 当我走进一家超市,我不希望员工会认出我或重新为我布置商店. 然而, ...

  7. (转)iOS Wow体验 - 第六章 - 交互模型与创新的产品概念(1)

    本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第六章译文精选,其余章节将陆续放出.上一篇:Wow ...

  8. 【原创】构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下前篇)—简单的优化措施

    原文:[原创]构建高性能ASP.NET站点 第六章-性能瓶颈诊断与初步调优(下前篇)-简单的优化措施 构建高性能ASP.NET站点 第六章—性能瓶颈诊断与初步调优(下前篇)—简单的优化措施 前言:本篇 ...

  9. 简学Python第六章__class面向对象编程与异常处理

    Python第六章__class面向对象编程与异常处理 欢迎加入Linux_Python学习群  群号:478616847 目录: 面向对象的程序设计 类和对象 封装 继承与派生 多态与多态性 特性p ...

随机推荐

  1. 物理机装kali复盘

    复盘总结 最近把旧电脑想刷成kali的单系统,便下载了最新版本的kali 2018.1 的镜像文件.由此出现了很多问题. 首先在制作启动盘的时候,我用了很多软件,比如Ultriso,rufus,uni ...

  2. Watir 简化日常工作实例

    公司的官方主页要优化搜索任务,一共有110个独立页面,开发工程师做了以下工作:1. 为所有这些页面的每个图片添加了alt:2. 为页面上的每个标题添加了面包屑:3. 为网站最重要的标题设置H1标签,而 ...

  3. 洛谷 2668&2540 斗地主——搜索+贪心+dp

    题目:https://www.luogu.org/problemnew/show/P2540 发现如果没有顺子,剩下的可以贪心.所以搜索顺子怎么出,然后贪心. 这样只能过不加强版.原因是贪心的时候难以 ...

  4. 深度技术Win7系统利用diskpart命令实现硬盘分区的技巧

    转自:http://www.xitongcheng.com/jiaocheng/win7_article_2491.html 1. 深度技术Win7系统利用diskpart命令实现硬盘分区的技巧分享给 ...

  5. css sprite讲解与使用实例

    转自:http://www.manongjc.com/article/886.html 一.什么是css sprites css sprites直译过来就是CSS精灵.通常被解释为“CSS图像拼合”或 ...

  6. JAVA通过信号量避免死锁

    死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放.由于线程被无限期地阻塞,因此程序不可能正常终止. 导致死锁的根源在于不适当地运用"synchronized ...

  7. JavaWeb学习——获取类路径下的资源

    对于JavaWeb而言,获取类路径下的资源,就是获取classes目录下的资源. 获取资源的方式有两种,利用Class或ClassLoader. Class类的getResourceAsStream( ...

  8. HDU2222【AC自动机(基础·模板)】

    Frist AC zi dong ji(Aho-Corasick Automation) of life #include <bits/stdc++.h> using namespace ...

  9. 如何有效提升Unity Gear VR游戏性能

    http://www.vr186.com/vr_news/vr_technical_area/1093.html 好的,所以你决定用 Unity 来做一个 VR 游戏,并选定了三星 Gear vr 为 ...

  10. vm安装mac

    需要 vm虚拟机:vm10 mac系统:   mac10.9 vm安装mac补丁 :    unlokc-all-v120 vm tools for mac10.9: darwin6.0.3.iso ...