• Socket.IO 客户端 API IO


    IO

    创建方式

    <script src="/socket.io/socket.io.js"></script>
    <script>
      const socket = io('http://localhost');
    </script>
    

    或者使用require或import

    const io = require('socket.io-client');
    // or with import syntax
    import io from 'socket.io-client';
    

    io.protocol

    • Nubmer

    协议修订号

    io([url][, options])

    • url 默认为window.location
    • options (Object) forceNew是否重用已存在的连接
    • return Socket

    为给定的URL创建一个Manager,并且在后续的调用中重用该连接,除非设置forceNew:true'force new connection': true

    查询参数可以在query中提供,也可以在URL中提供


    初始化例子

    多路复用

    默认情况下,连接到不同的命名空间使用单个连接,可以通过设置options的forceNew来禁用

    const socket = io();
    const adminSocket = io('/admin');
    // a single connection will be established
    
    const adminSocket = io('/admin', { forceNew: true });
    // will create two distinct connections
    
    const socket = io();
    const socket2 = io();
    // will also create two distinct connections
    

    注意:重用相同的命名空间,将创建两个连接

    自定义路径

    const socket = io('http://localhost/admin', {
      path: '/mypath'
    });
    

    socket使用自定义路径mypath连接到admin命名空间

    请求地址如下:localhost/mypath/?EIO=3&transport=polling&sid=<id>

    查询参数

    const socket = io('http://localhost?token=abc');
    
    // server-side
    const io = require('socket.io')();
    
    // middleware
    io.use((socket, next) => {
      let token = socket.handshake.query.token;
      if (isValid(token)) {
        return next();
      }
      return next(new Error('authentication error'));
    });
    
    // then
    io.on('connection', (socket) => {
      let token = socket.handshake.query.token;
      // ...
    
    });
    

    通过scoket.handshake获得握手细节信息

    查询选项

    const socket = io({
      query: {
        token: 'cde'
      }
    });
    

    查询内容可以在重新连接时更新

    socket.on('reconnect_attempt', () => {
      socket.io.opts.query = {
        token: 'fgh'
      }
    });
    

    extraHeaders

    仅在启用轮询时有效。使用websocket传输时,不会追加自定义header。这是因为websocket不支持自定义header

    const socket = io({
      transportOptions: {
        polling: {
          extraHeaders: {
            'x-clientid': 'abc'
          }
        }
      }
    });
    
    // server-side
    const io = require('socket.io')();
    
    // middleware
    io.use((socket, next) => {
      let clientId = socket.handshake.headers['x-clientid'];
      if (isValid(clientId)) {
        return next();
      }
      return next(new Error('authentication error'));
    });
    

    仅使用webscoket传输

    默认情况下,先建立一个长轮询连接,然后升级至“更好”的传输(就像websocket)

    const socket = io({
      transports: ['websocket']
    });
    
    // on reconnection, reset the transports option, as the Websocket
    // connection may have failed (caused by proxy, firewall, browser, ...)
    socket.on('reconnect_attempt', () => {
      socket.io.opts.transports = ['polling', 'websocket'];
    });
    

    自定义解析器

    服务器和客户端需要使用同一种解析器方便解析

    const parser = require('socket.io-msgpack-parser'); // or require('socket.io-json-parser')
    const socket = io({
      parser: parser
    });
    
    // the server-side must have the same parser, to be able to communicate
    const io = require('socket.io')({
      parser: parser
    });
    

    自签名证书

    // server-side
    const fs = require('fs');
    const server = require('https').createServer({
      key: fs.readFileSync('server-key.pem'),
      cert: fs.readFileSync('server-cert.pem')
    });
    const io = require('socket.io')(server);
    server.listen(3000);
    
    // client-side
    const socket = io({
      // option 1
      ca: fs.readFileSync('server-cert.pem'),
    
      // option 2. WARNING: it leaves you vulnerable to MITM attacks!
      rejectUnauthorized: false
    });
    
  • 相关阅读:
    javascript 时间与时间戳的转换
    javascript 判断对象的内置类型
    javascript 动态脚本添加
    javascript select标签的操作
    javascript canvas画订单
    css 移动端图片等比显示处理
    FastDFS分布式文件系统
    欧拉回路--模板
    tarjan求双联通分量--POJ 1523 +P2860 [USACO06JAN]Redundant Paths G
    tarjan求割点和割边
  • 原文地址:https://www.cnblogs.com/goOtter/p/10118451.html
Copyright © 2020-2023  润新知