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

3. 总结

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

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

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

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

转载于:https://www.cnblogs.com/stone_lv/p/4789530.html

第六章 设计程序架构 之 设计实现WebSocket策略相关推荐

  1. 2022版Maven教程 - 第六章 单一架构案例

    2022版Maven教程 - 第六章 单一架构案例 一.创建工程,引入依赖 1.架构 ①架构的概念 ②单一架构 2.创建工程 3.引入依赖 ①搜索依赖信息的网站 [1]到哪儿找? [2]怎么选择? ② ...

  2. 将军今天讲c语言了吗第六,计算机c语言 第六章:函数 教学设计(修改).doc

    <C语言程序设计>之 ----- "函数"教学设计 贵州交通技师学院 张 红 <C语言程序设计>之 ----- "函数"教学设计 [教材 ...

  3. 《Effective C++》第三版 第六章 继承与面向对象设计 32~35条例

    文章目录 条款32:确定你的 `public` 继承塑膜出 is-a 关系 故事引入规则 案例说明 小结上代码 公有继承用法 企鹅不会飞 企鹅会飞,但那是错的! 总结 请记住 条款33:避免遮掩继承而 ...

  4. 六:分布式架构存储设计

    这里写目录标题 一. 单机存储系统介绍 1.什么是存储引擎 ??? 2. 单机存储引擎 2.1 hash存储引擎 2.2 B树存储引擎 2.3 lsm存储引擎 3 存储模型 3.1 键值数据模型之re ...

  5. ASP.NET Web程序设计 第六章 三层架构

    一.三层架构的理解 1.三层架构:基于高内聚低耦合的软件架构原则,提高项目的可维护性.可扩展性. 2.分层: 1)数据访问层:实现与数据库(数据存储区)的数据交互. 2)业务逻辑层:实现业务规则及数据 ...

  6. 走向ASP.NET架构设计-第六章-服务层设计(中篇)

    走向ASP.NET架构设计-第六章-服务层设计(中篇) 前言:上一篇文章介绍了一些服务层的基本知识,而且也简要的介绍了SOA的有关知识,本篇主要是介绍在服务层可以采用的一些模式.  本篇议题如下: F ...

  7. 系统架构师学习笔记_第六章(下)_连载

    系统架构师学习笔记_第六章(下)_连载 6.3 基于 UML 的软件开发过程 6.3.1  开发过程概述 UML 是独立于软件开发过程的,能够在几乎任何一种软件开发过程中使用.迭代的渐进式软件开发过程 ...

  8. 【正点原子FPGA连载】第六章Petalinux设计流程实战摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

  9. 【正点原子FPGA连载】第十六章Petalinux设计流程实战摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: h ...

最新文章

  1. 灯三段调光原理_球泡灯中国能效标识怎么做,GB30255中国能效报告办理要求
  2. 【Java 虚拟机原理】栈帧 | 动态链接 | 方法区 | 字节码文件二进制分析
  3. java 智能家居管理系统_智能家居系统手机客户端应用源码
  4. DCMTK:简单存储服务类用户
  5. java回调如何理解_如何理解java中的回调
  6. 【struts2】struts2中的Action详解
  7. oracle视图失效,ORACLE 11Gr2 V$ARCHIVED_LOG视图过期信息
  8. 获取某一条_想获取流量?这几种工具是必须要有的,能帮你获客快人一步!
  9. Simulink之不可控整流电路
  10. 结对开发2(求二维数组的最大子数组和)
  11. 【Spring】Spring常用配置-Bean的初始化和销毁(生命周期)
  12. Java日期与时间的处理/Date,String,Calendar转换
  13. Linux设备驱动--块设备(一)之概念和框架(转)
  14. 使用echarts模拟迁徙图
  15. 百度翻译API使用简介
  16. WWW‘22 推荐系统论文之序列推荐篇
  17. 小米9网络位置服务器,如何查看小米9手机当前的IP地址
  18. (17) 基于时空网络的出租车OD需求预测
  19. 迅捷画图怎样绘制出有创意的思维导图
  20. 鸡啄米VS2010/MFC编程入门教程——学习1初次接触

热门文章

  1. java学习(38):数组排序(直接排序)
  2. 实例4:python
  3. CSS之background-position属性
  4. mysql 查看锁_SQL-mysql锁等待与死锁
  5. vscode设置中文,设置中文不成功问题
  6. BZOJ1226 SDOI2009学校食堂(状压dp)
  7. hadoop 常用hdfs命令
  8. 省选专练[POI2005]SAM-Toy Cars
  9. RTTI: dynamic_cast typeid
  10. mysql批量生成修改表和列注释语句