У меня есть сервер 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
Спасибо