最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - socket.io client not able to receive events stop working after some time. But when client emit it works i recive da

programmeradmin1浏览0评论

I am working on chat app. where I use different socket events to send message from client to server through sockets. Here is how it works client send request with jwt on socket I check it is connected before or not if it is just delete that session and create new session and save it's information in redies. Here is my server file code like this

require("dotenv").config();
const port = 8181;
const cluster = require("cluster");

const io_redis = require("socket.io-redis");
const num_processes = require("os").cpus().length;
import * as net from "net";
import cors from "cors";
import * as http from "http";
import router from "./routes";
import { PeerServer } from "peer";
import express from "express";
import * as socket from "socket.io";
import * as farmhash from "farmhash";
import cookieParser from "cookie-parser";
import { socketMain } from "./socket.io/socketMain";
import { inititalizeMongoDb } from "./database/mongoInstance";
import { isAuthSocket } from "./middlewares/isAuthSocket.middleware";
import { deleteOldMessageCron } from './services/deletemessagecron';
import { createClient, RedisClientType } from "redis";

// Create the Redis client using a URL
const redisClient: RedisClientType = createClient({ url: '' });
redisClient.connect();
(async () => {
  if (cluster.isMaster) {
    const workers: any = [];

    const spawn = (i: number) => {
      workers[i] = cluster.fork();
      workers[i].on("exit", () => {
        console.log("respawning worker", i);
        spawn(i);
      });
    };

    for (var i = 0; i < num_processes; i++) {
      spawn(i);
    }

    const worker_index = (ip: string, len: number) => {
      return farmhash.fingerprint32(ip) % len;
    };

    const server: net.Server = net.createServer(
      { pauseOnConnect: true },
      (connection: net.Socket) => {
        const worker =
          workers[worker_index(connection.remoteAddress, num_processes)];
        worker.send("sticky-session:connection", connection);
      }
    );

    server.listen(port);
    console.log(`Master listening on port ${port}`);
  } else {
    let app = express();
    app.use(express.json({ limit: '50mb' }));
    app.use(express.urlencoded({ limit: '50mb', extended: true }));

    app.use(cookieParser());
    app.use(
      cors({
        origin: [ "file://", "http://localhost", "http://localhost:3000"],
        credentials: true,
      })
    );

    app.use("/", router);

    const server: http.Server = app.listen(0, "localhost");
    console.log("Worker listening...");

    const io = new socket.Server(server, {
      cors: {
        origin: [ "file://", "http://localhost", "http://localhost:3000"],
        credentials: true,
      },
      pingTimeout: 120000,
      pingInterval: 25000,
    });

    io.adapter(io_redis({
      url: process.env.REDIS_URL,
      retryStrategy: (times: any) => {
        const delay = Math.min(times * 50, 2000);
        return delay;
      }
    }));

    await inititalizeMongoDb();
    deleteOldMessageCron();
    io.use(isAuthSocket);

    io.on("error", (err: any) => {
      console.log("Socket.io Error:", err);
    });
    io.on("connection", (socket: socket.Socket) => {
      console.log("connected to socket server", socket.id);
      socketMain(io, socket, redisClient);
      console.log(`connected to worker: ${cluster.worker.id}`);
    });

    process.on("message", (message, connection) => {
      if (message !== "sticky-session:connection") {
        return;
      }
      server.emit("connection", connection);
      //@ts-ignore
      connection.resume();
    });
  }
})();

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论