当前位置: 首页 > news >正文

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
});

转载于:https://www.cnblogs.com/goOtter/p/10118451.html

相关文章:

  • 伯克利开源 Confluo,吞吐量是 Kafka 的 4 到 10 倍
  • 第八周编程总结
  • 枚举类的基本使用
  • rsync 数据备份+cron+mailx案例
  • Sublime插件:Terminal
  • centos下安装nginx
  • poi读取Excel模板并修改模板内容与动态的增加行
  • Siri shortcuts 指北
  • day15生成器面试题和内置函数
  • idea debug
  • 关于XML文件
  • SQL自动流水号函数
  • NOI2018屠龙勇士(扩展CRT + splay(multiset))
  • 4 Redis 配置文件介绍
  • 定时任务Cron常用表达式与在线生成器
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【Linux系统编程】快速查找errno错误码信息
  • github从入门到放弃(1)
  • javascript 总结(常用工具类的封装)
  • log4j2输出到kafka
  • SSH 免密登录
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 百度小程序遇到的问题
  • 动态魔术使用DBMS_SQL
  • 使用agvtool更改app version/build
  • 提醒我喝水chrome插件开发指南
  • 数据库巡检项
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #WEB前端(HTML属性)
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • $.ajax()方法详解
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (27)4.8 习题课
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (转)树状数组
  • *** 2003
  • ***监测系统的构建(chkrootkit )
  • .gitignore文件---让git自动忽略指定文件
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NET 设计一套高性能的弱事件机制
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .net和php怎么连接,php和apache之间如何连接
  • :中兴通讯为何成功
  • @Autowired注解的实现原理
  • @ModelAttribute 注解
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [BZOJ4010]菜肴制作
  • [C++]高精度 bign (重载运算符版本)
  • [CSS]CSS 字体属性
  • [docker]docker网络-直接路由模式
  • [flask]http请求//获取请求体数据