Socket.io-клиент не подключается к серверу, если указан путь к серверу - PullRequest
0 голосов
/ 26 января 2020

У меня есть сервер express 4, который я пытаюсь интегрировать с Socket.IO.

Если я выполняю io.attach(serverInstance) на сервере и io.connect("http://localhost:3002") на реагирующем клиенте, используя socket.io-client соединение установлено, и сервер регистрирует что-то вроде socket connection active, id: 3IjhKYkpY19D6nWHAAAB, client ip: ::ffff:127.0.0.1.

Но когда я передаю {path: "/socket/socket.io"} как io.attach(serverInstance, {path: "/socket/socket.io"}) и io.connect("http://localhost:3002", {path: "/socket/socket.io"}) ничего не регистрируется, т.е. соединение не устанавливается. Я недавно начал изучать socket.io, поэтому я не знаю много.

Я хочу, чтобы входящее сокетное соединение запрашивалось на localhost:3002/socket, а не localhost:3002/.

на сервере. сторона:

class SocketInterface {
  constructor() {
    this.server = undefined; // will hold the server instance once defined.
    this.io = socket(); // referencing socket interface.

    this.getServerReference = this.getServerReference.bind(this);
    this.ioDotOn = this.ioDotOn.bind(this);
   }

  /**
   * this method defines the sever reference once the server starts.
   * @param {http.Server} server: reference to the http server.
   */
  getServerReference(server) {
    this.server = server;
    this.io.attach(server, {path: "/socket/socket.io"});
  }

  /**
   * this method executes io.on()
   */
  ioDotOn() {
    if (this.server) {
      this.io.on("connection", socket => {
        // when connection is established
        const ip =
          socket.handshake.headers["x-forwarded-for"] ||
          socket.conn.remoteAddress;

        console.log(
          `socket connection active, id: ${socket.id}, client ip: ${ip}`
        );

        // when connection breaks
        socket.on("disconnect", () => {
          console.log("user gone");
        });
      });
    } else throw new Error("Server is undefined");
  }
}

Мне нужен этот класс в server.js как

const socketInterface = require("./socket/socket-io");
let server = undefined;

// first connect to local db.
MongoInterface.mongoConnect(err => {
  if (err) {
    // if error, occurs terminate.
    console.log(err);
    process.exit(1);
  } else {
    // if connected to MongoDB, get a reference to the taskDbOps singleton object.
    console.log("Connected to MongoDB server");

    // start the server and store a reference to the server.
    server = app.listen(config.PORT, err => {
      if (err) console.log(err);
      else console.log("Application Server Running on Port: ", config.PORT);
    });

    // starting the socket interface.
    if (server) {
      socketInterface.getServerReference(server);
      socketInterface.ioDotOn(); // socket service.
    }
  }
});

реагирующий клиент Это фиктивный клиент с api.js для сокетного соединения вот так: api.js

import io from "socket.io-client";

function x() {
  const socketConn = io.connect("http://localhost:3002", {
    path: "/socket/socket.io"
  });
}
export { x };

это импортируется в app.js вот так:

import React from "react";
import { x } from "./api";
import logo from "./logo.svg";
import "./App.css";

function App() {

  x(); //connecting to socket

  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
      </header>
    </div>
  );
}

export default App;

Я использую socket.io 2.3

Спасибо

1 Ответ

0 голосов
/ 26 января 2020
const socketInterface = require("./socket/socket-io");

// first connect to local db.
MongoInterface.mongoConnect(err => {
  if (err) {
    // if error, occurs terminate.
    console.log(err);
    process.exit(1);
  } else {
    // if connected to MongoDB, get a reference to the taskDbOps singleton object.
    console.log("Connected to MongoDB server");

    // start the server and store a reference to the server.
    // binding the server variable here resolves the problem
    let server = app.listen(config.PORT, err => {
      if (err) console.log(err);
      else console.log("Application Server Running on Port: ", config.PORT);
    });

    // starting the socket interface.
    if (server) {
      socketInterface.getServerReference(server);
      socketInterface.ioDotOn(); // socket service.
    }
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...