无法从服务器到客户端以及从客户端到服务器发出[Socket.io]

时间:2020-10-06 09:12:01

标签: socket.io

我正在创建我的产品,并遇到了这个问题。有一天,我安装了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 = 123some-event-2 happened!。但是相反,我的客户端控制台非常清晰Client side console log

并且服务器端控制台只有几个日志,但是不包含发射日志 Server side console log

我该怎么办?也许我在https上错误地使用了socket.io?

1 个答案:

答案 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);