随着 Web 应用程序的不断发展,越来越多的应用需要实时通信。而传统的 HTTP 协议是无法做到实时通信的,因此就需要使用 WebSocket 或者类似的技术。Socket.io 是一种实时通信技术,它可以在 Node.js 中使用。
Socket.io 简介
Socket.io 是一个基于事件的实时通信库。它支持 WebSocket、轮询和反向长轮询等多种传输方式,并且提供了很多有用的功能,比如房间系统和命名空间系统,可以让我们很方便地管理客户端连接。
安装 Socket.io
要在 Node.js 中使用 Socket.io,我们需要先安装它。可以使用 npm 安装:
$ npm install socket.io
安装成功之后,我们就可以在代码中引入它:
const io = require('socket.io')();建立服务器
建立 Socket.io 服务器有两种方式:使用 HTTP 服务器或者使用 Express 应用。
使用 HTTP 服务器
使用 HTTP 服务器可以让我们更加自由地控制程序的运行,但相对来说会比较繁琐一些。
const http = require('http');
const server = http.createServer();
const io = require('socket.io')(server);
server.listen(3000);使用 Express 应用
如果我们已经在使用 Express 应用了,那么可以直接使用 app 对象来建立 Socket.io 服务器。
const express = require('express');
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);
server.listen(3000);建立连接
客户端可以使用 WebSocket 或者 Comet 等方式来连接 Socket.io 服务器。我们可以在服务器端监听 connection 事件来建立连接:
io.on('connection', socket => {
console.log('a user connected');
});当用户连接成功之后就可以发送消息了。我们可以使用 socket.emit() 来向客户端发送消息。
io.on('connection', socket => {
console.log('a user connected');
socket.emit('welcome', 'Welcome to Socket.io!');
});如果需要向所有客户端广播消息,可以使用 io.emit()。
io.on('connection', socket => {
console.log('a user connected');
io.emit('chat message', 'a user connected');
});接收消息
在客户端发来消息之后,我们可以在服务器端监听 message 事件来获取消息。同样,我们可以使用 socket.on() 来监听事件。
io.on('connection', socket => {
console.log('a user connected');
socket.on('chat message', message => {
console.log('message: ' + message);
});
});接收到消息之后,我们可以向所有客户端广播一条消息。
io.on('connection', socket => {
console.log('a user connected');
socket.on('chat message', message => {
console.log('message: ' + message);
io.emit('chat message', message);
});
});区分连接
当一个 Socket.io 服务器连接多个客户端时,如何区分这些客户端的连接呢?我们可以使用命名空间和房间来管理连接。
命名空间
命名空间是一种分组机制,可以让我们区分不同种类的连接。我们可以使用 of 方法来创建一个命名空间:
const chatNamespace = io.of('/chat');
chatNamespace.on('connection', socket => {
console.log('a user connected to chat namespace');
});上面的代码创建了一个名为 /chat 的命名空间,当客户端连接到 /chat 时会触发 connection 事件。
房间
房间是一种分组机制,可以让我们把不同的连接放到一个房间中,以便更好地管理连接。我们可以使用 join 方法来把连接加入到一个房间:
io.on('connection', socket => {
socket.join('room1');
});然后我们可以使用 to 方法来向某个房间中的所有连接广播消息:
io.on('connection', socket => {
socket.join('room1');
io.to('room1').emit('chat message', 'hello');
});完整示例
下面是一个使用 Socket.io 实现简单的聊天室的完整示例:
// www.javascriptcn.com code example
const express = require('express');
const app = express();
const server = require('http').Server(app);
const io = require('socket.io')(server);
app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html');
});
io.on('connection', socket => {
console.log('a user connected');
socket.on('chat message', message => {
console.log('message: ' + message);
io.emit('chat message', message);
});
});
server.listen(3000, () => {
console.log('listening on *:3000');
});在这个示例中,用户可以访问 localhost:3000 来进入聊天室。当用户发送消息时,服务器会把消息广播给所有连接。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67cfaf06e46428fe9eb7f9a3