English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Programmazione di rete è la scrittura di programmi che eseguono su più dispositivi (computer) connessi tra loro attraverso una rete.
Il pacchetto API J2SE del pacchetto java.net contiene classi e interfacce che forniscono dettagli di comunicazione a basso livello. Puoi utilizzare direttamente queste classi e interfacce per concentrarti sul risolvere i problemi, senza preoccuparti dei dettagli di comunicazione.
java.net fornisce supporto per due protocolli di rete comuni:
TCP:TCP (in inglese: Transmission Control Protocol, protocollo di controllo della trasmissione) è un protocollo di comunicazione a livello di trasmissione basato su byte, orientato a connessione e affidabile. Il livello TCP è situato sopra il livello IP e sotto il livello applicazione. TCP garantisce una comunicazione affidabile tra due applicazioni. Di solito viene utilizzato nei protocolli di internet, conosciuto come TCP / IP.
UDP:UDP (in inglese: User Datagram Protocol, protocollo di datagramma utente), situato nel livello di trasmissione del modello OSI. Un protocollo senza connessione. Fornisce i datagrammi di dati che devono essere inviati tra le applicazioni. Poiché UDP manca di affidabilità e appartiene a protocolli senza connessione, le applicazioni devono spesso tollerare alcune perdite, errori o pacchetti ripetuti.
Questo tutorial tratta principalmente due argomenti.
Programmazione Socket:È il concetto di rete più utilizzato, che è stato spiegato in modo molto dettagliato.
Gestione URL:Questa parte sarà trattata in un altro capitolo, clicca qui per una spiegazione più dettagliata su come Gestione URL nel linguaggio Java.
I socket utilizzano TCP per fornire un meccanismo di comunicazione tra due computer. Il programma client crea un socket e tenta di connettersi al socket del server.
Quando la connessione viene stabilita, il server crea un oggetto Socket. Ora il client e il server possono comunicare tramite scrittura e lettura dell'oggetto Socket.
La classe java.net.Socket rappresenta un socket e la classe java.net.ServerSocket fornisce un meccanismo per i programmi server per ascoltare i client e stabilire connessioni con loro.
Questi sono i passaggi che si verificano quando si stabilisce una connessione TCP tra due computer utilizzando socket:
Il server istanzia un oggetto ServerSocket per rappresentare la comunicazione attraverso il port sul server.
Il server chiama il metodo accept() della classe ServerSocket, che aspetta ininterrottamente fino a quando il client si connette al port specificato sul server.
Quando il server sta aspettando, un client istanzia un oggetto Socket, specificando il nome del server e il port per richiedere una connessione.
Il costruttore della classe Socket tenta di connettersi al server e al port specificati. Se la comunicazione viene stabilita, viene creato un oggetto Socket sul client che può comunicare con il server.
Sul lato server, il metodo accept() restituisce una nuova referenza di socket sul server, che è collegata al socket del client.
Dopo aver stabilito la connessione, utilizzare i flussi di I/O per comunicare. Ogni socket ha un flusso di output e un flusso di input, il flusso di output del client è collegato al flusso di input del server, e il flusso di input del client è collegato al flusso di output del server.
TCP è un protocollo di comunicazione bidirezionale, quindi i dati possono essere inviati attraverso due flussi di dati nello stesso tempo. Ecco una serie di metodi forniti dalla classe che forniscono una serie completa di strumenti utili per implementare socket.
L'applicazione server utilizza la classe java.net.ServerSocket per ottenere un port e ascoltare le richieste dei client.
La classe ServerSocket ha quattro costruttori:
Numero di ordinamento | Descrizione del metodo |
1 | public ServerSocket(int port) throws IOException Creare un socket server bindato a un port specifico. |
2 | public ServerSocket(int port, int backlog) throws IOException Creare un socket server utilizzando il valore specificato di backlog e bindarlo al port locale specificato. |
3 | public ServerSocket(int port, int backlog, InetAddress address) throws IOException Creare un server utilizzando il port, il backlog e l'indirizzo IP locale da bindare. |
4 | public ServerSocket() throws IOException Crea un server socket non vincolato. |
Crea un server socket non vincolato. Se il metodo costruttore di ServerSocket non lancia un'eccezione, significa che la tua applicazione è stata correttamente vincolata al port specificato e sta ascoltando le richieste dei client.
Ecco alcuni metodi comuni della classe ServerSocket:
Numero di ordinamento | Descrizione del metodo |
1 | public int getLocalPort() Restituisce il port sul quale questo socket sta ascoltando. |
2 | public Socket accept() throws IOException Ascolta e accetta la connessione a questo socket. |
3 | public void setSoTimeout(int timeout) Abilita/disabilita SO_TIMEOUT tramite un valore di timeout specificato in millisecondi. |
4 | public void bind(SocketAddress host, int backlog) Legare ServerSocket a un indirizzo specifico (indirizzo IP e porta). |
La classe java.net.Socket rappresenta il socket utilizzato sia dai client che dai server per comunicare tra loro. Il client ottiene un'istanza di Socket tramite la creazione di un'istanza, mentre il server ottiene un'istanza di Socket tramite il valore di ritorno del metodo accept().
La classe Socket ha cinque metodi costruttore.
Numero di ordinamento | Descrizione del metodo |
1 | public Socket(String host, int port) throws UnknownHostException, IOException. Crea un socket di flusso e lo connette al port specificato del host. |
2 | public Socket(InetAddress host, int port) throws IOException Crea un socket di flusso e lo connette al port specificato dell'indirizzo IP. |
3 | public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException. Crea un socket e lo connette al port remoto specificato del host remoto. |
4 | public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException. Crea un socket e lo connette alla porta remota specificata dell'indirizzo remoto specificato. |
5 | public Socket() Crea un socket non connesso utilizzando un SocketImpl di tipo di sistema predefinito |
Quando il metodo costruttore di Socket viene restituito e un esempio di Socket è stato semplicemente istanziato, in realtà tenta di connettersi al server e alla porta specificati.
Di seguito sono elencati alcuni metodi interessanti, notare che entrambi il client e il server hanno un oggetto Socket, quindi sia il client che il server possono chiamare questi metodi.
Numero di ordinamento | Descrizione del metodo |
1 | public void connect(SocketAddress host, int timeout) throws IOException Connette questo socket al server e specifica un valore di timeout. |
2 | public InetAddress getInetAddress() Restituisce l'indirizzo connesso del socket. |
3 | public int getPort() Restituisce il numero di porta remota a cui questo socket è connesso. |
4 | public int getLocalPort() Restituisce il numero di porta locale a cui questo socket è collegato. |
5 | public SocketAddress getRemoteSocketAddress() Restituisce l'indirizzo dell'endpoint connesso di questo socket, se non connesso restituisce null. |
6 | public InputStream getInputStream() throws IOException Restituisce lo stream di input di questo socket. |
7 | public OutputStream getOutputStream() throws IOException Restituisce lo stream di output di questo socket. |
8 | public void close() throws IOException Chiude questo socket. |
Questa classe rappresenta un indirizzo IP (Internet Protocol) dell'Internet. Di seguito sono elencati alcuni metodi utili durante la programmazione Socket:
Numero di ordinamento | Descrizione del metodo |
1 | static InetAddress getByAddress(byte[] addr) Restituisce un'oggetto InetAddress in base all'indirizzo IP originale fornito. |
2 | static InetAddress getByAddress(String host, byte[] addr) Crea un'InetAddress in base al nome dell'host e all'indirizzo IP forniti. |
3 | static InetAddress getByName(String host) Determina l'indirizzo IP dell'host data un nome di host. |
4 | String getHostAddress() Restituisce la stringa dell'indirizzo IP (in forma testuale). |
5 | String getHostName() Ottieni il nome dell'host associato a questo indirizzo IP. |
6 | static InetAddress getLocalHost() Restituisce l'host locale. |
7 | String toString() Converti questo indirizzo IP in String. |
Il seguente GreetingClient è un programma client che si connette al server tramite socket, invia una richiesta e attende una risposta.
// Nome del file GreetingClient.java import java.net.*; import java.io.*; public class GreetingClient { public static void main(String [] args) { String serverName = args[0]; int port = Integer.parseInt(args[1]); try { System.out.println("Connesso all'host: " + serverName + ",porta: " + port); Socket client = new Socket(serverName, port); System.out.println("Indirizzo host remoto: " + client.getRemoteSocketAddress()); OutputStream outToServer = client.getOutputStream(); DataOutputStream out = new DataOutputStream(outToServer); out.writeUTF("Ciao da " + client.getLocalSocketAddress()); InputStream inFromServer = client.getInputStream(); DataInputStream in = new DataInputStream(inFromServer); System.out.println("Risposta del server: " + in.readUTF()); client.close(); catch(IOException e) { e.printStackTrace(); } } }
Il seguente programma GreetingServer è un'applicazione server-side che utilizza Socket per ascoltare una porta specifica.
// 文件名 GreetingServer.java import java.net.*; import java.io.*; public class GreetingServer extends Thread { private ServerSocket serverSocket; public GreetingServer(int port) throws IOException { serverSocket = new ServerSocket(port); serverSocket.setSoTimeout(10000); } public void run() { while(true) { try { System.out.println("等待远程连接,端口号为:" + serverSocket.getLocalPort() + "..."); Socket server = serverSocket.accept(); System.out.println("远程主机地址:" + server.getRemoteSocketAddress()); DataInputStream in = new DataInputStream(server.getInputStream()); System.out.println(in.readUTF()); DataOutputStream out = new DataOutputStream(server.getOutputStream()); out.writeUTF("谢谢连接我:" + server.getLocalSocketAddress() + "\nGoodbye!"); server.close(); }catch(SocketTimeoutException s) { System.out.println("Socket timed out!"); break; catch(IOException e) { e.printStackTrace(); break; } } } public static void main(String [] args) { int port = Integer.parseInt(args[0]); try { Thread t = new GreetingServer(port); t.run(); catch(IOException e) { e.printStackTrace(); } } }
Compila i due file java elencati di seguito e esegui i seguenti comandi per avviare il servizio, utilizzando la porta 6066:
$ javac GreetingServer.java $ java GreetingServer 6066 In attesa della connessione remota, porta: 6066...
Apri una nuova finestra dei comandi e esegui i seguenti comandi per avviare il client:
$ javac GreetingClient.java $ java GreetingClient localhost 6066 Connesso all'host: localhost,porta: 6066 Indirizzo host remoto: localhost/127.0.0.1:6066 Risposta del server: Grazie per la connessione: /127.0.0.1:6066 Arrivederci!