第六章 设计程序架构 之 设计实现WebSocket策略

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第一百五十一期:最新计算机技能需求排名出炉:Python仅排第三,第一你猜得到吗?

除了编程语言之外&#xff0c;要想找一份计算机相关的工作&#xff0c;还需要很多其他方面的技能。最近&#xff0c;来自美国求职公司 Indeed 的一份报告显示&#xff1a;在全美工作技能需求中&#xff0c;数据库语言 SQL、编程语言 Java 分列前两位。 除了编程语言之外&#x…

Java学习笔记_身份验证机制

身份验证机制&#xff08;authentication&#xff09;&#xff1a;确定一个用户具有自己声称的那个身份 应用程序关心用户是否通过了验证而不关心是通过何种方式进行的验证&#xff1f;&#xff1f;&#xff1f; 授权&#xff08;访问控制&#xff1a;authorization&#xff09…

歌谣致学习编程的你们

目录 致学习编程的你们&#xff0c;希望对大家有所帮助&#xff0c;纯属个人学习经验 前言 学习路线 个人网课学习平台 个人推荐两款软件 个人对于参加培训的看法 个人博客写作 同事同学资源 总结 前言 我是歌谣&#xff0c;一个致力于成为一名优秀的技术革新人员。高…

开发者福音!面向Web场景的云开发服务正式开放!

导 语 继支持小程序开发之后&#xff0c;云开发也支持Web使用啦&#xff01;开发者们可以使用云开发提供的云端能力&#xff0c;直接开发网站应用&#xff0c;如PC端网页、公众号中的网页等。由此开发者可以在网站应用中借助云函数实现业务逻辑&#xff0c;通过与云数据库、对象…

PetShop4.0--转载

以下文章转载于http://www.cnblogs.com/dragonlhf/archive/2006/07/30/463110.html petshop是微软推出的企业级程序架构随着asp.net 2.0推出了petshop4.0&#xff0c;正好这几天没有事&#xff0c;研究一下&#xff0c;学习一下2.0的新特性&#xff0c; 它包括…

mybatis学习(7):Windows下安装MySQL详细教程

1、安装包下载。 下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/ 点击下载之后&#xff0c;可以选择注册Oracle账号&#xff0c;也可以跳过直接下载。 下载完成后&#xff0c;选择一个磁盘内放置并解压。 2 安装教程 &#xff08;1&#xff09;配置环境变量 变量…

[NLP] 相对位置编码(二) Relative Positional Encodings - Transformer-XL

1. Motivation 在Transformer-XL中&#xff0c;由于设计了segments&#xff0c;如果仍采用transformer模型中的绝对位置编码的话&#xff0c;将不能区分处不同segments内同样相对位置的词的先后顺序。 比如对于$segment_i$的第k个token&#xff0c;和$segment_j$的第k个token的…

SendMessage函数的常用消息及其应用

文本框控件通常用于输入和编辑文字。它属于标准 Windows 编辑控件的一个子类,所以它支持所有 编辑控件消息?这儿讲述的技术也适用于由其他厂商设计的 , 以Windows编辑控件类为基础的其他控件? 函数原型: Declare Function SendMessage Lib "user32" Alias "Se…

配置文件 web.config 的讨论

可以直接修改&#xff0c;修改后立即生效&#xff0c;无需重新编译&#xff0c;可以把数据连接对象直接加到web.config 中&#xff0c;从而方便修改&#xff0c;如果写在类中的话&#xff0c;修改后需要重新编译1、所有的配置都必须放在<configuration></configuratio…

mybatis学习(8):The server time zone value '???ú±ê×??±??' is unrecognized or represents more

【报错信息】 【百度翻译】 服务器时区值???????无法识别或表示多个时区。如果要利用时区支持&#xff0c;必须配置服务器或JDBC驱动程序&#xff08;通过ServerTimeZone配置属性&#xff09;&#xff0c;以使用更具体的时区值 【解决方法】 数据库连接配置conf.xml(在原…

Interesting Finds: 2008.03.17

.NET: LINQ Framework Design Guidelines 使用 Visual Studio 分析器找出应用程序瓶颈 Add Support for "Set" Collections to .NET Debug: ASP.NET Case Study: Hang on WaitOne, WaitAny or WaitMultiple Web: Silverlight 2 Developer Poster Syndication 资源 Ar…

Linux 常用的帮助命令

linux 常用的帮助命令 1.help -相当于man的简化版 例如&#xff1a;vim –help 2.man: 详细介绍vim的用法 例如&#xff1a;man vim 3.info:偏重介绍文档 例如&#xff1a; info vim

用进程管理的方法进行自我时间管理

用进程管理的方法进行自我时间管理 操作系统为了实现大的吞吐量&#xff0c;处理器的高效利用&#xff0c;各类资源的平衡使用&#xff0c;短的周转时间&#xff0c;快的响应时间&#xff0c;有保障的截止时间&#xff0c;设计了很多进程调度算法。而人类的思想成果是可以迁移的…

b/s c/s结构的区别!

1 引言 散进散出货物或者称为大宗入出库货物的管理是综合仓库管理的主要内容??1??2??。目前&#xff0c;随着信息技术和网络技术的发展&#xff0c;“信息高速公路”建设已在全球拉开序幕&#xff0c;传统的ClientServer??简称CS??网络应用系统模式在开放性与信息的发…

mybatis学习(9):mybatis连接mysql数据库

首先本地安装一个mysql数据库 修改账号密码 我的是root 123 并用navicate测试连接 数据库为mybatis 表名为users 我们看一下目录结构 直接上代码 user类 package com.edu.hpu.domain;/*** author Administrator*user表所对应的实体类*/ public class User {//实体类的属…

基于mt19937_64的字符串哈希(板子整理)

引自tourist的哈希板子&#xff0c;引入和时间相关的随机值mt19937_64&#xff0c;所以不会被卡掉 入参&#xff1a;传入string 使用&#xff1a; #include<bits/stdc.h> using namespace std; #define rep(i,a,b) for(int i(a);i<(b);i) #define per(i,a,b) for(i…

C#创建xml文件

View Code 1 XmlDocument doc new XmlDocument();2 XmlDeclaration dec doc.CreateXmlDeclaration("1.0", "GB2312", null);3 doc.AppendChild(dec);4 //创建一个根节点&#xff08;一级&#xff09;5 …

mybatis学习(10): sql server身份验证和windows身份验证

SQL Server 支持两种身份验证模式&#xff0c;即 Windows 身份验证模式和混合模式。 Windows 身份验证是默认模式&#xff08;通常称为集成安全&#xff09;&#xff0c;因为此 SQL Server 安全模型与 Windows 紧密集成。 信任特定 Windows 用户和组帐户登录 SQL Server。 已经…

C# 格式化字符串 String.Format

格式化日期和数字的字符串经常要用到这个, 就把帮助里面的东西大概整理了一些列在这里了. 下表描述了用来格式化 DateTime 对象的标准格式说明符。 格式说明符 名称 说明 d 短日期模式 显示由与当前线程关联的 DateTimeFormatInfo.ShortDatePattern 属性定义的模式或者由指定…

推荐几个.NET开源图表组件 [转]

转自&#xff1a;http://blog.csdn.net/liujien/archive/2005/10/03/494509.aspx推荐几个.NET开源图表组件&#xff0c;希望大家发行有其它的可以添加一下&#xff0c;说明&#xff1a;因为没有记录在哪里下载&#xff0c;所以大部分只能让大家亲自搜索一下&#xff1a; &#…