Cum se creează un socket Java care este doar localhost? (Programare, Java, Rețea, Prize)

Matt Ronge a intrebat.

Am un server Java care deschide un socket folosind ServerSocket (folosind Thrift cu el). Acest server are un client pe mașina locală în Obj-c care comunică cu serverul Java. Totul se întâmplă pe localhost. În acest moment, serverul Java este vizibil și în rețea, aș dori ca serverul Java să fie accesibil doar pe localhost. În caz contrar, este o potențială vulnerabilitate de securitate și îi sperie pe utilizatori atunci când firewall-ul lor îi avertizează.

Am încercat să creez socket-ul serverului folosind un InetSocketAddress(‘localhost’, 9090), dar acest lucru nu pare să aibă niciun efect. Cum pot să limitez acest lucru la localhost?

Comentarii

  • Dacă serverul este accesibil doar pe localhost, cum îl vor accesa clienții? Nu înțeleg configurația. –  > Por Kaleb Brasee.
  • Verificați această altă întrebare și răspunsurile date: Cum se determină dacă o conexiune de intrare provine de pe mașina locală –  > Por Abel Morelos.
  • @Kaleb – citează întrebarea: „Acest server are un client pe mașina locală … Totul se întâmplă pe localhost”. –  > Por Stephen C.
4 răspunsuri
Matías

Preluat de la o altă întrebare:

new ServerSocket(9090, 0, InetAddress.getByName(null));

InetAddress.getByName(null) indică adresa loopback (127.0.0.0.1)

Și aici este Javadoc-ul în care se spune că

Comentarii

  • Încercat pe android, getByName(null) nu funcționează (nu se poate conecta la socket-ul deschis în acest mod, indiferent de ce). getByname(„127.0.0.0.1”) funcționează, funcționează instantaneu și este IMHO mai ușor de citit și mai „portabil” –  > Por Gena Batsyan.
  • Tocmai am găsit asta. Interesant. Și acum există și metoda InetAddress.getLoopbackAddress() –  > Por JayC667.
  • Am încercat InetAddress.getLocalHost(), dar nu a funcționat; nu a fost acceptată nicio conexiune. Totuși, .getByname(„127.0.0.0.1”) a funcționat. Ciudat. –  > Por Per Lindberg.
Fabian Lange

Permiteți-mi să intervin cu o soluție alternativă care acceptă doar pe dispozitivul loopback. Toate celelalte soluții „localhost” vor face ca Java să aleagă o interfață.

new ServerSocket(9090, 0, InetAddress.getLoopbackAddress());

Această soluție este disponibilă încă din Java 7 și nici măcar nu aruncă UnknownHostException

Geoff Reedy

Încercați

new ServerSocket(9090, 0, InetAddress.getByName("localhost"))

Ultimul parametru al constructorului specifică adresa la care se va lega socket-ul de ascultare.

Comentarii

  • +1 – dar țineți cont de faptul că unele mașini nu înțeleg „localhost”. Așa că utilizarea adresei IP 127.0.0.0.1 este probabil mai robustă. –  > Por Stephen C.
  • Chiar așa funcționează acel constructor? Am postat această sugestie, dar după ce am recitit descrierea, m-am gândit că se pare că acel constructor alege doar o singură conexiune de rețea pentru a accepta conexiuni, în loc de toate (dacă sistemul are mai multe dispozitive de rețea). –  > Por Kaleb Brasee.
  • @Stephen care ar putea cauza probleme în viitor cu o gazdă care este în principal IPv6 sau chiar numai IPv6. –  > Por Geoff Reedy.
  • @shinkou Cu siguranță ar trebui să să fie, deși au existat distribuții ale unor sisteme de operare importante în care nu a fost așa. Mai degrabă aș da downvoting acelor distribuții decât acestui răspuns. –  > Por user207421.
  • De ce nu folosiți InetAddress.getLocalHost()? docs.oracle.com/javase/1.4.2/docs/api/java/java/net/… –  > Por 1800 INFORMAȚII.
user207421
new ServerSocket(9090, 0, InetAddress.getByName(null));