Socket.IO 入门指南:实时通信应用程序开发
写于2023年05月16日

Socket.IO 是一个基于 Node.js 的实时应用程序框架,它允许实时、双向和事件性通信。它包含一个客户端库和一个服务器库,并在不同的传输协议之间具有自动降级的能力。Socket.IO 提供了可靠性和实时性,被广泛用于聊天应用程序、实时游戏和协作编辑等在线应用。

一、安装

要使用 Socket.IO,你需要在服务器端和客户端分别安装 Socket.IO 库。在服务器端,可以使用 npm 安装 Socket.IO:

1
npm install socket.io

在客户端,可以使用 Script 标签加载 Socket.IO 库:

1
<script src="/socket.io/socket.io.js"></script>

二、建立连接

Socket.IO 在服务器和客户端之间建立一个 WebSocket 连接,这样就可以实时地发送和接收数据。下面是一个简单的服务器端代码,用来监听客户端连接:

1
2
3
4
5
const io = require("socket.io")(server);

io.on("connection", (socket) => {
console.log("A client connected");
});

在客户端,可以使用 io 对象来连接服务器:

1
const socket = io("http://localhost:3000");

http://localhost:3000 替换为你的服务器地址和端口号。
如果连接成功,会触发 connect 事件:

1
2
3
socket.on("connect", () => {
console.log("Connected to server");
});

三、发送和接收数据

Socket.IO 在服务器和客户端之间的通信是通过事件(event)来进行的。可以使用 socket.emit() 方法发送一个事件,使用 socket.on() 方法监听一个事件。
服务器端:

1
2
3
4
5
6
7
io.on("connection", (socket) => {
socket.emit("message", "Welcome to the chat room");

socket.on("chat", (message) => {
io.emit("chat", message);
});
});

客户端:

1
2
3
4
5
6
7
8
9
10
11
12
socket.on("message", (message) => {
console.log(message);
});

const messageInput = document.querySelector("#message-input");
const sendButton = document.querySelector("#send-button");

sendButton.addEventListener("click", () => {
const message = messageInput.value;
socket.emit("chat", message);
messageInput.value = "";
});

在上面的代码中,当客户端连接到服务器时,服务器会向客户端发送一个 message 事件,并在客户端上显示欢迎消息。
当用户输入一条消息并点击发送按钮时,客户端会发送一个 chat 事件到服务器,并且服务器会将这条消息广播给所有连接到服务器的客户端。同时,客户端通过监听 chat 事件来接收服务器发来的消息,并在页面上显示。

四、断开连接

当客户端不再需要连接服务端时,应该关闭这个连接。可以使用 socket.disconnect() 方法,在客户端关闭连接:

1
socket.disconnect();

在服务器端,可以监听到 disconnect 事件:

1
2
3
4
5
io.on("connection", (socket) => {
socket.on("disconnect", () => {
console.log("A client disconnected");
});
});

在这个事件处理程序中,可以进行一些必要的清理操作,例如从在线用户列表中移除该用户,或者取消对该用户的监听等。

Socket.IO还提供了许多丰富的功能,例如房间(rooms)、命名空间(namespace)、广播(broadcasting)、Acknowledgements等,这些功能,就等待大家自己来探索了。