Saya mencoba mengembangkan sistem di mana ada beberapa node yang dijalankan pada sistem yang berbeda atau pada port yang berbeda pada sistem yang sama.
Sekarang semua node membuat Socket dengan IP target sebagai IP dari node khusus yang dikenal sebagai node bootstrap. Node kemudian membuat sendiri ServerSocket
dan mulai mendengarkan koneksi.
Node bootstrap memelihara daftar Node dan mengembalikannya saat ditanya.
Sekarang yang saya butuhkan adalah simpul harus mendaftarkan IP-nya ke simpul bootstrap. Saya mencoba menggunakan cli.getInetAddress()
setelah klien terhubung ke ServerSocket
simpul bootstrap tapi itu tidak berhasil.
- Saya perlu klien untuk mendaftarkan IP PPP-nya jika tersedia;
- Kalau tidak, IP LAN jika tersedia;
- Kalau tidak, ia harus mendaftar 127.0.0.1 dengan asumsi komputer yang sama.
Menggunakan kode:
System.out.println(Inet4Address.getLocalHost().getHostAddress());
atau
System.out.println(InetAddress.getLocalHost().getHostAddress());
Alamat IP Koneksi PPP saya adalah: 117.204.44.192 tetapi yang di atas mengembalikan saya 192.168.1.2
EDIT
Saya menggunakan kode berikut:
Enumeration e = NetworkInterface.getNetworkInterfaces();
while(e.hasMoreElements())
{
NetworkInterface n = (NetworkInterface) e.nextElement();
Enumeration ee = n.getInetAddresses();
while (ee.hasMoreElements())
{
InetAddress i = (InetAddress) ee.nextElement();
System.out.println(i.getHostAddress());
}
}
Saya bisa mendapatkan semua alamat IP yang terkait dengan semua NetworkInterface
, tetapi bagaimana cara membedakannya? Ini adalah output yang saya dapatkan:
127.0.0.1
192.168.1.2
192.168.56.1
117.204.44.19
Jawaban:
Cara ini bekerja dengan baik ketika ada beberapa antarmuka jaringan. Itu selalu mengembalikan IP keluar yang disukai. Tujuan
8.8.8.8
tidak perlu bisa dijangkau.Connect
pada soket UDP memiliki efek sebagai berikut: ia menetapkan tujuan untuk Kirim / Terima, membuang semua paket dari alamat lain, dan - yang kami gunakan - mentransfer soket ke keadaan "terhubung", mengatur bidang yang sesuai. Ini termasuk memeriksa keberadaan rute ke tujuan sesuai dengan tabel routing sistem dan mengatur titik akhir lokal yang sesuai. Bagian terakhir tampaknya tidak terdokumentasi secara resmi tetapi sepertinya sifat integral dari Berkeley sockets API (efek samping dari keadaan "terhubung" UDP) yang bekerja dengan andal di Windows dan Linux di seluruh versi dan distribusi.Jadi, metode ini akan memberikan alamat lokal yang akan digunakan untuk terhubung ke host jarak jauh yang ditentukan. Tidak ada koneksi nyata yang dibuat, maka ip jarak jauh yang ditentukan dapat dijangkau.
Edit:
Seperti yang dikatakan @macomgil , untuk MacOS Anda dapat melakukan ini:
sumber
Ini bisa agak rumit dalam kasus yang paling umum.
Di muka itu,
InetAddress.getLocalHost()
harus memberi Anda alamat IP dari host ini. Masalahnya adalah bahwa sebuah host dapat memiliki banyak antarmuka jaringan, dan sebuah antarmuka dapat terikat ke lebih dari satu alamat IP. Dan yang paling penting, tidak semua alamat IP dapat dijangkau di luar mesin Anda atau LAN Anda. Misalnya, mereka bisa berupa alamat IP untuk perangkat jaringan virtual, alamat IP jaringan pribadi, dan sebagainya.Artinya, alamat IP yang dikembalikan oleh
InetAddress.getLocalHost()
mungkin bukan yang tepat untuk digunakan.Bagaimana Anda bisa mengatasi ini?
NetworkInterface.getNetworkInterfaces()
untuk mendapatkan semua antarmuka jaringan yang diketahui pada host, dan kemudian beralih ke alamat masing-masing NI.InetAddress.getByName()
untuk mencari alamat IP primer. (Tapi bagaimana Anda mendapatkannya, dan bagaimana Anda berurusan dengan load balancer berbasis DNS?)Singkatnya,
InetAddress.getLocalHost()
biasanya akan berfungsi, tetapi Anda mungkin perlu memberikan metode alternatif untuk kasus-kasus di mana kode Anda dijalankan di lingkungan dengan jaringan "rumit".Faktanya, API InetAddress menyediakan metode untuk pengujian loopback, tautan lokal, situs lokal, multicast, dan alamat broadcast. Anda dapat menggunakan ini untuk memilah mana dari alamat IP yang Anda dapatkan yang paling tepat.
sumber
use getLocalHost().getHostAddress()
menerbitkan sesuatu, Anda mungkin melihat0.0.0.0
ketika melihat dari komputer lain di jaringan. Ini dijelaskan di sini. Inilah yang terjadi pada saya ketika saya menggunakan Gazebo di dua komputerPosting di sini menguji kode solusi ambiguitas IP dari https://issues.apache.org/jira/browse/JCS-40 (InetAddress.getLocalHost () ambigu pada sistem Linux):
sumber
Anda dapat menggunakan kelas InetAddress java untuk tujuan ini.
Output untuk sistem saya =
IP of my system is := 10.100.98.228
getHostAddress () kembali
ATAU Anda juga bisa melakukannya
Output =
IP of my system is := RanRag-PC/10.100.98.228
sumber
Ketika Anda mencari alamat "lokal" Anda, Anda harus mencatat bahwa setiap mesin tidak hanya memiliki satu antarmuka jaringan, dan setiap antarmuka dapat memiliki alamat lokal sendiri. Yang berarti mesin Anda selalu memiliki beberapa alamat "lokal".
Alamat "lokal" yang berbeda akan dipilih secara otomatis untuk digunakan ketika Anda menghubungkan ke titik akhir yang berbeda. Misalnya, ketika Anda terhubung
google.com
, Anda menggunakan alamat lokal "luar"; tetapi ketika Anda terhubung ke Andalocalhost
, alamat lokal Anda selalulocalhost
sendiri, karena localhost hanyalah sebuah loopback.Di bawah ini ditunjukkan cara mengetahui alamat lokal Anda saat Anda berkomunikasi dengan
google.com
:sumber
Contoh dalam scala (berguna untuk file sbt):
sumber
EDIT 1: Kode yang diperbarui, sejak tautan sebelumnya, tidak ada lagi
VERSI SEBENARNYA: Ini berhenti bekerja
Semoga cuplikan ini dapat membantu Anda mencapai ini:
sumber
whatismyip.com
yang turun selama beberapa waktu, aplikasi Anda juga akan turun :(. Atau itu akan mengembalikan data sampah dan menyebabkan perilaku yang tidak terduga. Juga, ini mengembalikan pencabut nyawa kebanyakan alamat IP dapat dideteksi olehwhatismyip.com
, tidak harus alamat IP dari mesin yang Anda gunakanpertama-tama impor kelas
di kelas
sumber
Anda bisa menggunakan
java.net.InetAddress
API. Coba ini :sumber
sumber
Ini adalah contoh kerja dari jawaban DITERIMA di atas! Kelas NetIdentity ini akan menyimpan ip host internal, serta loopback lokal. Jika Anda menggunakan server berbasis DNS, seperti yang disebutkan di atas, Anda mungkin perlu menambahkan beberapa pemeriksaan lagi, atau mungkin pergi ke Rute File Konfigurasi.
Ketika saya menjalankan kode ini saya benar-benar mendapatkan hasil cetak seperti ini:
Untuk penggunaan saya, saya sedang menyiapkan Server Upnp, itu membantu untuk memahami 'pola' yang saya cari. Beberapa objek yang dikembalikan adalah Adaptor Ethernet, Adaptor Jaringan, Adaptor Jaringan Virtual, Driver, dan Adaptor Klien VPN. Tidak semuanya memiliki Alamat. Jadi, Anda ingin melewatkan objek antarmuka yang tidak.
Anda juga dapat menambahkan ini ke loop untuk saat ini
NetworkInterface i
Dan Anda akan melihat informasi dalam output Anda seperti ini:
sumber
Gunakan InetAddress.getLocalHost () untuk mendapatkan alamat lokal
sumber
sumber
Pendekatan yang agak sederhana yang tampaknya berhasil ...
sumber
Ini mendapatkan alamat IP jaringan Anda jika mesin Anda adalah bagian dari jaringan
sumber
Biasanya ketika saya mencoba mencari Alamat IP publik saya seperti cmyip.com atau www.iplocation.net , saya menggunakan cara ini:
sumber
Karena sistem saya (seperti banyak sistem lainnya) memiliki berbagai antarmuka jaringan.
InetAddress.getLocalHost()
atauInet4Address.getLocalHost()
hanya mengembalikan yang tidak saya inginkan. Karena itu saya harus menggunakan pendekatan naif ini.Hanya hati-hati bahwa dalam pendekatan ini saya sudah tahu bahwa alamat IP yang saya inginkan adalah di
192.168.2
subnet.sumber
sumber