Об использовании socket.io

WebSocket

Оригинальный адрес:Об использовании socket.io

узнал на этот разsocket.io, написал с ним небольшой проект и резюмировал здесь его основное использование и некоторые ключевые моменты.socket.ioосновывается наNode.jsа такжеWebSocketПлатформа с открытым исходным кодом для протоколов связи в реальном времени, которая включает JavaScript на стороне клиента и Node.js на стороне сервера.

Сервер

Фреймворк, используемый в этом бэкэнде,koa2,socket.ioПривязать себя к процессу коа, важнейшим событием которого являетсяconnectionа такжеdisconnect. Это системные события, определяемые самим фреймворком, а значит, он существует естественным образом и не требует нашей настройки.Конечно, есть и другие системные события, но они редко используются.

const koa = require('koa')
const app = new koa()
const server = require('http').createServer(app.callback())
const io = require('socket.io')(server)

//监听connect事件
io.on('connection', socket => {
  socket.emit('open');//通知客户端已连接
  console.log('connected');
  
  //监听disconnect事件
  socket.on('disconnect', () => {
    console.log('disconnect')
  }
});
server.listen(3001);

клиент

Веб-сторона может напрямую передать URL-адрес, который отслеживается здесь.openСобытие определяется пользователем, и соответствующий сервер отправляетсяopenмероприятие.

import io from 'socket.io-client';

//建立websocket连接
const socket = io('http://127.0.0.1:3001');

//收到server的连接确认
socket.on('open', () => {
    showTip('socket io is open !');
    init();
});

излучать и дальше

emitа такжеonявляются двумя наиболее важными API, соответствующимиОтправитьа такжемонитормероприятие.

  • socket.emit(eventName[, ...args]): создать (запустить) событие
  • socket.on(eventName, callback): слушать событие, сгенерированное emit

Мы можем очень свободно определять и отправлять события на стороне сервера.emit, а затем слушать на стороне клиентаon, наоборот.

Формат отправляемого контента также очень свободен, это могут быть базовые типы данных.Number,String,Booleanподождите, это тоже может бытьObject,Arrayтипы или даже функции. Использование функций обратного вызова обеспечивает более переносимые взаимодействия.

/*** 服务端 **/
socket.on('message',data =>{
  console.log(data)
});

socket.emit('send','hello everybody');

/*** 客户端 **/
socket.emit('message',{id:'1',txt:'hello'});

socket.on('send',data =>{
  console.log(data);
});

//回调函数
/*** 服务端 **/
socket.on('sayit', (word, callback)=> {
  callback('say ' + word);
});

/*** 客户端 **/
socket.emit('sayit', 'wow', data => { 
  console.log(data); // say wow
});
 

транслировать

broadcastПо умолчанию транслируется на все соединения сокетов, но не на самого отправителя.Если вы планируете получать сообщения самостоятельно, вам нужно отправлять их себе.

/*** 服务端 **/
io.on('connection', socket => {
 const data= {
   txt:'new user login',
   time:new Date()
 }
 //广播向所有socket连接
 socket.broadcast.emit('userin',data);
 //给自己也发一份
 socket.emit('userin',data);
});

пространство имен

Если вы хотите изолировать области или разделить бизнес-модули,namespaceявляется эффективным методом.namespaceЭквивалентно созданию нового канала, вы можетеsocket.ioСлужбы изолируют различные соединения, события и промежуточное ПО.

Соединение по умолчанию такжеnamespaceда, это/;

Первый способ использования пространства имен — добавить имя поддомена сразу после ссылки, что фактически использует тот же процесс обслуживания сокетов, что можно рассматривать как мягкую изоляцию.

/*** 客户端 **/
import io from 'socket.io-client';

//默认的namespace
const socket = io('http://127.0.0.1:3001');
// mypath
const socket = io('http://127.0.0.1:3001/mypath', { forceNew: true });

/*** 服务端 **/
//默认的namespace
io.on('connection', socket => {
});
// mypath
io.of('/mypath').on('connection', socket => {
});

Второй способ использования параметра namespace:path, это настоящий перезапуск службы сокетов.

/*** 客户端 **/
const socket = io('http://localhost', {
  path: '/mypath'
});

/*** 服务端 **/
// 另外重新起socket服务
const io = require('socket.io')({
  path: '/mypath'
});

промежуточное ПО

socket.ioПромежуточное ПО kao2 очень похоже на kao2, а это означает, что мы можем преобразовать промежуточное ПО koa2 вsocket.ioИспользовал.

const mypath = io.of('/mypath').on('connection', socket => {
    socket.on('message', data => {
    });
});

//中间件
const auth = (socket, next) => {
  const data = socket.request;
  if(!verify(data)){
    throw new Error('not verify');
  }
  next();
}
// mypath 这个 namespace 注册中间件
mypath.use(auth);

rooms

Каждое соединение сокета будет иметь уникальный знак, который является socket.id, и мы используем идентификатор, чтобы различать разные соединения. Кроме того, сам socket.id также является комнатой.roomПризнак , говоря простым языком, у каждого сокета есть своя комнатаroom. тогда мы можем дать этоroomОтправляйте сообщения, и если вы присоединитесь к комнате, вы сможете получать трансляции в комнате. Конечно, вы можете настроитьroom, разрешите присоединению или удалению соединений сокетов. Также, если розетка отключена, то есть после отключения, она будет автоматически вынесена за пределы помещения.

И это реализацияобщаться в одиночествеа такжеГрупповой чатДавайте посмотрим на соответствующий API.

  • socket.join(rooms[, callback]): присоединиться к комнате
  • socket.leave(room[, callback]): покинуть комнату
  • socket.to(room): отправить сообщение в комнату
// 自定义room
io.on('connection', socket =>{    
  socket.join('some room')); // 加入房间
  socket.leave('some room'); // 离开房间
}); 

// 向房间里的所有客户端发送消息
io.to('some room').emit('some event'); 

// 默认房间(每一个id一个room)
socket.on('say to someone', (id, msg) => {    
    socket.broadcast.to(id).emit('my message', msg); 
}); 

Суммировать

Я считаю, что с базовыми знаниями, представленными выше, и соответствующими документами на официальном сайте, легко разработать чаты или другие проекты для общения в реальном времени.

официальный сайт socket.ioЕсть очень подробные объяснения и варианты использования API.