Socket.io adapter for websocket
npm install think-websocket-socket.io
Edit config file src/config/adapter.js
, add options:
const socketio = require('think-websocket-socket.io');
exports.websocket = {
type: 'socketio',
common: {
// common config
},
socketio: {
handle: socketio,
allowOrigin: null, // any origin is allowed by default
path: '/socket.io', // `/socket.io` by default.
adapter: null,
messages: [{
open: '/websocket/open', // websocket action when connected
close: '/websocket/close', // websocket action when close
addUser: '/websocket/addUser', //websocket addUser action when event is addUser
}]
}
}
Edit config file src/config/config.js
, add options:
module.exports = {
// ...
stickyCluster: true
// ...
}
path
: The socket.io process path is /socket.io
by default. You can edit the folloing configuration if you need.
adapter
: When using multiple nodes to deploy WebSocket, multiple nodes can communicate with Redis. You can get things done by set up adapter. For example:
const socketio = require('think-websocket-socket.io');
const redis = require('socket.io-redis');
const adapter1 = redis({ host: 'localhost', port: 6379 });
exports.websocket = {
type: 'socketio',
socketio: {
// ...
adapter: adapter1,
// ...
}
}
allowOrigin
: Sets the allowed origins value. Defaults to any origins being allowed. allowOrigin
can be string
, array
or function
. More detail see at https://socket.io/docs/server-api/#server-origins-value[https://socket.io/docs/server-api/#server-origins-value].
// server
module.exports = class extends think.Controller {
constructor(...arg) {
super(...arg);
}
openAction() {
console.log('ws open');
return this.success();
}
closeAction() {
console.log('ws close');
return this.success();
}
addUserAction() {
console.log('addUserAction ...');
console.log(this.wsData); // this.req.websocketData, 'thinkjs'
console.log(this.websocket); // this.req.websocket, websocket instance
console.log(this.isWebsocket); // this.isMethod('WEBSOCKET'), true
return this.success();
}
}
// in `view/websocket_index.html`
// <script src="http://lib.baomitu.com/socket.io/2.0.1/socket.io.js"></script>
var socket = io();
socket.on('opend', function(data) {
console.log(data);
});
socket.emit('addUser', 'thinkjs');
You can emit event to the current socket in Action through this.emit
:
// server
module.exports = class extends think.Controller {
constructor(...arg) {
super(...arg);
}
openAction() {
this.emit('opend', 'This client opened successfully!');
return this.success();
}
}
// client
//<script src="http://lib.baomitu.com/socket.io/2.0.1/socket.io.js"></script>
var socket = io();
socket.on('opend', function(data) {
console.log(data);
});
You can broadcast event to all sockets in Action through method this.broadcast
:
// server
module.exports = class extends think.Controller {
constructor(...arg) {
super(...arg);
}
openAction() {
this.broadcast('joined', 'There is a new client joined successfully!');
return this.success();
}
}
// client
//<script src="http://lib.baomitu.com/socket.io/2.0.1/socket.io.js"></script>
var socket = io();
socket.on('joined', function(data) {
console.log(data);
});