Socket.io 提供相同的 ip 地址,无论连接发生在何处(使用 repl.it 托管)

Socket.io gives same ip address no matter where the connection is happening from (hosting with repl.it)

这是一个更大的项目,但我设法将它压缩成一个小程序。

我正在尝试从 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>

我不确定为什么会这样,也找不到任何解决方案,当我 运行 在本地使用它时,它似乎工作正常。我能做些什么来修复它?

172.18.0.1 是 repl.it 的 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
    })