Node.js中Socket通信的原理与实现详解
本文解析Node.js环境下Socket通信的基本原理,对比其与HTTP短连接的区别。通过原生net模块与Socket.io库两种方案,详细演示服务器与客户端的代码实现,涵盖连接监听、消息广播及事件推送等核心功能,帮助开发者快速掌握实时通信技术的落地方法。
Socket通信基础原理
结构:
Socket作为应用层与传输层之间的接口,其处理的数据通常在本机完成,不会直接进入网络传输。
涉及数据:
Socket传输的数据形式为报文,且以明文方式存在。
作用:
主要功能是建立持久的网络连接,以便网络中的两个进程能够进行持续通信。
Nodejs环境下的简单通信。
代码:
服务器端(serve):
Node.js原生Socket通信实现
// 1 引入模块
const net = require('net');
// 2 创建服务器
let clientArr = [];
const server = net.createServer();
// 3 绑定链接事件
server.on('connection',(person)=>{
console.log(clientArr.length);
// 记录链接的进程
person.id = clientArr.length;
clientArr.push(person);
person.setEncoding('utf8');
// 客户socket进程绑定事件
person.on('data',(chunk)=>{
console.log(chunk);
clientArr.forEach((val)=>{
// 数据写入全部客户进程中
val.write(chunk);
})
})
person.on('close',(p1)=>{
clientArr[p1.id] = null;
} )
person.on('error',(p1)=>{
clientArr[p1.id] = null;
})
})
server.listen(800);
客户端(client):
// 1 引入模块
const net = require('net');
const readline = require('readline');
// 2 创建套接字和输入输出命令行
let rl = readline.createInterface({
// 调用std接口
input:process.stdin,
output:process.stdout
})
let client = new net.Socket();
// 3 链接
client.connect(800,'localhost');
client.setEncoding('utf8');
client.on('data',(chunk)=>{
})
client.on('error',(e)=>{
console.log(e.message);
})
// 绑定输io流事件,获取输入输出字符
rl.on('line',(mes)=>{
client.write(mes);
})
小结:
服务器端:绑定连接事件 --> 在连接事件中管理客户端进程对象(1,把添加到数组中 2,处理客户端发来的数据)-->开启端口监听请求 。
客户端流程:创建用于连接服务器的套接字,并执行连接操作。
Socket建立的连接属于长连接,而应用层的HTTP协议基于三次握手,通常表现为短连接。
Socket的工作原理与HTTP类似,区别在于Socket不规定断开连接的时间。可以将HTTP比作办理业务时往返一次连接流程,而Socket则是一次建立连接后,直到完成所有事务才断开。
Socket的主要作用是实现客户端与服务端之间的实时通信,保持会话持续。与Ajax请求不同,Socket在每次对话后不会立即断开连接。
在Node.js中实现Socket通信并不复杂,核心在于掌握监听(.on)和推送(.emit)消息的操作。
Socket服务端
在服务端使用Socket,需先引入socket.io模块,详细文档可参考https://socket.io/:
cnpm install socket.io
服务端实例代码如下:
基于Socket.io的实时通信实战
var server = app.listen(8081, "127.0.0.1", function() {
var host = server.address().address;
var port = server.address().port;
});
/********************socketIO********************/
var io = require('socket.io').listen(server);
// 建立连接
io.sockets.on('connection', function(socket) { //此处每个回调socket就是一个独立的客户端,通常会用一个公共列表数组统一管理
// 连接断开,如关闭页面时触发
socket.on('disconnect', function() {
console.log('已断开链接');
});
// 监听客户端发送的消息
socket.on('clientmessage', function(data) {
//推送给除自己外其他所有用户的消息,类似于广播
socket.broadcast.emit('message', {
text: '你的朋友上线了'
});
});
//发送给自己的消息
socket.emit('message', {
text: '你上线了'
});
});
上例中实现了4步:
1. 建立连接并添加断开连接监听。
2. 建立clientmessage监听,当客户端发来该名称的事件时,服务器向除自己外的其他用户广播事件名称为message的消息。
3. 在刚建立连接时,向客户端推送事件名称为message的消息。
其中主要应用到的函数有5个:
- .on('connection', function(socket){ }):与客户端建立连接时监听。
- .on('disconnect', function(){ }):与客户端断开连接时监听。
- .on('event-name', function(data) { }):监听客户端发来的消息。
- .broadcast.emit('event-name', { }):向除自己外的所有其他用户广播消息。
- .emit('event-name', { }):仅向当前连接的客户端(自己)推送消息。
(注)相关客户端的接口关联请往下看客户端的例子。
Socket客户端
需先去下载socket.io.js文件,下载地址为:https://github.com/socketio/socket.io-client
客户端实例代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>socketio测试</title>
<script>
var tmp_html = '<link rel="stylesheet" href="../js/libs/bootstrap/3.3.7/css/bootstrap.css" rel="external nofollow" />';
tmp_html += '<script src="../js/libs/jquery/3.2.1/jquery.js"><\/script>';
tmp_html += '<script src="../js/libs/bootstrap/3.3.7/bootstrap.js"><\/script>';
tmp_html += '<script src="../js/libs/socketio/socket.io.js"><\/script>';
document.write(tmp_html);
document.close();
</script>
</head>
<body>
<button id="btn">发送消息</button>
</body>
<script>
var socket = io.connect('http://127.0.0.1:8081');
socket.on('message', function(data) {
console.log(data.text);
})
$("#btn").click(function() {
socket.emit('clientmessage', {
text: "hello"
});
});
</script>
</html>
客户端主要应用到的函数有2个:
- .on('event-name', function(data) { }):监听服务端发来的消息。
- .emit('event-name', { }):向服务端推送消息。
Socket即时通信实现简单,且在连接断开时会自动重连。此外,还可以使用net模块的套接字实现,具体可查阅Node.js文档。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
在 NestJS 中使用管道验证数据与守卫控制访问权限
2026-11-05 12:43:41
Node.js后端生成高强度随机字符串的方法
2026-11-04 16:29:54
Node.js环境中怎么使用axios或http模块发送GET请求
2026-11-03 21:57:15
Node.js环境下怎么实现JS反混淆自动化?常用库与CLI工具推荐
2026-11-03 21:15:54
解决JS逆向常见报错:缺少DOM环境导致代码运行失败
2026-11-03 20:41:59
