📜  streami 节点 js - Javascript (1)

📅  最后修改于: 2023-12-03 14:47:43.508000             🧑  作者: Mango

Streami Node.js

Streami Node.js是一个用于创建实时Web应用程序的JavaScript框架。它基于Node.js和WebSocket协议,可以在客户端和服务器之间创建轻量级和高效的双向通信。

安装

使用npm安装:

npm install streami-node
使用

服务器端

const streami = require('streami-node');
const http = require('http');

const server = http.createServer();
const io = streami(server);

io.on('connection', (socket) => {
  console.log('A user connected');

  // 发送消息
  socket.send('Hello, streami!');

  // 监听消息
  socket.on('message', (data) => {
    console.log(`Received message: ${data}`);
  });

  // 断开连接
  socket.on('disconnect', () => {
    console.log('A user disconnected');
  });
});

server.listen(3000, () => {
  console.log('Server started');
});

客户端

<!DOCTYPE html>
<html>
<head>
  <title>Streami Node.js Client</title>
  <script src="https://cdn.jsdelivr.net/npm/socket.io-client/dist/socket.io.js"></script>
  <script>
    const socket = io('http://localhost:3000');

    // 发送消息
    socket.send('Hello, streami!');

    // 监听消息
    socket.on('message', (data) => {
      console.log(`Received message: ${data}`);
    });

    // 断开连接
    socket.on('disconnect', () => {
      console.log('Disconnected from server');
    });
  </script>
</head>
<body>
</body>
</html>
API

服务器端

streami(server[, options])
  • server <http.Server> | <https.Server> | <number> | <object>:可选,可以是http/https服务器、端口号或选项对象。
  • options <object>:可选,选项对象,具体包括:
    • path <string>:指定WebSocket路径,默认为/socket.io
    • serveClient <boolean>:是否在响应请求时提供socket.io客户端文件,默认为true
    • adapter <Adapter>:指定适配器,默认为内存适配器。
    • origins <string>:指定允许访问的来源地址,默认为*:*
const streami = require('streami-node');
const http = require('http');

const server = http.createServer();
const io = streami(server, {
  path: '/socket-io',
  serveClient: false,
  adapter: 'memory',
  origins: 'http://localhost:* https://localhost:*'
});
io.on(event, listener)
  • event <string>:事件名称,如:connectiondisconnectmessage等。
  • listener <(...args: any[]) => void>:事件回调函数。
io.on('connection', (socket) => {
  console.log(`A user connected: ${socket.id}`);

  socket.on('message', (data) => {
    console.log(`Received message: ${data}`);
    socket.send('Hello, client!');
  });

  socket.on('disconnect', (reason) => {
    console.log(`A user disconnected: ${socket.id}, reason: ${reason}`);
  });
});
io.emit(event[, ...args])

向所有客户端发送事件和数据。

  • event <string>:事件名称。
  • args <any>:数据,可以是任意类型。
io.emit('new_message', 'Hello, all!');
io.in(room).emit(event[, ...args])

向指定房间的客户端发送事件和数据。

  • room <string>:房间名称。
  • event <string>:事件名称。
  • args <any>:数据,可以是任意类型。
io.in('room1').emit('message', 'Hello, room1!');
socket.join(room)

加入指定房间。

  • room <string>:房间名称。
socket.join('room1');
socket.leave(room)

离开指定房间。

  • room <string>:房间名称。
socket.leave('room1');
socket.send(data[, callback])

向当前客户端发送数据。

  • data <any>:数据,可以是任意类型。
  • callback <() => void>:可选,发送成功后的回调函数。
socket.send('Hello, client!');
socket.emit(event[, ...args])

向当前客户端发送事件和数据。

  • event <string>:事件名称。
  • args <any>:数据,可以是任意类型。
socket.emit('message', 'Hello, client!');
socket.join(room[, callback])

加入指定房间。

  • room <string>:房间名称。
  • callback <(err?: any) => void>:可选,加入成功后的回调函数。
socket.join('room1', (err) => {
  if (err) {
    console.error(err);
  } else {
    console.log('Joined room1');
  }
});
socket.leave(room[, callback])

离开指定房间。

  • room <string>:房间名称。
  • callback <() => void>:可选,离开成功后的回调函数。
socket.leave('room1', () => {
  console.log('Left room1');
});
socket.disconnect([close])

断开连接。

  • close <boolean>:可选,是否关闭底层套接字。
socket.disconnect(true);

客户端

io( [url][, options])
  • url <string>:可选,Socket.IO服务地址,默认为当前页面地址。
  • options <Object>:可选,选项对象,具体包括:
    • path <string>:指定WebSocket路径,默认为/socket.io
    • query <string>:指定查询参数,会附加到url和path之间。
    • forceNew <boolean>:是否创建新连接,默认为false
    • reconnection <boolean>:是否自动重连接,默认为true
    • reconnectionAttempts <number>:自动重连接尝试次数,默认为Infinity
    • reconnectionDelay <number>:自动重连接延迟时间(毫秒),默认为1000
    • reconnectionDelayMax <number>:自动重连接最大延迟时间(毫秒),默认为5000
    • randomizationFactor <number>:自动重连接延迟随机因子(介于0和1之间),默认为0.5
    • timeout <number>:连接超时时间(毫秒),默认为20000
    • transport <string>:使用的传输类型,默认为["polling", "websocket"]
    • autoConnect <boolean>:是否自动连接,当处于离线状态时禁用自动连接,默认为true
    • query <string> | <Object>:附加查询参数,可以是字符串或对象。
    • extraHeaders <Object>:附加HTTP头信息。
const socket = io('http://localhost:3000', {
  path: '/socket-io',
  reconnection: true,
  reconnectionDelay: 1000,
  timeout: 20000
});
socket.on(event, listener)
  • event <string>:事件名称,如:connectdisconnectmessage等。
  • listener <(...args: any[]) => void>:事件回调函数。
socket.on('connect', () => {
  console.log(`Connected: ${socket.id}`);
});

socket.on('message', (data) => {
  console.log(`Received message: ${data}`);
});

socket.on('disconnect', (reason) => {
  console.log(`Disconnected: reason: ${reason}`);
});
socket.emit(event[, ...args])

向服务器端发送事件和数据。

  • event <string>:事件名称。
  • args <any>:数据,可以是任意类型。
socket.emit('message', 'Hello, server!');
socket.send(data[, callback])

向服务器端发送数据。

  • data <any>:数据,可以是任意类型。
  • callback <() => void>:可选,发送成功后的回调函数。
socket.send('Hello, server!');
socket.join(room[, callback])

加入指定房间。

  • room <string>:房间名称。
  • callback <(err?: any) => void>:可选,加入成功后的回调函数。
socket.join('room1', (err) => {
  if (err) {
    console.error(err);
  } else {
    console.log('Joined room1');
  }
});
socket.leave(room[, callback])

离开指定房间。

  • room <string>:房间名称。
  • callback <() => void>:可选,离开成功后的回调函数。
socket.leave('room1', () => {
  console.log('Left room1');
});
socket.disconnect()

断开连接。

socket.disconnect();
适配器

内存适配器

使用内存存储数据,可以在单个进程中共享数据。

const streami = require('streami-node');
const http = require('http');

const server = http.createServer();
const io = streami(server, {
  adapter: 'memory'
});

Redis适配器

使用Redis数据库存储数据,可以在多个进程或服务器间共享数据。

const streami = require('streami-node');
const http = require('http');
const redis = require('socket.io-redis');

const server = http.createServer();
const io = streami(server, {
  adapter: redis({
    host: 'localhost',
    port: 6379
  })
});