Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Java

Java - Netzwerken

Der Begriff Netzwerkprogrammierung bezieht sich auf das Schreiben von Programmen, die auf mehreren Geräten (Computern) ausgeführt werden, wobei die Geräte alle über ein Netzwerk miteinander verbunden sind.

Das java.net-Paket der J2SE-APIs enthält eine Sammlung von Klassen und Schnittstellen, die die Kommunikationsdetails auf niedriger Ebene bereitstellen, sodass Sie Programme schreiben können, die sich auf die Lösung des vorliegenden Problems konzentrieren.

Das Paket java.net bietet Unterstützung für die beiden gängigen Netzwerkprotokolle −

Dieses Kapitel vermittelt ein gutes Verständnis der folgenden zwei Themen −

Socket-Programmierung

Sockets stellen den Kommunikationsmechanismus zwischen zwei Computern bereit, die TCP verwenden. Ein Client-Programm erstellt einen Socket an seinem Ende der Kommunikation und versucht, diesen Socket mit einem Server zu verbinden.

Wenn die Verbindung hergestellt wird, erstellt der Server an seinem Ende der Kommunikation ein Socket-Objekt. Der Client und der Server können jetzt kommunizieren, indem sie in den Socket schreiben und aus ihm lesen.

Die java.net.Socket-Klasse stellt einen Socket dar, und die java.net.ServerSocket-Klasse bietet einen Mechanismus für das Serverprogramm, um auf Clients zu warten und Verbindungen mit ihnen herzustellen.

Die folgenden Schritte werden ausgeführt, wenn eine TCP-Verbindung zwischen zwei Computern mithilfe von Sockets aufgebaut wird −

Nachdem die Verbindungen hergestellt wurden, kann die Kommunikation über E/A-Streams erfolgen. Jeder Socket hat sowohl einen OutputStream als auch einen InputStream. Der OutputStream des Clients ist mit dem InputStream des Servers verbunden, und der InputStream des Clients ist mit dem OutputStream des Servers verbunden.

TCP ist ein bidirektionales Kommunikationsprotokoll, daher können Daten gleichzeitig über beide Streams gesendet werden. Im Folgenden sind die nützlichen Klassen aufgeführt, die einen vollständigen Satz von Methoden zum Implementieren von Sockets bereitstellen.

ServerSocket-Klassenmethoden

Der java.net.ServerSocket -Klasse wird von Serveranwendungen verwendet, um einen Port zu erhalten und auf Clientanforderungen zu lauschen.

Die Klasse ServerSocket hat vier Konstruktoren −

Sr.No. Methode &Beschreibung
1

public ServerSocket(int port) löst IOException aus

Versucht, einen an den angegebenen Port gebundenen Server-Socket zu erstellen. Eine Ausnahme tritt auf, wenn der Port bereits von einer anderen Anwendung gebunden ist.

2

public ServerSocket(int port, int backlog) löst IOException aus

Ähnlich wie beim vorherigen Konstruktor gibt der Backlog-Parameter an, wie viele eingehende Clients in einer Warteschlange gespeichert werden sollen.

3

public ServerSocket(int port, int backlog, InetAddress address) löst IOException aus

Ähnlich wie beim vorherigen Konstruktor gibt der InetAddress-Parameter die lokale IP-Adresse an, an die die Bindung erfolgen soll. Die InetAddress wird für Server verwendet, die möglicherweise mehrere IP-Adressen haben, wodurch der Server angeben kann, auf welcher seiner IP-Adressen Client-Anfragen akzeptiert werden sollen.

4

public ServerSocket() wirft IOException

Erstellt einen ungebundenen Server-Socket. Wenn Sie diesen Konstruktor verwenden, verwenden Sie die Methode bind(), wenn Sie bereit sind, den Server-Socket zu binden.

Wenn der ServerSocket-Konstruktor keine Ausnahme auslöst, bedeutet dies, dass Ihre Anwendung erfolgreich an den angegebenen Port gebunden wurde und für Clientanforderungen bereit ist.

Im Folgenden sind einige der gängigen Methoden der ServerSocket-Klasse aufgeführt:−

Sr.No. Methode &Beschreibung
1

public int getLocalPort()

