【问题标题】:Why the module C does not receive the socket io "hi" event?为什么模块 C 没有收到 socket io "hi" 事件?
【发布时间】:2022-01-03 10:39:04
【问题描述】:

如何为不同的套接字路径调用不同的模块? 这是服务器代码:

require('dotenv-flow').config();
const express = require('express');
const app = express();
const http =require('http');
const httpServer= http.createServer(app);
const io = require('socket.io')(httpServer);

let C=require('./C');
let c=new C(io.of("/c"));

class C {
    constructor(socket) {
        socket.on("connection",()=>{
            console.log("Connection to /c");
        });
        socket.on("hi", (peerName, calllBack) => {
            console.log("Received say hi from " + peerName + ".");
        });
    }
}
module.exports = C;

客户端代码:

import { useEffect} from "react";
import io from "socket.io-client";
export default function TestSocket() {
    useEffect(() => {
        let peerName;
        let signalServerURL=process.env.REACT_APP_SOCKET_URL + "c";
        let sUsrAg = navigator.userAgent;
        if (sUsrAg.indexOf("Edg") > -1) {
            peerName = "Edge";
        } else {
            if (sUsrAg.indexOf("Chrome") > -1) {
                peerName = "Chrome";
            } else {
                if (sUsrAg.indexOf("Firefox") > -1) {
                    peerName = "Firefox";
                } else {
                    if (sUsrAg.indexOf("Safari") > -1) {
                        peerName = "Safari";
                    }
                }
            }
        }
        let socket = io(signalServerURL, {
            transports: ["websocket"],
        });
        socket.emit("hi", peerName, (response) => {
            console.log(response);
        });
    },[]);
   return (
        <></>
    )    
}

模块C可以接收到“connection”事件,但是却不能接收到“hi”事件,为什么? 除此之外,我想使用不同的模块/类来处理不同的套接字路径。

例如

对于路径/b套接字访问,我想用模块B来处理。

对于路径/d socket访问,我想用模块D来处理。

我该如何实现它?

根据Philippe的回答,我修改了服务器代码如下:

require('dotenv-flow').config();
const express = require('express');
const app = express();
const http =require('http');
const httpServer= http.createServer(app);
const io = require('socket.io')(httpServer);

let C=require('./C');
let c=new C(io,"/c");

class C {
    constructor(io,path) {
         io.of(path).on("connection",socket=>{
           console.log("Connection to "+path);
           
           socket.on("hi", (peerName, calllBack) => {
            console.log("Received say hi from " + peerName + ".");
           });
         });
    }
}
module.exports = C;

有效!

【问题讨论】:

    标签: node.js reactjs express socket.io


    【解决方案1】:

    连接成功后,socket-io返回你需要使用的socket。您可以尝试以下方法:

    constructor(io) {
        io.on("connection", (socket) => {
            console.log("Connection to /c " + socket.id);
            socket.on("hi", (peerName, calllBack) => {
                console.log("Received say hi from " + peerName + ".");
            });
        });
    }
    

    【讨论】:

      猜你喜欢
      • 2020-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多