Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [Socket] Prendere l'ip del client!

    Salve,

    stavo sfogliando un pò le API di java, nello specifico la documentazione relativa al pacchetto java.net, ma non ho trovato un metodo che mi restituisca l'ip del client che si connette al server nel quale voglio implementare una funzione per prendere il suo ip!

    Ci sono metodi come getLocalAddress e getInetAddress, ma restituiscono l'indirizzo del pc sul quale è in esecuzione il server!

    Spero qualcuno abbia ottimi suggerimenti! Grazie..

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Socket] Prendere l'ip del client!

    Originariamente inviato da VincenzoTheBest
    non ho trovato un metodo che mi restituisca l'ip del client che si connette al server nel quale voglio implementare una funzione per prendere il suo ip!
    Nel server la accept() fornisce un Socket. Se su quest'ultimo invochi getInetAddress()/getPort() hai l'indirizzo/porta del client.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ok...ma se applico il metodo nel programma client, quindi lato client, mi restituisce l'ip con la porta del server! Devo utilizzare metodi supplementari per ottenere l'ip del client?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da VincenzoTheBest
    Ok...ma se applico il metodo nel programma client, quindi lato client, mi restituisce l'ip con la porta del server! Devo utilizzare metodi supplementari per ottenere l'ip del client?
    E allora getLocalAddress()/getLocalPort().
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Ok..i tuoi consigli sono sempre preziosi! Però proviamo a ragionare un pò: poichè nel programma client utilizzo un oggetto Socket di questo genere -> new Socket(serverIP, portServer)
    nel momento in cui vado ad applicare il metodo getLocalAddress sull'oggetto Socket, mi restituisce l'ip del server?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da VincenzoTheBest
    Ok..i tuoi consigli sono sempre preziosi! Però proviamo a ragionare un pò: poichè nel programma client utilizzo un oggetto Socket di questo genere -> new Socket(serverIP, portServer)
    nel momento in cui vado ad applicare il metodo getLocalAddress sull'oggetto Socket, mi restituisce l'ip del server?
    No!
    Allora .. forse non hai capito: quando un socket è connesso ha 2 punti di aggancio: sul client e sul server, ognuno è identificato da indirizzo/porta.
    Quindi c'è un indirizzo locale e porta locale e c'è un indirizzo remoto e porta remota.

    Esempio:

    Il server crea un ServerSocket sulla porta 2000 (e immagina che l'indirizzo locale del server sia 192.168.0.4).

    Il client 192.168.0.20 crea un Socket verso 192.168.0.4 porta 2000.

    Il Socket del client avrà:
    local address = 192.168.0.20
    local port = generalmente scelto dal sistema es. 4567 (se non specificato nella costruzione del Socket!)
    remote address = 192.168.0.4
    remote port = 2000

    Il Socket fornito dalla accept() sul server avrà:
    local address = 192.168.0.4
    local port = 2000
    remote address = 192.168.0.20
    remote port = 4567

    Più chiaro ora?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Perfetto! Sei stato chiaro!

    Quindi teoricamente:

    lato client (per mostrare al client il suo ip) conviene applicare i metodi:

    socket.getLocalAddress(), socket.getLocalPort();

    mentre

    lato server (per prendere l'ip del client che si connette) conviene applicare il metodo:
    ServerSocket.accept().getRemoteSocketAddress();

    che dunque restituisce ip remoto e porta remota del client!

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da VincenzoTheBest
    lato client (per mostrare al client il suo ip) conviene applicare i metodi:

    socket.getLocalAddress(), socket.getLocalPort();


    Originariamente inviato da VincenzoTheBest
    lato server (per prendere l'ip del client che si connette) conviene applicare il metodo:
    ServerSocket.accept().getRemoteSocketAddress();

    che dunque restituisce ip remoto e porta remota del client!
    L'ho detto prima: getInetAddress()/getPort().

    getLocalSocketAddres()/getRemoteSocketAddress() sono stati aggiunti in Java 1.4 e ritornano un tipo SocketAddress (classe astratta) la cui unica sottoclasse concreta è InetSocketAddress che effettivamente rappresenta e contiene un indirizzo+porta.

    Non complicarti la vita:

    getLocalAddress()/getLocalPort() per la parte locale.

    getInetAddress()/getPort() per la parte remota
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Certo ma facendo
    ServerSocket.accept().getRemoteSocketAddress().toS tring();
    ottengo le stesse informazioni applicando
    ServerSocket.accept().getInetAddress().toString()+ ": "+ServerSocket.accept().getPort();

    Apparentemente sembra che non ci sia alcuna differenza tra le due applicazioni!

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da VincenzoTheBest
    Certo ma facendo
    ServerSocket.accept().getRemoteSocketAddress().toS tring();
    ottengo le stesse informazioni applicando
    ServerSocket.accept().getInetAddress().toString()+ ": "+ServerSocket.accept().getPort();

    Apparentemente sembra che non ci sia alcuna differenza tra le due applicazioni!
    Il toString() di SocketAddress formatta in un modo suo predefinito ... se ti basta quello, ok perfetto.

    Ripeto che i 4 metodi citati sono quelli standard. Da Java 1.4 sono stati aggiunti gli altri due che forniscono un SocketAddress (InetSocketAddress) che rappresenta l'insieme di indirizzo+porta.

    Quindi usa quello che preferisci!! Non c'è alcuna differenza concettuale .. vengono semplicemente offerti due modi per ottenere indirizzo/porta.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.