Saat menggunakan socket.IO di server Node.js, apakah ada cara mudah untuk mendapatkan alamat IP dari koneksi yang masuk? Saya tahu Anda bisa mendapatkannya dari koneksi HTTP standar, tetapi socket.io adalah sedikit binatang yang berbeda.
node.js
ip-address
socket.io
Toji
sumber
sumber
console.dir(socket)
mungkin itu yang Anda maksudJawaban:
Oke, mulai 0.7.7 ini tersedia, tetapi tidak dengan cara yang dijelaskan lubar. Saya akhirnya perlu mem-parsing melalui beberapa log komit di git hub untuk mencari tahu ini, tetapi kode berikut ini benar-benar bekerja untuk saya sekarang:
sumber
1.3.7
, ini kembali::ffff:127.0.0.1
socket.request.connection.remoteAddress
untuk versi 1.xuntuk 1.0.4:
sumber
socket.request.connection.remoteAddress
dansocket.request.connection.remotePort
bekerja untuk saya. Namun, saya tidak melihat salah satu dari properti ini terdaftar ketika saya mencoba:console.log(util.inspect(socket.request.connection, {showHidden: true, colors: true}));
Mengapa tidak?1.3.7
, ini kembali::ffff:127.0.0.1
Jika Anda menggunakan server lain sebagai proxy terbalik, semua bidang yang disebutkan akan berisi localhost. Solusi termudah adalah menambahkan header untuk ip / port di server proxy.
Contoh untuk nginx: tambahkan ini setelah Anda
proxy_pass
:Ini akan membuat header tersedia di server node socket.io:
Perhatikan bahwa tajuk dikonversi secara internal ke huruf kecil.
Jika Anda menghubungkan server simpul langsung ke klien,
bekerja dengan socket.io versi 1.4.6 untuk saya.
sumber
Untuk penggunaan versi socket.io terbaru
Sebagai contoh:
berhati-hatilah bahwa kode di bawah ini mengembalikan IP Server, bukan IP Klien
sumber
Menggunakan
1.0.6
versi terbaru dariSocket.IO
dan memiliki aplikasi saya digunakanHeroku
, saya mendapatkan klienIP
danport
menggunakanheaders
kesocket handshake
:sumber
Sejak socket.io 1.1.0, saya menggunakan:
Sunting : Perhatikan bahwa ini bukan bagian dari API resmi, dan karena itu tidak dijamin untuk bekerja di rilis socket.io mendatang.
Lihat juga tautan yang relevan ini: masalah engine.io
sumber
Versi 0.7.7 dari Socket.IO sekarang mengklaim untuk mengembalikan alamat IP klien. Saya sudah sukses dengan:
sumber
Ini sepertinya berhasil:
sumber
127.0.0.1
untuk saya, bukan IP klien (node.js berjalan di server jauh).Saya telah menemukan bahwa dalam socket.handshake.headers ada sebuah diteruskan untuk alamat yang tidak muncul pada mesin lokal saya. Dan saya bisa mendapatkan alamat jarak jauh menggunakan:
Ini di sisi server dan bukan sisi klien.
sumber
::ffff:127.0.0.1
tetapi ini memberi saya IP yang sebenarnyaDari membaca kode sumber socket.io sepertinya metode "mendengarkan" mengambil argumen (server, opsi, fn) dan jika "server" adalah turunan dari server HTTP / S, ia hanya akan membungkusnya untuk Anda.
Jadi Anda mungkin bisa memberikannya server kosong yang mendengarkan acara 'koneksi' dan menangani soket RemoteAddress; Namun, hal-hal mungkin sangat sulit jika Anda harus mengaitkan alamat itu dengan objek socket.io Socket yang sebenarnya.
Mungkin lebih mudah untuk mengirimkan tambalan ke socket.io di mana objek Socket mereka sendiri diperpanjang dengan properti RemoteAddress yang ditugaskan pada waktu koneksi ...
sumber
Sangat mudah. Put pertama
Anda akan melihat semua bidang soket. kemudian gunakan CTRL + F dan cari alamat kata. Akhirnya, ketika Anda menemukan bidang remoteAddress menggunakan titik-titik untuk memfilter data. dalam kasus saya itu
sumber
Di socket.io 2.0 : Anda dapat menggunakan:
socket.conn.transport.socket._socket.remoteAddress
bekerja dengan
transports: ['websocket']
sumber
Ini berfungsi untuk versi 2.3.0 terbaru :
sumber
pada
socket.io
1.3.4 Anda memiliki kemungkinan berikut.socket.handshake.address
,socket.conn.remoteAddress
atausocket.request.client._peername.address
sumber
Dalam versi v2.3.0
ini bekerja untuk saya:
sumber
menggunakan
socket.request.connection.remoteAddress
sumber
1.3.7
, ini kembali::ffff:127.0.0.1
Versi terbaru berfungsi dengan:
sumber
1.3.7
, ini kembali::ffff:127.0.0.1
0.0.0.0
. Terkait: stackoverflow.com/a/37378670/5138796Selamat datang di 2019, di mana naskah perlahan mulai menguasai dunia. Jawaban lain masih sangat valid. Namun, saya hanya ingin menunjukkan kepada Anda bagaimana Anda dapat mengatur ini di lingkungan yang diketik.
Jika Anda belum. Pertama Anda harus menginstal beberapa dependensi (yaitu dari commandline:
npm install <dependency-goes-here> --save-dev
)Saya mendefinisikan impor menggunakan impor ES6 (yang harus Anda aktifkan dalam
tsconfig.json
file Anda terlebih dahulu.)Karena saya menggunakan naskah saya sudah mengetik penuh sekarang, pada semua yang saya lakukan dengan objek-objek ini.
Jadi, jelas, pertama Anda memerlukan server http:
Saya kira Anda sudah melakukan semua itu. Dan Anda mungkin sudah menambahkan socket io ke dalamnya:
Selanjutnya, untuk penanganan koneksi socket-io baru, Anda dapat meletakkan
SocketIO.Socket
tipe pada parameternya.Dan akhirnya, karena kita memiliki pengetikan penuh sekarang, kita dapat dengan mudah mengambil ip dari soket kita, tanpa menebak:
sumber
Dalam 1.3.5:
sumber
1.3.7
, ini mengembalikan url halaman, bukan ip