Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Java

Java - Netwerken

De term netwerkprogrammering verwijst naar het schrijven van programma's die op meerdere apparaten (computers) worden uitgevoerd, waarbij de apparaten allemaal met elkaar zijn verbonden via een netwerk.

Het java.net-pakket van de J2SE API's bevat een verzameling klassen en interfaces die de communicatiedetails op laag niveau bieden, zodat u programma's kunt schrijven die zich richten op het oplossen van het probleem in kwestie.

Het pakket java.net biedt ondersteuning voor de twee gemeenschappelijke netwerkprotocollen −

  • TCP − TCP staat voor Transmission Control Protocol, dat een betrouwbare communicatie tussen twee toepassingen mogelijk maakt. TCP wordt meestal gebruikt via het internetprotocol, dat wordt aangeduid als TCP/IP.

  • UDP − UDP staat voor User Datagram Protocol, een verbindingsloos protocol waarmee gegevenspakketten tussen applicaties kunnen worden verzonden.

Dit hoofdstuk geeft een goed inzicht in de volgende twee onderwerpen −

  • Socket-programmering − Dit is het meest gebruikte concept in netwerken en het is zeer gedetailleerd uitgelegd.

  • URL-verwerking − Dit zou apart worden gedekt. Klik hier voor meer informatie over URL-verwerking in Java-taal.

Socket-programmering

Sockets zorgen voor het communicatiemechanisme tussen twee computers die gebruikmaken van TCP. Een clientprogramma maakt een socket aan het einde van de communicatie en probeert die socket met een server te verbinden.

Wanneer de verbinding tot stand is gebracht, maakt de server een socket-object aan het einde van de communicatie. De client en de server kunnen nu communiceren door te schrijven naar en te lezen van de socket.

De klasse java.net.Socket vertegenwoordigt een socket en de klasse java.net.ServerSocket biedt een mechanisme voor het serverprogramma om naar clients te luisteren en verbindingen met hen tot stand te brengen.

De volgende stappen vinden plaats bij het tot stand brengen van een TCP-verbinding tussen twee computers met behulp van sockets −

  • De server maakt een ServerSocket-object aan, waarmee wordt aangegeven op welk poortnummer de communicatie moet plaatsvinden.

  • De server roept de methode accept() van de klasse ServerSocket aan. Deze methode wacht totdat een client verbinding maakt met de server op de gegeven poort.

  • Nadat de server wacht, maakt een client een Socket-object aan, met vermelding van de servernaam en het poortnummer waarmee verbinding moet worden gemaakt.

  • De constructor van de klasse Socket probeert de client te verbinden met de opgegeven server en het poortnummer. Als de communicatie tot stand is gebracht, heeft de client nu een Socket-object dat met de server kan communiceren.

  • Aan de serverkant retourneert de methode accept() een verwijzing naar een nieuwe socket op de server die is verbonden met de socket van de client.

Nadat de verbindingen tot stand zijn gebracht, kan communicatie plaatsvinden met behulp van I/O-stromen. Elke socket heeft zowel een OutputStream als een InputStream. De OutputStream van de client is verbonden met de InputStream van de server en de InputStream van de client is verbonden met de OutputStream van de server.

TCP is een tweerichtingscommunicatieprotocol, dus gegevens kunnen tegelijkertijd over beide streams worden verzonden. Hieronder volgen de nuttige klassen die een complete set methoden bieden om sockets te implementeren.

ServerSocket-klassemethoden

De java.net.ServerSocket class wordt gebruikt door servertoepassingen om een ​​poort te verkrijgen en te luisteren naar clientverzoeken.

De klasse ServerSocket heeft vier constructors −

Zr.nr. Methode en beschrijving
1

public ServerSocket(int port) genereert IOException

Pogingen om een ​​server-socket te maken die is gekoppeld aan de opgegeven poort. Er treedt een uitzondering op als de poort al door een andere toepassing is gebonden.

2

public ServerSocket(int port, int backlog) gooit IOException weg

Net als bij de vorige constructor, specificeert de backlog-parameter hoeveel inkomende clients in een wachtrij moeten worden opgeslagen.

3

public ServerSocket(int port, int backlog, InetAddress adres) gooit IOException

Net als bij de vorige constructor, specificeert de InetAddress-parameter het lokale IP-adres om aan te binden. Het InetAddress wordt gebruikt voor servers die meerdere IP-adressen kunnen hebben, waardoor de server kan specificeren op welke van zijn IP-adressen clientverzoeken moeten worden geaccepteerd.

4

public ServerSocket() gooit IOException

Creëert een ongebonden server-socket. Wanneer je deze constructor gebruikt, gebruik dan de bind() methode wanneer je klaar bent om de server socket te binden.

Als de ServerSocket-constructor geen uitzondering genereert, betekent dit dat uw toepassing met succes is gebonden aan de opgegeven poort en klaar is voor clientverzoeken.

Hieronder volgen enkele veelgebruikte methoden van de ServerSocket-klasse −

Zr.nr. Methode en beschrijving
1

public int getLocalPort()

Retourneert de poort waarop de server-socket luistert. Deze methode is handig als je 0 hebt doorgegeven als het poortnummer in een constructor en de server een poort voor je hebt laten vinden.

2

public Socket accept() genereert IOException

Wacht op een binnenkomende klant. Deze methode blokkeert totdat een client verbinding maakt met de server op de opgegeven poort of de socket een time-out geeft, ervan uitgaande dat de time-outwaarde is ingesteld met de methode setSoTimeout(). Anders blokkeert deze methode voor onbepaalde tijd.

3

