美文网首页
websocket学习笔记

websocket学习笔记

作者: 西普士 | 来源:发表于2016-07-13 10:30 被阅读601次

websocket

websocket是web传递消息的一种协议。web传递消息的方式主要有轮询(polling)、长轮询(long-polling)、流(streaming)、插件提供socket、websocket几种方式。

websocket是html5的协议,握手协议跟http一样,握手完成之后建立TCP链接。

websocket建立的链接是持久,http的链接是非持久的。

http的生命周期通过Request来界定,也就是一个Request一个Response,在HTTP1.0中,这次HTTP请求就结束了。

在HTTP1.1中进行了改进,使得有一个keep-alive,也就是说,在一个HTTP连接中,可以发送多个Request,接收多个Response。但Response是被动的,不能主动发起。

使用websocket需要服务端、客户端、代理同时支持。

socket.io

socket.io实现了polling和websocket两种协议。如何使用,github上有example

  • 服务端

    var server = require('http').createServer();
    var io = require('socket.io')(server);
    io.on('connection', function(socket){
      socket.on('event', function(data){});
      socket.on('disconnect', function(){});
    });
    server.listen(3000);
    
  • 前端页面需要引入socket.io.js,它是socketio生成的动态js

    <script src="/socket.io/socket.io.js"></script>
    
  • 前端js

      var socket = io();  
      socket.on('new message', function (data) {
        addChatMessage(data);
      });
    

运行example,监听网络,可以看到发了4个?EIO***的请求(不知道为什么会发4次,第一个请求是客户端告诉服务端我支持websocket)。polling和websocket方式都有:

polling和websocket请求

polling和websocket最大的区别就是请求头不一样,websocket的请求头如下所示:

websocket请求头

把前端js代码调整下,设置socket.io的options,让它只连接websocket:

var socket = io({transports: ["websocket"]})

设置之后,只有一个websocket的?EIO***连接。连接完成之后第一次发送的数据设置多久执行一次心跳(ping-pong)。之后每隔一定时间data中都会多出两条数据。

websocket请求体

参考资料

socket.io源码
HTTP的长连接和短连接——Node上的测试
借助Nodejs探究WebSocket
Web 消息推送及 WebSocket 简介
WebSocket 是什么原理?为什么可以实现持久连接?

相关文章

网友评论

      本文标题:websocket学习笔记

      本文链接:https://www.haomeiwen.com/subject/jjvsjttx.html