我用 https 創建了一個 nodejs 服務器。發出 GET 請求時沒有問題,但是當連接另一個與 socket.io-client 一起使用的 nodejs 應用程式時,我收到錯誤訊息“WebSocket 在連接建立之前已關閉”。可能是什么原因?
服務器.js:
import https from 'https';
import fs from 'fs';
import { Server } from 'socket.io';
const options = {
key: fs.readFileSync('../certs/server-key.pem'),
cert: fs.readFileSync('../certs/server-crt.pem'),
ca: [
fs.readFileSync('../certs/client-ca-crt.pem')
],
requestCert: true,
rejectUnauthorized: false
};
const server = https.createServer(options);
const io = new Server(server, { serveClient: false });
io.sockets.on('connection', function (socket) {
console.log(socket.id);
});
server.listen({ port: 8443, host: 'localhost' }, () => {
console.log(server.address());
});
客戶端.js:
import { io } from 'socket.io-client';
import fs from 'fs';
const socket = io('https://server.aaa.com:8443', {
hostname: 'server.aaa.com',
transports: ['websocket'],
key: fs.readFileSync('../certs/client-key.pem'),
cert: fs.readFileSync('../certs/client-crt.pem'),
ca: [
fs.readFileSync('../certs/server-ca-crt.pem')
],
rejectUnauthorized: false,
reconnection: false
});
socket.on('connect', () => {
console.log(socket.id);
});
socket.on("error", (err) => {
console.log(err);
});
socket.on("connect_error", (err) => {
console.log(err);
});
沒有問題:
const fs = require("fs");
const https = require("https");
const message = { msg: "Hello!" };
const req = https.request(
{
host: "server.aaa.com",
port: 8443,
key: fs.readFileSync(`../certs/client-key.pem`),
cert: fs.readFileSync(`../certs/client-crt.pem`),
ca: [
fs.readFileSync(`../certs/server-ca-crt.pem`)
],
path: "/",
method: "GET",
},
function(response) {
let rawData = "";
response.on("data", function(data) {
rawData = data;
});
response.on("end", function() {
if (rawData.length > 0) {
console.log(`Received message: ${rawData}`);
}
console.log(`TLS Connection closed!`);
req.end();
return;
});
}
);
req.on("socket", function(socket) {
socket.on("secureConnect", function() {
if (socket.authorized === false) {
console.log(`SOCKET AUTH FAILED ${socket.authorizationError}`);
}
console.log("TLS Connection established successfully!");
});
socket.setTimeout(10000);
socket.on("timeout", function() {
console.log("TLS Socket Timeout!");
req.end();
return;
});
});
req.on("error", function(err) {
console.log(`TLS Socket ERROR (${err})`);
req.end();
return;
});
req.write(JSON.stringify(message));
輸出:
TLS Connection established successfully!
Received message: OK!
TLS Connection closed!
uj5u.com熱心網友回復:
我終于找到了解決問題的方法。
我需要為 socket.io 添加以下代碼以使用默認的 socket.io 路徑(/socket.io)。
io.listen(server);
服務器.js
import https from 'https';
import fs from 'fs';
import { Server } from 'socket.io';
const options = {
key: fs.readFileSync('../certs/server-key.pem'),
cert: fs.readFileSync('../certs/server-crt.pem'),
ca: [
fs.readFileSync('../certs/client-ca-crt.pem')
],
requestCert: true,
rejectUnauthorized: false
};
const server = https.createServer(options);
const io = new Server(server);
io.listen(server);
io.on('connection', function (socket) {
console.log(socket.id);
});
server.listen({ port: 9443, host: 'localhost' }, () => {
console.log(server.address());
});
uj5u.com熱心網友回復:
您的服務器正在偵聽本地主機,但客戶端正在嘗試連接到 server.aaa.com。所以你必須讓服務器監聽server.aaa.com或0.0.0.0。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/325592.html
