我正在创建我的产品,并遇到了这个问题。有一天,我安装了socket.io,一切正常。第二天,我将服务器和客户端从http迁移到https。迁移后,客户端和服务器端仍保持连接,但是我无法从客户端发送到服务器以及从服务器发送到客户端。
我在./security/cert.key
和./security/cert.pem
中有我的ssl证书,它们正在正确加载。我的服务器在https://localhost:5000
import fs from "fs";
import https from "https";
import socketio from "socket.io";
import express from "express";
// HTTPS optiosn
const httpsOptions = {
key: fs.readFileSync("./security/cert.key"),
cert: fs.readFileSync("./security/cert.pem"),
};
// Setup express and https server
const app = express();
const server = https.createServer(httpsOptions, app);
// Setup socket io
const io = socketio.listen(server, {
origins: "https://localhost:3000",
transports: ["websocket"],
});
server.listen(5000, () => {
console.log(`server listening on https://localhost:5000`);
});
io.listen(server);
io.on("connection", (socket) => {
console.log("new socket connected!");
console.log(`data = ${socket.handshake.query.data}`);
socket.emit("some-event");
socket.on("some-event-2", () => console.log("some-event-2 happened!"));
});
我的示例react组件。我的React应用正在https://localhost:3000
上运行。 HTTPS已连接并且运行良好。
import React from "react";
import io from "socket.io-client";
const Sandbox: React.FC = () => {
const query = {
"data": 123,
};
const socket = io.connect("https://localhost:5000", {
secure: true,
query,
transports: ["websocket"],
});
socket.on("connect", () => console.log("connect!"));
socket.on("some-event", () => console.log("some event happened"));
socket.emit("some-event-2");
return <React.Fragment />;
};
export default Sandbox;
现在是问题所在。在控制台的客户端,我应该看到connect!
和some event happened
在服务器端,我应该看到消息new socket connected!
和data = 123
,some-event-2 happened!
。但是相反,我的客户端控制台非常清晰
我该怎么办?也许我在https
上错误地使用了socket.io?
答案 0 :(得分:0)
我纠正了我的错误。
问题是我首先创建了https服务器,然后仅在其上调用.listen()
。 listen()
-不是空的,它返回另一个服务器obj。您需要在.listen()
内部传递io.listen()
函数的结果
// Don't do that❌
var server = https.createServer(options, app);
server.listen(5000);
io.listen(server);
// Do that✅
var server = https.createServer(options, app).listen(5000);
io.listen(server);