nodejs搭建websocket服务端无法连接也无法进行收发?

新手上路,请多包涵
/**
 * webSocket 服务端
 */
import express from "express";
import { createServer } from "node:http";
import { Server } from "node:http";

const app = express();
const server = createServer(app);
const io = new Server(server);


/**
 * socket 客户端
 */
const TcpHOST = "127.0.0.1";
const TcpPORT = 3001;
import net from "net";
const TcpClient = net.createConnection(TcpPORT, TcpHOST);

// websocket 链接事件
io.on("connection", (socket) => {
  console.log("收到消息");
  socket.on("message", (msg) => {
    // 转发socket消息
    TcpClient.write(msg)
  });
  socket.on("disconnec",()=>{
    console.log("断开连接")
  })
});
// 监听 8800 端口
server.listen(8800, () => {
  console.log("服务端开始运行");
});

萌新,之前没写过服务端,需要做一个websocket和socket互相转换的服务。这段是使用socket.io作为websocket的服务端,nodejs的net模块进行socket客户端转发,socket应该没啥问题,websocket服务端不知道为什么一直连接不上。
尝试使用apifox的websocket连接或者再写一个socket.io的websocket客户端连接都不行。
还有就是请教下,socket.io官网文档里的websocket服务端初始化,有只用socket,使用http,使用https,使用express等等,这些初始化方法有什么不同吗?

阅读 4.5k
avatarAI BotBETA

回答

你的问题主要涉及两个方面:WebSocket 服务端无法连接以及 socket.io 初始化方法的差异。

1. WebSocket 服务端无法连接

你的代码中存在几个问题,导致 WebSocket 服务端无法正确连接:

  1. 错误导入 Server:
    你尝试从 "node:http" 导入 Server,但 Server 并不是 node:http 模块的一部分。对于 socket.io,你应该使用 socket.io 提供的 Server。确保你已经正确安装了 socket.io,然后应该这样导入:

    import { Server as IOServer } from "socket.io";
  2. 错误的事件名称:
    你的代码中使用了 socket.on("disconnec", ...),但正确的事件名称应该是 disconnect
  3. 客户端连接问题:
    确保你的客户端代码(无论是使用 socket.io 客户端还是其他 WebSocket 客户端)正确指向了 ws://127.0.0.1:8800,并且使用的是正确的协议(WebSocket 或 Socket.IO)。如果你使用的是 Socket.IO 客户端,确保它也包含了 Socket.IO 的库。

修改后的代码如下:

/**
 * webSocket 服务端
 */
import express from "express";
import { createServer } from "http";
import { Server as IOServer } from "socket.io";

const app = express();
const server = createServer(app);
const io = new IOServer(server);

// websocket 链接事件
io.on("connection", (socket) => {
  console.log("收到连接");
  socket.on("message", (msg) => {
    // 转发socket消息
    TcpClient.write(msg);
  });
  socket.on("disconnect", () => {
    console.log("断开连接");
  });
});

// 监听 8800 端口
server.listen(8800, () => {
  console.log("服务端开始运行");
});

2. socket.io 初始化方法的差异

  • 只用 socket.io:
    这是最基础的用法,只涉及 WebSocket 的通信,不绑定到任何 HTTP 服务器。
  • 使用 HTTP:
    这是最常见的用法,将 socket.io 服务器绑定到一个 HTTP 服务器(如 http.createServer 创建的服务器)。这样可以同时处理 HTTP 和 WebSocket 请求。
  • 使用 HTTPS:
    与 HTTP 类似,但使用 HTTPS 服务器。这通常用于需要加密通信的场景。
  • 使用 Express:
    Express 是一个流行的 Node.js Web 应用框架。通过将 socket.io 服务器绑定到 Express 应用创建的 HTTP 服务器,你可以同时享受 Express 提供的路由、中间件等功能和 socket.io 提供的实时通信功能。

每种方法都有其适用的场景,选择哪种方法取决于你的具体需求。对于大多数 Web 应用来说,使用 Express 和 socket.io 结合的方式是非常常见和推荐的。

1 个回答

import { Server } from "node:http";

这个server不应该是socket.io Server吗

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