创建 TCP 服务器的完整流程
- 引入
net
模块:在 Node.js 中,通过 net
模块来创建 TCP 服务器。使用 const net = require('net');
引入该模块。
- 创建服务器实例:调用
net.createServer([options][, connectionListener])
方法来创建服务器实例。其中 options
是可选参数,connectionListener
是当有新连接时的回调函数。例如:
const server = net.createServer((socket) => {
// 处理新连接的逻辑,socket 是与客户端通信的套接字对象
socket.write('Welcome!\n');
socket.on('data', (data) => {
socket.write('You sent: ' + data.toString());
});
socket.on('end', () => {
console.log('Connection ended');
});
});
- 监听端口:使用服务器实例的
listen
方法,指定要监听的端口号和可选的主机地址。例如:
server.listen(8080, '127.0.0.1', () => {
console.log('Server listening on port 8080');
});
性能优化方面
- 连接池:如果有大量并发连接,可以使用连接池来管理连接。减少创建和销毁连接的开销,提高连接的复用率。
- 负载均衡:通过负载均衡器将请求均匀分配到多个服务器实例上,避免单个服务器负载过高。可以使用软件负载均衡器如 Nginx,或者云服务提供商提供的负载均衡服务。
- 优化代码逻辑:减少不必要的计算和 I/O 操作。例如,避免在处理连接的回调函数中进行复杂的同步计算,可以将这些计算放在异步任务中处理。
- 内存管理:注意处理大流量数据时的内存使用,及时释放不再使用的内存。例如,正确处理缓冲区数据,避免内存泄漏。
- 使用集群(Cluster)模块:Node.js 提供了
cluster
模块,可以利用多核 CPU 的优势,创建多个工作进程来处理请求,提高服务器的整体性能。
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`worker ${worker.process.pid} died`);
});
} else {
http.createServer((req, res) => {
res.writeHead(200);
res.end('Hello World\n');
}).listen(8000, () => {
console.log(`Worker ${process.pid} started`);
});
}
- 优化网络配置:调整系统的网络参数,如
tcp_max_tw_buckets
、tcp_tw_reuse
等,优化 TCP 连接的处理。但这需要对系统网络有深入了解,且可能因操作系统不同而有所差异。