Gibt den Port zurück, auf dem der Server-Socket lauscht. Diese Methode ist nützlich, wenn Sie 0 als Portnummer in einem Konstruktor übergeben und den Server einen Port für Sie suchen lassen.

2

public Socket accept() wirft IOException

Wartet auf einen eingehenden Client. Diese Methode blockiert, bis entweder ein Client eine Verbindung mit dem Server am angegebenen Port herstellt oder das Socket-Timeout abläuft, vorausgesetzt, dass der Timeout-Wert mit der Methode setSoTimeout() festgelegt wurde. Andernfalls blockiert diese Methode auf unbestimmte Zeit.

3

public void setSoTimeout(int timeout)

Legt den Zeitüberschreitungswert dafür fest, wie lange der Server-Socket während des Accept() auf einen Client wartet.

4

public void bind(SocketAddress host, int backlog)

Bindet den Socket an den angegebenen Server und Port im SocketAddress-Objekt. Verwenden Sie diese Methode, wenn Sie den ServerSocket mit dem Konstruktor ohne Argumente instanziiert haben.

Wenn der ServerSocket accept() aufruft, kehrt die Methode erst zurück, wenn ein Client eine Verbindung herstellt. Nachdem ein Client eine Verbindung hergestellt hat, erstellt der ServerSocket einen neuen Socket an einem nicht angegebenen Port und gibt einen Verweis auf diesen neuen Socket zurück. Zwischen dem Client und dem Server besteht nun eine TCP-Verbindung und die Kommunikation kann beginnen.

Socket-Klassenmethoden

Der java.net.Socket Die Klasse stellt den Socket dar, den sowohl der Client als auch der Server verwenden, um miteinander zu kommunizieren. Der Client erhält ein Socket-Objekt, indem er eines instanziiert, während der Server ein Socket-Objekt aus dem Rückgabewert der Methode accept() erhält.

Die Socket-Klasse hat fünf Konstruktoren, die ein Client verwendet, um sich mit einem Server zu verbinden −

Sr.No. Methode &Beschreibung
1

public Socket(String host, int port) löst UnknownHostException, IOException aus.

Diese Methode versucht, eine Verbindung mit dem angegebenen Server am angegebenen Port herzustellen. Wenn dieser Konstruktor keine Ausnahme auslöst, ist die Verbindung erfolgreich und der Client ist mit dem Server verbunden.

2

public Socket(InetAddress host, int port) löst IOException aus

Diese Methode ist identisch mit dem vorherigen Konstruktor, außer dass der Host durch ein InetAddress-Objekt bezeichnet wird.

3

public Socket(String host, int port, InetAddress localAddress, int localPort) löst IOException aus.

Stellt eine Verbindung zum angegebenen Host und Port her und erstellt einen Socket auf dem lokalen Host an der angegebenen Adresse und dem angegebenen Port.

4

public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) löst IOException aus.

Diese Methode ist identisch mit dem vorherigen Konstruktor, außer dass der Host durch ein InetAddress-Objekt statt durch einen String bezeichnet wird.

5

öffentlicher Socket()

Erstellt einen nicht verbundenen Socket. Verwenden Sie die Methode connect(), um diesen Socket mit einem Server zu verbinden.

Wenn der Socket-Konstruktor zurückkehrt, instanziiert er nicht einfach ein Socket-Objekt, sondern versucht tatsächlich, sich mit dem angegebenen Server und Port zu verbinden.

Einige interessante Methoden in der Socket-Klasse sind hier aufgelistet. Beachten Sie, dass sowohl der Client als auch der Server ein Socket-Objekt haben, sodass diese Methoden sowohl vom Client als auch vom Server aufgerufen werden können.

Sr.No. Methode &Beschreibung
1

public void connect(SocketAddress host, int timeout) löst IOException aus

Diese Methode verbindet den Socket mit dem angegebenen Host. Diese Methode wird nur benötigt, wenn Sie den Socket mit dem Konstruktor ohne Argumente instanziieren.

2

öffentliche InetAddress getInetAddress()

Diese Methode gibt die Adresse des anderen Computers zurück, mit dem dieser Socket verbunden ist.

3

public int getPort()

Gibt den Port zurück, an den der Socket auf dem Remote-Rechner gebunden ist.

