Socket.IO超时connect_error

Socket.IO Timeout connect_error

我正在尝试了解 socket.io,我按照许多教程进行操作,但无法正确连接。

服务器端:index.ts

import express from "express";
import { Server } from "socket.io";
import http from "http";
import cors from "cors";


//connections
const app = express();
const server = http.createServer(app);
const io = new Server(server);

app.use(cors);

app.listen(4000, () => console.log("Server is running on port 4000"));

io.on("connection", (socket) => {
    console.log("socket connected");
});

客户:index.js

const io = require("socket.io-client")
var socket = io.connect("http://localhost:4000");

socket.on("connect", () => {
  console.log(socket.id); //Doesn't enter here
});

socket.on("connect_error", (err) => {
  console.log(`connect_error due to ${err.message}`); //Outputs connect_error due to timeout
});

客户端不断打印

connect_error due to timeout

考虑到这是我第一次使用 socket.io。

谢谢。

您正在创建两个 http 服务器,将一个提供给 socket.io,但从未启动该服务器。因此,socket.io 永远不会工作,因为它附加到不是 运行.

的服务器实例

这些是相互矛盾的:

const server = http.createServer(app);

和:

app.listen(4000, () => console.log("Server is running on port 4000"));

因为每一个都会创建一个新的服务器。在 app.listen() 内部,它确实:

const server = http.createServer(app);
server.listen();
return server;

所以,删除这个:

const server = http.createServer(app);

并且,从这个改变:

app.listen(4000, () => console.log("Server is running on port 4000"));

对此:

const server = app.listen(4000, () => console.log("Server is running on port 4000"));

然后,将那个 server 变量用于 socket.io。


你也可以用另一种方式来做,你删除 app.listen() 并使用你已经创建的 server 然后只做 server.listen(...)。关键是您只需要创建一个服务器实例而不是两个,并将那个 运行 服务器实例实际提供给 socket.io 并表达。