WebSocket入门详解

1、WebSocket简介

首先,传统的浏览器客户端和服务器通讯的方式是基于HTTP协议的,而HTTP协议是单向的无状态的,一般传统基于HTTP协议的实现服务器向客户端“推送”数据的方式是通过在浏览器客户端进行轮询的方式来进行的,比如AJAX;也就是说传统的HTTP协议方式只能从客户端向服务器主动发送请求,而不能从服务器主动向客户端发送数据。WEBSOCKET的出现完美的解决了这个问题,它能够实现真正的双向通信,既能通过客户端发消息给服务器,也可以通过服务器主动推送消息给客户端;WEBSOCKET建立连接时第一次握手是通过HTTP协议的。

目前主流浏览器的比较新的版本都已经支持WEBSOCKET通信协议,可以通过window.WebSocket等简单的API来判断你所使用的浏览器是否支持WEBSOCKET。

WEBSOCKET相对于传统HTTP来说在实现实时数据传输方面具有巨大的优势,尤其在数据量大时,使用传统的基于HTTP协议的比如AJAX等轮询的方法需要频繁的建立连接请求,效率不高,而WEBSOCKET只要一次建立连接即可。

2、WebSocket属性和方法

 属性     

类型

描述

 

onopen

EventListener

服务器响应了WebSocket连接请求,open事件触发并建立了一个连接

ws.onopen = function () {

    console.log(ws);

};

 

 

 

 

 

 

 

onmessage

EventListener

1、接收到来自服务器的数据

//接收文本消息并显示消息内容

ws.onmessage = function (e) {

    console.log(e.data);

};

2、WebSocket还可以处理二进制数据,这种数据作为Blob消息或者ArrayBuffer消息。因为设置WebSocket消息二进制数据类型的应用会影响二进制消息,所以必须在读取数据之前决定用于客户端的二进制数据的类型

ws.binaryType = "blob";

ws.onmessage = function(e) {

if (e.data instanceof Blob) {

console.log("Blob", e.data);

           var blob = new Blob(e.data);

      }

};

ws.binaryType = "arraybuffer";

ws.onmessage = function(e) {

      if (e.data instanceof ArrayBuffer) {

         console.log("ArrayBuffer", +e.data);

         var a = new Uint8Array(e.data);

      }

};

 

onerror

EventListener

响应意外故障的时候触发,如果你接收一个 error 事件,可以预期很快就会触发 close 事件。error事件处理程序是调用服务器重连逻辑以及处理来自 WebSocket 对象的异常的最佳场所。

ws.onerror = function(e) {

    console.log(e);

};

 

 

onclose

EventListener

在WebSocket连接关闭时触发

/*

* close 事件有 3 个有用的属性(property),可以用于错误处理和恢复

* e.wasClean   布尔属性,表示连接是否顺利关闭

* e.code      表示服务器发送的关闭握手状态

* e.reason

* */

ws.onclose = function(e) {

     console.log(e);

};

url

由构造函数解析的URL。这是一个绝对的URL        只读

binaryType

DOMString

指示由连接发送的二进制数据的类型的字符串

bufferedAmount

unsigned long

浏览器将为你的客户端应用程序缓存出站数据,从而使你可

以随时调用 send(),发送任意数量的数据。可以使用 bufferedAmount 特性检查已经进入队列,但是尚未发送到服务器的字节数。                                  只读

extensions

DOMString

服务器选择的扩展

protocol

DOMString

指示服务器选择的子协议的名称的字符串; 这将是protocols创建WebSocket对象时在参数中指定的字符串之一。

 

 

readyState

unsigned short

报告连接状态                   

                特性常量                   

         值          

状态

WebSocket.CONNECTING

0

连接正在进行中,但还未建立

WebSocket.OPEN

1

连接已经建立。消息可以在客户

WebSocket.CLOSING

2

连接正在进行关闭握手

WebSocket.CLOSED

3

连接已经关闭,不能打开

只读

方法

描述

send()

连接打开时发送数据