4

public int getLocalPort()

Gibt den Port zurück, an den der Socket auf dem lokalen Rechner gebunden ist.

5

öffentliche SocketAddress getRemoteSocketAddress()

Gibt die Adresse des entfernten Sockets zurück.

6

public InputStream getInputStream() wirft IOException

Gibt den Eingabestrom des Sockets zurück. Der Eingangsstrom wird mit dem Ausgangsstrom der Remote-Buchse verbunden.

7

public OutputStream getOutputStream() wirft IOException

Gibt den Ausgabestrom des Sockets zurück. Der Ausgangsstrom wird mit dem Eingangsstrom der Remote-Buchse verbunden.

8

public void close() löst IOException aus

Schließt den Socket, wodurch dieses Socket-Objekt nicht mehr in der Lage ist, sich erneut mit einem Server zu verbinden.

Methoden der InetAddress-Klasse

Diese Klasse repräsentiert eine Internet Protocol (IP)-Adresse. Hier sind die folgenden nützlichen Methoden, die Sie bei der Socket-Programmierung benötigen würden −

Sr.No. Methode &Beschreibung
1

statische InetAddress getByAddress(byte[] addr)

Gibt ein InetAddress-Objekt mit der rohen IP-Adresse zurück.

2

statische InetAddress getByAddress(String host, byte[] addr)

Erstellt eine InetAddress basierend auf dem bereitgestellten Hostnamen und der IP-Adresse.

3

statische InetAddress getByName(String host)

Ermittelt die IP-Adresse eines Hosts anhand des Hostnamens.

4

String getHostAddress()

Gibt die Zeichenfolge der IP-Adresse in Textdarstellung zurück.

5

String getHostName()

Ruft den Hostnamen für diese IP-Adresse ab.

6

statische InetAddress InetAddress getLocalHost()

Gibt den lokalen Host zurück.

7

String zuString()

Konvertiert diese IP-Adresse in einen String.

Socket-Client-Beispiel

Der folgende GreetingClient ist ein Client-Programm, das über einen Socket eine Verbindung zu einem Server herstellt, eine Begrüßung sendet und dann auf eine Antwort wartet.

Beispiel

// File Name 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("Connecting to " + serverName + " on port " + port);
         Socket client = new Socket(serverName, port);
         
         System.out.println("Just connected to " + client.getRemoteSocketAddress());
         OutputStream outToServer = client.getOutputStream();
         DataOutputStream out = new DataOutputStream(outToServer);
         
         out.writeUTF("Hello from " + client.getLocalSocketAddress());
         InputStream inFromServer = client.getInputStream();
         DataInputStream in = new DataInputStream(inFromServer);
         
         System.out.println("Server says " + in.readUTF());
         client.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

Socket-Server-Beispiel

Das folgende GreetingServer-Programm ist ein Beispiel für eine Serveranwendung, die die Socket-Klasse verwendet, um Clients an einer Portnummer abzuhören, die durch ein Befehlszeilenargument −

angegeben wird

Beispiel

// File Name 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("Waiting for client on port " + 
               serverSocket.getLocalPort() + "...");
            Socket server = serverSocket.accept();
            
            System.out.println("Just connected to " + server.getRemoteSocketAddress());
            DataInputStream in = new DataInputStream(server.getInputStream());
            
            System.out.println(in.readUTF());
            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            out.writeUTF("Thank you for connecting to " + 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.start();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

Kompilieren Sie den Client und den Server und starten Sie dann den Server wie folgt −

$ java GreetingServer 6066
Waiting for client on port 6066...

Überprüfen Sie das Client-Programm wie folgt −

Ausgabe

$ java GreetingClient localhost 6066
Connecting to localhost on port 6066
Just connected to localhost/127.0.0.1:6066
Server says Thank you for connecting to /127.0.0.1:6066
Goodbye!

Java

  1. Java-Operatoren
  2. Java-Kommentare
  3. Java for-each-Schleife
  4. Java-Strings
  5. Java-Schnittstelle
  6. Anonyme Java-Klasse
  7. Java-Versuch-mit-Ressourcen
  8. Java-Anmerkungen
  9. Java-Assertionen
  10. Java-Vektor