likes
comments
collection
share

026 WebSocket详解

作者站长头像
站长
· 阅读数 23

什么是websocket?

简介

Websocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信,即允许服务器主动发送信息给客户端。因此,在Websocket中,浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的链接,并进行双向数据传输,客户端和服务器之间的数据狡猾变得更加简单。

Websocket的优势

TTTP协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理,HTTP协议无法实现服务器主动向客户端发起消息。

这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。大多数Web应用程序将通过频繁的异步JavaScript 和 XML(Ajax)请求实现长轮询。轮询的效率低,非常浪费资源。

现在,很多网站为了实现推送技术,所用的技术都是Ajax轮询。轮询是在特定的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。

这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求。然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会很浪费很多的带宽等资源。HTML5定义的Websocket协议优势如下:

  • 小Header:互相沟通的Header非常小,只有2Bytes左右。
  • 服务器不再被动接收到浏览器的请求之后才返回数据,而是在有新数据时就主动推送给浏览器。
  • Websocket协议能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

使用场景

业务场景场景概述
弹幕终端用户A在自己的手机端发送了一条弹幕信息,但是您也需要在客户A的手机端上将其他N个客户端发送的弹幕信息一并展示。需要通过WebSocket协议将其他客户端发送的弹幕信息从服务端全部推送至客户A的手机端,从而使客户A可以同时看到自己发送的弹幕和其他用户发送的弹幕。
在线教育老师进行一对多的在线授课,在客户端内编写的笔记、大纲等信息,需要实时推送至多个学生的客户端,需要通过WebSocket协议来完成。
股票等金融产品实时报价股股票黄金等价格变化迅速,变化后,可以通过WebSocket协议将变化后的价格实时推送至世界各地的客户端,方便交易员迅速做出交易判断。
体育实况更新由于全世界体育爱好者数量众多,因此比赛实况成为其最为关心的热点。这类新闻中最好的体验就是利用WebSocket达到实时的更新。
视频会议和聊天尽管视频会议并不能代替和真人相见,但是应用场景众多。WebSocket可以帮助两端或多端接入会议的用户实时传递信息。
基于位置的应用越来越多的开发者借用移动设备的GPS功能来实现基于位置的网络应用。如果您一直记录终端用户的位置(例如:您的 App记录用户的运动轨迹),就可以收集到更加细致化的数据。

前端代码

var start = function() {
    var wsImpl = window.WebSocket || window.MozWebSocket
    window.ws = new wsImpl('ws://localhost:30000/')
    // 接收到消息的回调方法
    ws.onmessage = function(evt) {
        // evt.data为后台推送数据
        console.log(evt.data)
    }
    // 连接成功建立的回调方法
    ws.open = function() {
        // 连接已打开
    }
    // 连接关闭的回调方法
    ws.onclose = function() {
        // 连接已关闭
    }
}
window.onload = start
<!DOCTYPE html>
<html>

 <head>
  <meta charset="utf-8">
  <title>WebSocket</title>
  <script type="text/javascript" src="js/jquery.min.js"></script>
 </head>

 <body>
  <div id="main" style="width: 1200px;height:800px;"></div>
  Welcome<br/><input id="text" type="text" />
  <button onclick="send()">发送消息</button>
  <hr/>
  <button onclick="closeWebSocket()">关闭WebSocket连接</button>
  <hr/>
  <div id="message"></div>
 </body>
 <script type="text/javascript">
  var websocket = null;
  //判断当前浏览器是否支持WebSocket
  if('WebSocket' in window) {
   //改成你的地址
   websocket = new WebSocket("ws://192.168.100.196:8082/api/websocket/100");
  } else {
   alert('当前浏览器 Not support websocket')
  }

  //连接发生错误的回调方法
  websocket.onerror = function() {
   setMessageInnerHTML("WebSocket连接发生错误");
  };

  //连接成功建立的回调方法
  websocket.onopen = function() {
   setMessageInnerHTML("WebSocket连接成功");
  }
  var U01data, Uidata, Usdata
  //接收到消息的回调方法
  websocket.onmessage = function(event) {
   console.log(event);
   setMessageInnerHTML(event);
   setechart()
  }

  //连接关闭的回调方法
  websocket.onclose = function() {
   setMessageInnerHTML("WebSocket连接关闭");
  }

  //监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
  window.onbeforeunload = function() {
   closeWebSocket();
  }

  //将消息显示在网页上
  function setMessageInnerHTML(innerHTML) {
   document.getElementById('message').innerHTML += innerHTML + '<br/>';
  }

  //关闭WebSocket连接
  function closeWebSocket() {
   websocket.close();
  }

  //发送消息
  function send() {
   var message = document.getElementById('text').value;
   websocket.send('{"msg":"' + message + '"}');
   setMessageInnerHTML(message + "&#13;");
  }
 </script>

</html>

转载自:https://juejin.cn/post/7302404170413490202
评论
请登录