问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

WebSocket是什么原理?

发布网友 发布时间:2022-05-12 04:21

我来回答

2个回答

懂视网 时间:2022-05-12 08:43

1.WebSocket通信基础知识

WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。 使用ws或wss协议,是下一代客户端-服务器的异步通信方法。

在WebSocket API中,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

现在,很多网站为了实现即时通讯(real-time),所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(time interval)(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request d的模式带来很明显的缺点 – 浏览器需要不断的向服务器发出请求(request),然而HTTP request 的header是非常长的,里面包含的数据可能只是一个很小的值,这样会占用很多的带宽。

而最比较新的技术去做轮询的效果是Comet – 用了AJAX。但这种技术虽然可达到全双工通信,但依然需要发出请求(reuqest)。

这里写图片描述

在 WebSocket API,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。在此WebSocket 协议中,为我们实现即使服务带来了两大好处:

1. Header

互相沟通的Header是很小的-大概只有 2 Bytes

2. Server Push

服务器可以主动传送数据给客户端,只要客户端打开的socket与服务器建立连接后,就可以把数据推送到这个socket上,从被动转为主动。

WebSocket并不限于以Ajax(或XHR)方式通信,因为Ajax技术需要客户端发起请求,而WebSocket服务器和客户端可以彼此相互推送信息;XHR受到域的限制,而WebSocket允许跨域通信。
Ajax技术很聪明的一点是没有设计要使用的方式。WebSocket为指定目标创建,用于双向推送消息。

2、HTML5 WebSockets API

WebSocket对象

WebSocket在DOM中是window对象的子对象,它具有:

  • WebSocket(url)构造函数。

  • readyState。只读属性,其值可以是CONNECTING(0),OPEN(1),CLOSED(3)。

  • boolean send(in DOMString data)

  • void close()两个方法,分别用于发送消息和关闭WebSocket连接

  • onopen, onmessage, 和onclosee三个事件属性,分别对open, message和close三个WebSocket事件。

    1、浏览器支持情况检测

    检测浏览器支持情况

    function loadDemo() { 
     if (window.WebSocket) { 
     //supported 
     } else { 
     // not supported 
     } 
    }

    2、WebSocket对象的创建和服务器连接

    要连接通信端点,只需要创建一个新的WebSocket实例,并提供希望连接的对端URL。ws://和wss://前缀分别表示WebSocket连接和安全的WebSocket连接。

    url = "ws://localhost:8080/echo"; w = new WebSocket(url);

    建立WebSocket连接时,可以列出Web应用能够使用的协议。WebSocket构造函数的第二个参数既可以是字符串,也可以是字符串组。

    w = new WebSocket(url, ["proto1", "proto2"]);

    假设proto1和proto2是定义明确、可能已注册且标准化的协议名称,它们能够同时为客户端和服务器端所理解。服务器会从列表中选择首选协议。

    onopen = function(e) { 
     //确定服务器选择的协议 
     log(e.target.protocol); 
    }

    3、添加事件监听器

    WebSocket编程遵循异步编程模型;打开socket后,只需等待事件发生,而不需要主动向服务器轮询,所以需要在WebSocket对象中添加回调函数来监听事件。
    WebSocket对象有三个事件:open、close和message对应有三个事件监听器onopen,onmessage,onclose来处理连接的生命周期的每个阶段,当然还可以是onerror来监听错误,如以下示例所示。

    w.onopen = function() { 
     log("open"); 
     w.send("send message"); 
    } 
    w.onmessage = function(e) { 
     log(e.data); 
    } 
    w.onclose = function(e) { 
     log("closed"); 
    } 
    w.onerror = function(e) { 
     log("error"); 
    }

    4、发送消息

    当socket处于打开状态(即onopen之后,onclose之前),可以用send方法来发送消息。消息发送完,可以调用close方法来终止连接,也可以不这么做,让其保持打开状态。

    w.send();

    你可能想测算在调用Send()函数之前,有多少数据备份在发送缓冲区中。bufferAmount属性表示已在WebSocket上发送但尚未写入网络的字节数。它对于调节发送速率很有用。

    document.getElementById("sendButton").onclick = function() { 
     if (w.bufferedAmount < bufferThreshold) { 
     w.send(document.getElementById("inputMessage").value); 
     } 
    }

    WebSocket API支持以二进制数据的形式发送Blob和ArrayBuffer实例

    var a = new Uint8Array([8, 6, 7, 5, 3, 0, 9]); 
    w.send(a.buffer);

    常量-readyState属性

    这些常量是readyState属性的取值,可以用来描述WebSocket连接的状态。

    ConstantValueDescription
    CONNECTING0连接还没开启。
    OPEN1连接已开启并准备好进行通信。
    CLOSING2连接正在关闭的过程中。
    CLOSED3连接已经关闭,或者连接无法建立。

    3.实例

    <!DOCTYPE html><html><head>
     <title>webSocket实例</title></head><body>
     <h2>webSocket实例</h2>
     <input type="text" id="text">
     <button type="" id="connect" onclick="connect()">建立连接</button>
     <button type="" id="send" onclick="send()">发送数据</button>
     <button type="" id="disconnect" onclick="disconnect()">断开连接</button>
     <p id="message"></p>
     <script type="text/javascript">
     var socket; var readyState = ["正在连接","已经连接","正在断开","已经断开"]; var message = document.getElementById('message'); function connect(){
    
      try{  var url = 'ws:localhost/test';
      socket = new webSocket(url);
      message.innerHTML += "<p>socket状态:" +readyState[socket.readyState]+"</p>";
      socket.onopen = function(){
       message.innerHTML += "<p>socket状态:" +readyState[socket.readyState]+"</p>";
      }
      socket.onmessage = function(msg){
       message.innerHTML += "<p>socket状态:" +readyState[socket.readyState]+'<br>'+ "接收数据" + msg.data +"</p>";
      }
      socket.onclose = function(){
       message.innerHTML += "<p>socket状态:" +readyState[socket.readyState]+"</p>";
      }
      }catch(exception){  // socket.onerror = function(){
       message.innerHTML += "<p>发生错误!"+"</p>";  // }
      }
     } function send(){
      var text = document.getElementById('text').value;  try{
      socket.send(text);
      message.innerHTML += "<p>发送数据:" + text +"</p>";
      }catch(exception){
      message.innerHTML += "<p>发送数据出错</p>";
      }
     } function disconnect(){
      socket.close();
     } </script></body></html>

    1.WebSocket通信基础知识

    WebSocket是HTML5开始提供的一种浏览器与服务器间进行全双工通讯的网络技术。 使用ws或wss协议,是下一代客户端-服务器的异步通信方法。

    在WebSocket API中,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

    现在,很多网站为了实现即时通讯(real-time),所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(time interval)(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request d的模式带来很明显的缺点 – 浏览器需要不断的向服务器发出请求(request),然而HTTP request 的header是非常长的,里面包含的数据可能只是一个很小的值,这样会占用很多的带宽。

    而最比较新的技术去做轮询的效果是Comet – 用了AJAX。但这种技术虽然可达到全双工通信,但依然需要发出请求(reuqest)。

    这里写图片描述

    在 WebSocket API,浏览器和服务器只需要要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。在此WebSocket 协议中,为我们实现即使服务带来了两大好处:

    1. Header

    互相沟通的Header是很小的-大概只有 2 Bytes

    2. Server Push

    服务器可以主动传送数据给客户端,只要客户端打开的socket与服务器建立连接后,就可以把数据推送到这个socket上,从被动转为主动。

    WebSocket并不限于以Ajax(或XHR)方式通信,因为Ajax技术需要客户端发起请求,而WebSocket服务器和客户端可以彼此相互推送信息;XHR受到域的限制,而WebSocket允许跨域通信。
    Ajax技术很聪明的一点是没有设计要使用的方式。WebSocket为指定目标创建,用于双向推送消息。

    2、HTML5 WebSockets API

    WebSocket对象

    WebSocket在DOM中是window对象的子对象,它具有:

  • WebSocket(url)构造函数。

  • readyState。只读属性,其值可以是CONNECTING(0),OPEN(1),CLOSED(3)。

  • boolean send(in DOMString data)

  • void close()两个方法,分别用于发送消息和关闭WebSocket连接

  • onopen, onmessage, 和onclosee三个事件属性,分别对open, message和close三个WebSocket事件。

    1、浏览器支持情况检测

    检测浏览器支持情况

    function loadDemo() { 
     if (window.WebSocket) { 
     //supported 
     } else { 
     // not supported 
     } 
    }

    2、WebSocket对象的创建和服务器连接

    要连接通信端点,只需要创建一个新的WebSocket实例,并提供希望连接的对端URL。ws://和wss://前缀分别表示WebSocket连接和安全的WebSocket连接。

    url = "ws://localhost:8080/echo"; w = new WebSocket(url);

    建立WebSocket连接时,可以列出Web应用能够使用的协议。WebSocket构造函数的第二个参数既可以是字符串,也可以是字符串组。

    w = new WebSocket(url, ["proto1", "proto2"]);

    假设proto1和proto2是定义明确、可能已注册且标准化的协议名称,它们能够同时为客户端和服务器端所理解。服务器会从列表中选择首选协议。

    onopen = function(e) { 
     //确定服务器选择的协议 
     log(e.target.protocol); 
    }

    3、添加事件监听器

    WebSocket编程遵循异步编程模型;打开socket后,只需等待事件发生,而不需要主动向服务器轮询,所以需要在WebSocket对象中添加回调函数来监听事件。
    WebSocket对象有三个事件:open、close和message对应有三个事件监听器onopen,onmessage,onclose来处理连接的生命周期的每个阶段,当然还可以是onerror来监听错误,如以下示例所示。

    w.onopen = function() { 
     log("open"); 
     w.send("send message"); 
    } 
    w.onmessage = function(e) { 
     log(e.data); 
    } 
    w.onclose = function(e) { 
     log("closed"); 
    } 
    w.onerror = function(e) { 
     log("error"); 
    }

    4、发送消息

    当socket处于打开状态(即onopen之后,onclose之前),可以用send方法来发送消息。消息发送完,可以调用close方法来终止连接,也可以不这么做,让其保持打开状态。

    w.send();

    你可能想测算在调用Send()函数之前,有多少数据备份在发送缓冲区中。bufferAmount属性表示已在WebSocket上发送但尚未写入网络的字节数。它对于调节发送速率很有用。

    document.getElementById("sendButton").onclick = function() { 
     if (w.bufferedAmount < bufferThreshold) { 
     w.send(document.getElementById("inputMessage").value); 
     } 
    }

    WebSocket API支持以二进制数据的形式发送Blob和ArrayBuffer实例

    var a = new Uint8Array([8, 6, 7, 5, 3, 0, 9]); 
    w.send(a.buffer);

    常量-readyState属性

    这些常量是readyState属性的取值,可以用来描述WebSocket连接的状态。

    ConstantValueDescription
    CONNECTING0连接还没开启。
    OPEN1连接已开启并准备好进行通信。
    CLOSING2连接正在关闭的过程中。
    CLOSED3连接已经关闭,或者连接无法建立。

    3.实例

    <!DOCTYPE html><html><head>
     <title>webSocket实例</title></head><body>
     <h2>webSocket实例</h2>
     <input type="text" id="text">
     <button type="" id="connect" onclick="connect()">建立连接</button>
     <button type="" id="send" onclick="send()">发送数据</button>
     <button type="" id="disconnect" onclick="disconnect()">断开连接</button>
     <p id="message"></p>
     <script type="text/javascript">
     var socket; var readyState = ["正在连接","已经连接","正在断开","已经断开"]; var message = document.getElementById('message'); function connect(){
    
      try{  var url = 'ws:localhost/test';
      socket = new webSocket(url);
      message.innerHTML += "<p>socket状态:" +readyState[socket.readyState]+"</p>";
      socket.onopen = function(){
       message.innerHTML += "<p>socket状态:" +readyState[socket.readyState]+"</p>";
      }
      socket.onmessage = function(msg){
       message.innerHTML += "<p>socket状态:" +readyState[socket.readyState]+'<br>'+ "接收数据" + msg.data +"</p>";
      }
      socket.onclose = function(){
       message.innerHTML += "<p>socket状态:" +readyState[socket.readyState]+"</p>";
      }
      }catch(exception){  // socket.onerror = function(){
       message.innerHTML += "<p>发生错误!"+"</p>";  // }
      }
     } function send(){
      var text = document.getElementById('text').value;  try{
      socket.send(text);
      message.innerHTML += "<p>发送数据:" + text +"</p>";
      }catch(exception){
      message.innerHTML += "<p>发送数据出错</p>";
      }
     } function disconnect(){
      socket.close();
     } </script></body></html>

    热心网友 时间:2022-05-12 05:51

    WebSocket是html5新增加的一种通信协议,目前流行的浏览器都支持这个协议,例如Chrome,Safari,Firefox,Opera,IE等等,对该协议支持最早的应该是chrome,从chrome12就已经开始支持,随着协议草案的不断变化,各个浏览器对协议的实现也在不停的更新。该协议还是草案,没有成为标准,不过成为标准应该只是时间问题了,从WebSocket草案的提出到现在已经有十几个版本了,目前最新的是版本17,所对应的协议版本号为13,目前对该协议支持最完善的浏览器应该是chrome,毕竟WebSocket协议草案也是Google发布的。第二行到第五行为WebSocket对象注册消息的处理函数,WebSocket对象一共支持四个消息 onopen, onmessage, onclose和onerror,当Browser和WebSocketServer连接成功后,会触发onopen消息;如果连接失败,发送、接收数据失败或者处理数据出现错误。

    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    修复征信是不是真的? 市面上征信修复公司可靠吗? 征信修复公司是真是假,真的可以修复吗? Emulex FC HBA卡 皮肤毛囊炎怎样治 银行自动扣款什么原因 银行什么情况自动扣款 贷款自动扣款什么意思 粤省事办理准生证需要多久 粤省事办理准生证步骤 为什么于嘉说山猫队和网队的比赛,少了易建联山猫进攻都没那么流畅了... 海天注塑机滤网阻塞怎么清除警报 滤网计数已到达设定时间是什么意思 spes海盐洁发膏是酸性还是碱性 spes诗裴丝防脱洗发水好用么?用过的来说说! 有没有谁用过Spes诗裴丝防脱洗发水,效果怎么样? 求一款防脱效果好的洗发水!Spes诗裴丝洗发水怎么样 有没有什么好的防脱洗发水推荐?Spes诗裴丝洗发水怎么样 请问有人知道Spes诗裴丝这个牌子吗?看到有博主推荐它们家的洗发水,有用过的吗?求真实分享。? 哪个牌子的洗发水防脱发效果好?spes诗裴丝洗发水怎么样 掉头发很严重怎么办?spes洗发水真的可以防脱吗 有用过spes家产品的么?它家的洗发水怎么样 请问有人用过Spes诗裴丝这个牌子的洗发护发产品吗?最近掉发严重,想换这个牌子试试。 spes在线下超市有吗 Spes诗裴丝的洗发水好用吗?有硅油吗? spes洗发水可以和飘柔免洗护发素一起使用吗 spes诗裴丝洗发水男士可以用吗 怎么把原音乐转换成伴奏? 康家智暖热线? 康家智暖多少钱一台,电视购物频道现在卖499,原价1499? 康家智暧一个小时要多少电? 像鹿的标志的羽绒服韩国牌子 有种韩国的羽绒服有个黑猫圆圈标志的是什么牌子的衣服? 韩国明星冬天穿的羽绒服怎么都是特别厚的那种,几乎是一个种类! 韩国hp品牌羽绒服官网 迦蓝道可信任吗? 你好,HTML5的websocket和C#的普通Socket(非C#webSocket)能相互通信么,小弟最近也遇到这个问题了。 糯米元子的做法 我炸的元子皮很厚不好吃是什原因 请问家装对智能家居的需求情况如何? CAv智能家居行业情况? 网上注册营业执照身份认证不了是怎么回事 中国和国外做智能家居最强的都是什么公司?以及最新国内外研究动态 智能家居的竞争情况及存在问题、发展思路 小米6该用哪个版本的模拟器 小米手机账号怎样在安卓模拟器上登 电脑手游模拟器能下载小米版本的手机游戏吗 安卓模拟器怎么成功安装部落冲突小米版? 2009年霹雳火命农历六月初六女孩下午十五点三十五出生五行缺什么取名用什么字? 火命取名带火字旁好还是带水字旁好 VMware 虚拟机模块“disk”启动失败