这是一个更大的项目,但我设法把它压缩成一个小程序。
我试图从websocket连接中获取客户端的ip地址。我发现我可以使用socket.handshake.address,但是当我在repl.it上运行它时,它总是说ip地址是172.18.0.1,在我连接的地方不会更疯狂。
Index.js
const express = require('express');
const http = require('http').createServer();
const app = require('express')();
const server = require('http').createServer(app);
const io = require('socket.io')(server);
io.on('connection', () => { /* … */ });
server.listen(3000);
app.get('/', (request, response) => {
response.sendFile('/home/runner/basicSocketio/index.html');
});
io.on('connection', (socket) => {
io.emit("message", "hello client")
socket.on('message', (message) => {
console.log(socket.handshake.address)//always prints ::ffff:172.18.0.1
})
})index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-9">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src = "https://cdn.socket.io/socket.io-3.0.0.js"></script>
</head>
<body>
test
</body>
</html>
<script>
const socket = io();
socket.emit('message', "hi server");
socket.on('message', text => {
console.log("recieved: " + text);
});
</script>我不知道为什么会发生这种情况,也找不到任何解决办法,当我在本地运行这个项目时,它似乎运行得很好。我能做些什么来解决这个问题?
发布于 2022-01-18 03:52:30
172.18.0.1是应答的。它是HTML的内部地址,因为它们为您提供index.html,您在那里调用const socket = io()。
要查看客户端的真实ip,请使用socket.handshake.headers['x-forwarded-for']表达式,如下所示:
io.on('connection', (socket) => {
io.emit('message', 'hello client')
socket.on('message', (text) => {
console.log(text)
// console.log(socket.handshake.address) // Server serving index.html file IP address
})
console.log('a client connected')
console.log('client IP addr: ' + socket.handshake.headers['x-forwarded-for']) // (REAL) client IP
})
https://stackoverflow.com/questions/70749536
复制相似问题