Socket.io
Easy abstraction for sockets with lib for client and NodeJS server
npm install socket.io
npm install socket.io-client
Supports JSON, ArrayBuffer, and Blob
Highly robust: Autoreconnects; starts with longpolling before upgrading to Websockets if supported
General Usage
IO
Emit sends event to all connect clients
//server
io.emit('some event', { someProperty: 'some value', otherProperty: 'other value' });
//client
socket.on('some event', (data) => {
//....
});
Rooms allow you to create seperate channels
Socket
.id
- each socket by default joins a room identified by this random id
Emit event to specific socket
//send to socket.id
socket.emit('request', ...);
//send to id
socket.broadcast.to(id).emit('my message', msg);
Only server-side, broadcast sends message to everyone except socket that starts it
socket.broadcast.emit('request', {...});
Namespace
Setup custom namespace's server-side
const nsp = io.of('/my-namespace');
nsp.on('connection', function(socket){
console.log('someone connected');
});
nsp.emit('hi', 'everyone!');
Then connect to it client side
const socket = io('/my-namespace');
Room
Within each namespace, you can have many rooms that can be joined or left
io.on('connection', function(socket){
socket.join('some room');
});
//And then simply use to or in (they are the same) when broadcasting or emitting:
io.to('some room').emit('some event');
To leave a channel you call leave in the same fashion as join. Both methods are asynchronous and accept a callback argument.
Server/Client Usage
Server
Setuping up with express generator's bin/www is a little tricky
Socket.js
//Sockets
const socket_io = require("socket.io");
const debug = require("debug")("app:socket");
const io = socket_io();
const socketAPI = {};
socketAPI.io = io;
io.on("connection", socket => {
debug("connected");
});
io.on("disconnect", evt => {
debug("some people left");
});
socketAPI.sendMessage = () => {
io.emit("message", { banana: 1 });
};
module.exports = socketAPI;
Require this file to access the right fts in the routes
bin/www
let server = http.createServer(app);
const io = socketApi.io;
io.attach(server);
Client
import io from 'socket.io-client';
//by default connects to server that served it, 1st arg is the route to connect on
const socket = io();
socket.on("message", evt => {
console.log("Recieved Msg", evt);
socket.emit("message", evt);
});
PM
Client-side (sending message)
socket.emit("private", { msg: chatMsg.val(), to: selected.text() });
where to
refers to the id to send a private message to and msg
is the content.
Client-side (receiving message)
socket.on("private", function(data) {
chatLog.append('<li class="private"><em><strong>'+ data.from +' -> '+ data.to +'</strong>: '+ data.msg +'</em></li>');
});
where chatLog
is a div displaying the chat messages.
Server-side
client.on("private", function(data) {
io.sockets.sockets[data.to].emit("private", { from: client.id, to: data.to, msg: data.msg });
client.emit("private", { from: client.id, to: data.to, msg: data.msg });
});
Extra
Authentication can be done by appending user token to query string
Or socketio-auth
Last updated