public void setSoTimeout(int timeout)

Stelt de time-outwaarde in voor hoe lang de serversocket op een client wacht tijdens de accept().

4

public void bind(SocketAddress host, int backlog)

Bindt de socket aan de opgegeven server en poort in het SocketAddress-object. Gebruik deze methode als je de ServerSocket hebt geïnstantieerd met de no-argument constructor.

Wanneer de ServerSocket accept() aanroept, keert de methode pas terug als een client verbinding maakt. Nadat een client verbinding heeft gemaakt, maakt de ServerSocket een nieuwe socket op een niet-gespecificeerde poort en retourneert een verwijzing naar deze nieuwe socket. Er bestaat nu een TCP-verbinding tussen de client en de server en de communicatie kan beginnen.

Socketklasse-methoden

De java.net.Socket class vertegenwoordigt de socket die zowel de client als de server gebruiken om met elkaar te communiceren. De client verkrijgt een Socket-object door er een te instantiëren, terwijl de server een Socket-object verkrijgt uit de retourwaarde van de accept()-methode.

De klasse Socket heeft vijf constructors die een client gebruikt om verbinding te maken met een server −

Zr.nr. Methode en beschrijving
1

public Socket(String host, int port) genereert UnknownHostException, IOException.

Deze methode probeert verbinding te maken met de opgegeven server op de opgegeven poort. Als deze constructor geen uitzondering genereert, is de verbinding geslaagd en is de client verbonden met de server.

2

public Socket (InetAddress-host, int-poort) gooit IOException

Deze methode is identiek aan de vorige constructor, behalve dat de host wordt aangegeven door een InetAddress-object.

3

public Socket (String host, int port, InetAddress localAddress, int localPort) genereert IOException.

Maakt verbinding met de opgegeven host en poort en maakt een socket op de lokale host op het opgegeven adres en de opgegeven poort.

4

public Socket (InetAddress host, int port, InetAddress localAddress, int localPort) genereert IOException.

Deze methode is identiek aan de vorige constructor, behalve dat de host wordt aangeduid met een InetAddress-object in plaats van een String.

5

openbare socket()

Creëert een niet-verbonden socket. Gebruik de methode connect() om deze socket met een server te verbinden.

Wanneer de Socket-constructor terugkeert, wordt niet alleen een Socket-object geïnstantieerd, maar wordt daadwerkelijk geprobeerd verbinding te maken met de opgegeven server en poort.

Enkele interessante methoden in de klasse Socket worden hier vermeld. Merk op dat zowel de client als de server een Socket-object hebben, dus deze methoden kunnen worden aangeroepen door zowel de client als de server.

Zr.nr. Methode en beschrijving
1

public void connect(SocketAddress host, int timeout) genereert IOException

Deze methode verbindt de socket met de opgegeven host. Deze methode is alleen nodig als je de Socket instantiëren met de no-argument constructor.

2

openbare InetAddress getInetAddress()

Deze methode retourneert het adres van de andere computer waarop deze socket is aangesloten.

3

public int getPort()

Retourneert de poort waaraan de socket is gebonden op de externe machine.

4

public int getLocalPort()

Retourneert de poort waaraan de socket is gebonden op de lokale computer.

5

public SocketAddress getRemoteSocketAddress()

Retourneert het adres van de externe socket.

6

public InputStream getInputStream() gooit IOException

Retourneert de invoerstroom van de socket. De invoerstroom is verbonden met de uitvoerstroom van de externe aansluiting.

7

public OutputStream getOutputStream() gooit IOException

Retourneert de uitvoerstroom van de socket. De uitgangsstroom is verbonden met de ingangsstroom van de externe aansluiting.

8

public void close() genereert IOException

Sluit de socket, waardoor dit Socket-object niet langer in staat is om opnieuw verbinding te maken met een server.

InetAddress-klassemethoden

Deze klasse vertegenwoordigt een IP-adres (Internet Protocol). Hier volgen de handige methoden die je nodig hebt tijdens het programmeren van sockets −

Zr.nr. Methode en beschrijving
1

statisch InetAddress getByAddress(byte[] adres)

Retourneert een InetAddress-object gegeven het onbewerkte IP-adres.

2

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

Creëert een InetAddress op basis van de opgegeven hostnaam en IP-adres.

3

statische InetAddress getByName(String-host)

Bepaalt het IP-adres van een host, gegeven de naam van de host.

4

String getHostAddress()

Retourneert de IP-adresreeks in tekstuele presentatie.

5

String getHostName()

Haalt de hostnaam op voor dit IP-adres.

6

statisch InetAddress InetAddress getLocalHost()

Retourneert de lokale host.

7

String toString()

Converteert dit IP-adres naar een string.

Socket-clientvoorbeeld

De volgende GreetingClient is een clientprogramma dat verbinding maakt met een server via een socket, een begroeting verzendt en vervolgens wacht op een reactie.

Voorbeeld

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

Socketservervoorbeeld

Het volgende GreetingServer-programma is een voorbeeld van een servertoepassing die de klasse Socket gebruikt om te luisteren naar clients op een poortnummer dat is opgegeven door een opdrachtregelargument −

Voorbeeld

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

Compileer de client en de server en start de server als volgt −

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

Controleer het clientprogramma als volgt −

Uitvoer

$ 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-operators
  2. Java-opmerkingen
  3. Java voor elke lus
  4. Java-strings
  5. Java-interface
  6. Java anonieme klasse
  7. Java proberen-met-bronnen
  8. Java-annotaties
  9. Java-beweringen
  10. Java-vector
  11. Java - Netwerken