function myEventHandler(data) {

   if (ws.readyState === WebSocket.OPEN) {

          ws.send(data);

   } else {

      // Do something else in this case.

   }

}

close(code,reason)

关闭连接。

参数说明

code 可选的

指示状态代码的数字值,解释连接正在关闭的原因。如果未指定此参数,则假定默认值为1000(表示正常的“事务完成”关闭)。

reason 可选的

一个人类可读的字符串,解释连接正在关闭的原因。该字符串必须不超过123个字节的UTF-8文本(不是字符)。

例: ws.close(1000,"正常关闭");

抛出异常

INVALID_ACCESS_ERR

code指定了无效。

SYNTAX_ERR

该reason字符串过长或包含不成对替代品。

code附录

1000          正常关闭       当你的会话成功完成时发送这个代码

1001          离开           因应用程序离开且不期望后续的连接尝试而关闭连接时,发送这一代码。服务器可能关闭,或者客户端应用程序可能关闭

1002          协议错误       当因协议错误而关闭连接时发送这一代码

1003     不可接受的数据类型  当应用程序接收到一条无法处理的意外类型消息时发送这一代码

1004          保留           不要发送这一代码。根据 RFC 6455,这个状态码保留,可能在未来定义

1005          保留           不要发送这一代码。WebSocket API 用这个代码表示没有接收到任何代码

1006          保留           不要发送这一代码。WebSocket API 用这个代码表示连接异常关闭

1007          无效数据       在接收一个格式与消息类型不匹配的消息之后发送这一代码。如果文本消息包含错误格式的 UTF-8 数据,连接应该用这个代码关闭

1008          消息违反政策    当应用程序由于其他代码所不包含的原因终止连接,或者不希望泄露消息无法处理的原因时,发送这一代码

1009          消息过大        当接收的消息太大,应用程序无法处理时发送这一代码(记住,帧的载荷长度最多为64 字节。即使你有一个大服务器,有些消息

也仍然太大。)

1010          需要扩展        当应用程序需要一个或者多个服务器无法协商的特殊扩展时,从客户端(浏览器)发送这一代码

1011          意外情况       当应用程序由于不可预见的原因,无法继续处理连接时,发送这一代码

1015      TLS失败(保留) 不要发送这个代码。WebSocket API 用这个代码表示 TLS 在 WebSocket 握手之前失败。

0 ~ 999        禁止              1000 以下的代码是无效的,不能用于任何目的

1000 ~ 2999    保留              这些代码保留以用于扩展和 WebSocket 协议的修订版本。按照标准规定使用这些代码,参见表 3-4

3000 ~ 3999   需要注册          这些代码用于“程序库、框架和应用程序”。这些代码应该在 IANA(互联网编号分配机构)公开注册

4000 ~ 4999   私有             在应用程序中将这些代码用于自定义用途。因为它们没有注册,所以不要期望它们能被其他 WebSocket广泛理解

3、.NET控制台程序实现WebSocket-Demo1

因为iis需要8.0以上才能支持websocket协议,所以以下demo我们都使用到了SuperWebSocket第三方框架,该例子实现了通过控制台程序与浏览器实现双向通讯,参考了https://www.cnblogs.com/lonelyxmas/p/4429354.html;需要能够运行的源代码的可以联系我。

4、Windows Service实现WebSocket-Demo2

最开始想在web后台程序中加入实现WEBSOCKET相关的功能,但是不知道如何在MVC框架之下写相关代码,在百度时找到了一种折中办法,在服务器上发布windows service,参考了https://www.cnblogs.com/xcong/p/4155577.htmlhttps://blog.csdn.net/wulex/article/details/70237973,需要源代码的可以联系我。

5、ASP.NET MVC下实现WebSocket-Demo3

功夫不负有心人,最后参考https://www.cnblogs.com/ShadowLoki/p/3714018.html完成了在MVC下实现WEBSOCKET,这样大大简化了部署,需要源代码可以联系我,18762406266。

猜你喜欢

转载自blog.csdn.net/timuzhang/article/details/81387113