Witamy w 2019 roku, kiedy maszynopis powoli przejmuje świat. Inne odpowiedzi są nadal całkowicie aktualne. Chciałem jednak tylko pokazać, jak można to ustawić w środowisku pisania.
Na wypadek, gdybyś jeszcze tego nie zrobił. Najpierw należy zainstalować pewne współzależności
(czyli z linii poleceń: npm install <dependency-goes-here> --save-dev
)
"devDependencies": {
...
"@types/express": "^4.17.2",
...
"@types/socket.io": "^2.1.4",
"@types/socket.io-client": "^1.4.32",
...
"ts-node": "^8.4.1",
"typescript": "^3.6.4"
}
Zdefiniowałem import za pomocą importu ES6 (który powinieneś najpierw włączyć w swoim tsconfig.json
pliku).
import * as SocketIO from "socket.io";
import * as http from "http";
import * as https from "https";
import * as express from "express";
Ponieważ używam maszynopisu, mam teraz pełne pisanie na wszystkim, co robię z tymi obiektami.
Więc oczywiście najpierw potrzebujesz serwera http:
const handler = express();
const httpServer = (useHttps) ?
https.createServer(serverOptions, handler) :
http.createServer(handler);
Chyba już to wszystko zrobiłeś. I pewnie już dodałeś do niego gniazdo io:
const io = SocketIO(httpServer);
httpServer.listen(port, () => console.log("listening") );
io.on('connection', (socket) => onSocketIoConnection(socket));
Następnie, w celu obsługi nowych połączeń typu socket-io, możesz umieścić SocketIO.Socket
typ w jego parametrze.
function onSocketIoConnection(socket: SocketIO.Socket) {
socket.on('message', (msg) => onMessage(...));
socket.once('disconnect', (reason) => onDisconnect(...));
}
I wreszcie, ponieważ mamy teraz pełne wpisywanie, możemy łatwo pobrać ip z naszego gniazda, bez zgadywania:
const ip = socket.conn.remoteAddress;
console.log(`client ip: ${ip}`);