English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 基礎教程

Controllo del flusso Java

Array Java

Orientamento ad oggetti Java (I)

Orientamento ad oggetti Java (II)

Orientamento ad oggetti Java (III)

Java 異常處理

List Java

Queue di Java (coda)

Map di Java

Set di Java

Input/Output (I/O) Java

Reader/Writer Java

Altri argomenti Java

Programmazione di rete Java

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.

Programmazione Socket

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.

Metodi della classe ServerSocket

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 ordinamentoDescrizione del metodo
1public ServerSocket(int port) throws IOException
Creare un socket server bindato a un port specifico.
2public ServerSocket(int port, int backlog) throws IOException
Creare un socket server utilizzando il valore specificato di backlog e bindarlo al port locale specificato.
3public ServerSocket(int port, int backlog, InetAddress address) throws IOException
Creare un server utilizzando il port, il backlog e l'indirizzo IP locale da bindare.
4public 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 ordinamentoDescrizione del metodo
1public int getLocalPort()
  Restituisce il port sul quale questo socket sta ascoltando.
2public Socket accept() throws IOException
Ascolta e accetta la connessione a questo socket.
3public void setSoTimeout(int timeout)
 Abilita/disabilita SO_TIMEOUT tramite un valore di timeout specificato in millisecondi.
4public void bind(SocketAddress host, int backlog)
Legare ServerSocket a un indirizzo specifico (indirizzo IP e porta).

Metodi della classe Socket

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 ordinamentoDescrizione del metodo
1public Socket(String host, int port) throws UnknownHostException, IOException.
Crea un socket di flusso e lo connette al port specificato del host.
2public Socket(InetAddress host, int port) throws IOException
Crea un socket di flusso e lo connette al port specificato dell'indirizzo IP.
3public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException.
Crea un socket e lo connette al port remoto specificato del host remoto.
4public 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.
5public 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 ordinamentoDescrizione del metodo
1public void connect(SocketAddress host, int timeout) throws IOException
Connette questo socket al server e specifica un valore di timeout.
2public InetAddress getInetAddress()
 Restituisce l'indirizzo connesso del socket.
3public int getPort()
Restituisce il numero di porta remota a cui questo socket è connesso.
4public int getLocalPort()
Restituisce il numero di porta locale a cui questo socket è collegato.
5public SocketAddress getRemoteSocketAddress()
Restituisce l'indirizzo dell'endpoint connesso di questo socket, se non connesso restituisce null.
6public InputStream getInputStream() throws IOException
Restituisce lo stream di input di questo socket.
7public OutputStream getOutputStream() throws IOException
Restituisce lo stream di output di questo socket.
8public void close() throws IOException
Chiude questo socket.

Metodi della classe InetAddress

Questa classe rappresenta un indirizzo IP (Internet Protocol) dell'Internet. Di seguito sono elencati alcuni metodi utili durante la programmazione Socket:

Numero di ordinamentoDescrizione del metodo
1static InetAddress getByAddress(byte[] addr)
Restituisce un'oggetto InetAddress in base all'indirizzo IP originale fornito.
2static InetAddress getByAddress(String host, byte[] addr)
Crea un'InetAddress in base al nome dell'host e all'indirizzo IP forniti.
3static InetAddress getByName(String host)
Determina l'indirizzo IP dell'host data un nome di host.
4String getHostAddress() 
Restituisce la stringa dell'indirizzo IP (in forma testuale).
5String getHostName() 
 Ottieni il nome dell'host associato a questo indirizzo IP.
6static InetAddress getLocalHost()
Restituisce l'host locale.
7String toString()
Converti questo indirizzo IP in String.

Esempio di client Socket

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();
      }
   }
}

Esempio di server Socket

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!