node服务端通过socket.io保持长连接通信示例
本文旨在给出一个node服务端通过socket.io保持长连接通信的示例。
node版本:18.16.1
socket.io及socket.io-client版本:2.1.1
数据发送方服务端代码:
const http = require('http').createServer();
const io = require('socket.io')(http);io.on('connection', (socket) => {console.log('a user connected');socket.on('disconnect', () => {console.log('user disconnected');});setInterval(() => {console.log('send message');io.emit('message', 'a message from server.');}, 5000);
});http.listen(3000, () => {console.log('listening on http://192.168.0.1:3000');
});
数据接收方服务端代码:
const http = require('http').createServer();const io = require('socket.io-client');
let socket = io(`http://192.168.0.1:3000`);socket.on('message', res => {console.log(res);
});http.listen(3001, () => {console.log('listening on http://192.168.0.1:3001');
});
注意在本地运行前,需要把涉及的IP信息替换成本机IP。
2个服务端均成功启动后,在接收方的控制台可以看到发送方传递的消息,即表明通信成功,效果示意图如下:
如果发送方是https server,则示例需要稍作调整。
数据发送方服务端代码(https):
var fs = require('fs');const options = {key: fs.readFileSync('./ca/cakey.pem'),cert: fs.readFileSync('./ca/cacert.pem')
}const https = require('https').createServer(options);
const io = require('socket.io')(https);io.on('connection', (socket) => {console.log('a user connected');socket.on('disconnect', () => {console.log('user disconnected');});setInterval(() => {console.log('send message');io.emit('message', 'a message from server.');}, 5000);
});https.listen(3000, () => {console.log('listening on https://192.168.0.1:3000');
});
数据接收方服务端代码:
const http = require('http').createServer();const io = require('socket.io-client');
let socket = io(`https://192.168.0.1:3000`, {rejectUnauthorized: false
});socket.on('message', res => {console.log(res);
});http.listen(3001, () => {console.log('listening on http://192.168.0.1:3001');
});
注意数据接收方服务端本身仍然是http服务,但需要与https server建立长连接,此时由于我们使用的是自签证书,因此在建立长连接时需要声明忽略证书校验,也就上面的rejectUnauthorized需要设置为false。
补充证书数据:
cakey.pem
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCt4/3uQFLgyOGa0lFD8Y6QiVALVOwj1dV0ScMwtXskw0YvBqDk
tvW/xHFftmcqHj0/J8rBTcBXnQKPW/mAedE1jObkpUdv5h0VPI/dJ/uuFm/CoZr0
cKFwzY3hOPfNxXj/1wu7RA+eEbZXy1QaGETAb4reIp94gwc500Uvf0yzSwIDAQAB
AoGBAI9RrRW0AFryVjdjhsUoD2eDNOzSBnqWoIJi1TSNLzyikXLq1KsNPMjcYNER
JkApgjNOWacurQvJBbYgiShhvpI2bvnm12cq06Yh7NeWGwlejNXUV7PpvOptPUXD
An1hCyxdBp0eKDkh+ygbnPPsJQPes8sQvhJZ0TokgivEDKtRAkEA5KllwmzABQ8C
PlCQpEcU/Ukp4WNGsd5dBzMgxV5yHqvS4oSOgr4mwl78kLFRb4aS0KqHl7q3ztmp
qOmlQHJjWQJBAMKuOdt4Aec7N6eVD6MGfjfbRW5RVjN/5ScByvKzIkc/UC/nVRMT
kCS/JQQPpVcrD8mKzohiwTARizptb04660MCQBGEvOwZYtjAXp6hk4NSgtQo79F5
xqfH7n6ntyIH61xYM67xEu4HXXbUyirXuvJ9b/AWsI66Wmy5llr/k46NdPkCQBdj
GL49x3TAz2nJZWx/PjB1nfyntsRPC/dIptnLHUYT3A01LCozgnB3qfm363PyT141
16PYwT6GDQTC2sk6GMMCQERslIy4tmWDq4P+Nf5GYV8h3ZaD0OA6GhbdfrozxhyI
KC7GI/hF8XaTAWM8U0Lw/VFVNS3C2WzuAfPFbmoAUI0=
-----END RSA PRIVATE KEY-----
cacert.pem
-----BEGIN CERTIFICATE-----
MIICZjCCAc+gAwIBAgIUCn88IxDVmvZKqgVaCVCPioC7DccwDQYJKoZIhvcNAQEL
BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMjA3MDUwOTIyNTBaFw0yMjA4
MDQwOTIyNTBaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwgZ8wDQYJKoZIhvcNAQEB
BQADgY0AMIGJAoGBAK3j/e5AUuDI4ZrSUUPxjpCJUAtU7CPV1XRJwzC1eyTDRi8G
oOS29b/EcV+2ZyoePT8nysFNwFedAo9b+YB50TWM5uSlR2/mHRU8j90n+64Wb8Kh
mvRwoXDNjeE4983FeP/XC7tED54RtlfLVBoYRMBvit4in3iDBznTRS9/TLNLAgMB
AAGjUzBRMB0GA1UdDgQWBBTzVCK2pDw/w/OfmtAQQHXCvv9NxDAfBgNVHSMEGDAW
gBTzVCK2pDw/w/OfmtAQQHXCvv9NxDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
DQEBCwUAA4GBAJ7jf6ZTGXy5UWgN4nsfg3R/MA/FWbacatUwLrHH5U/vP6oxFY5a
4q7Cth4ayRagU7jF2kz6zZeEL0M+6b9Ysio9DquEbYnhUAnJBRm8l51wHkH5/fwQ
GYoKQlUx8R2vM84lHn/FPZazKOuIoaxSLGwwubn5BnW6N4W+HMbtRNa8
-----END CERTIFICATE-----