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

Java Grund教程

Java Flow Control

Java Array

Java objektorientiert (I)

Java objektorientiert (II)

Java objektorientiert (III)

Java Ausnahmebehandlung

Java Liste (Liste)

Java Queue (Warteschlange)

Java Map-Sammel

Java Set-Sammel

Java Eingabe-/Ausgabesystem(I/O)

Java Reader/Writer

Andere Themen von Java

Java Network Programming

Netzwerkkommunikation bezieht sich auf das Schreiben von Programmen, die auf mehreren Geräten (Computern) ausgeführt werden, die über ein Netzwerk verbunden sind.

java.net-Paket enthält J2Die API von SE enthält Klassen und Interfaces, die niedrigere Kommunikationsdetails bereitstellen. Sie können diese Klassen und Interfaces direkt verwenden, um sich auf die Problemlösung zu konzentrieren, ohne sich um die Kommunikationsdetails zu kümmern.

java.net-Paket bietet Unterstützung für zwei gängige Netzwerkprotokolle:

  • TCP:TCP (Englisch: Transmission Control Protocol, Übertragungssteuerungsprotokoll) ist ein verbindungsorientiertes, zuverlässiges, auf Byte-Stream basierendes Übertragungsschicht-Kommunikationsprotokoll. Das TCP-Schicht liegt über dem IP-Schicht und unter dem Anwendungsschicht und ist eine Zwischenschicht. TCP gewährleistet die zuverlässige Kommunikation zwischen zwei Anwendungen. Wird normalerweise für Internetprotokolle verwendet und wird TCP genannt. / IP.

  • UDP:UDP (Englisch: User Datagram Protocol, Benutzerdatagrammprotokoll), liegt im Übertragungsschicht der OSI-Modell. Ein verbindungsloses Protokoll. Bietet Datenpaket, die zwischen Anwendungen gesendet werden sollen. Da UDP keine Zuverlässigkeit bietet und ein verbindungsloses Protokoll ist, müssen Anwendungen in der Regel einige verloren gegangene, fehlerhafte oder wiederholte Pakete tolerieren.

Dieses Tutorial behandelt hauptsächlich die folgenden beiden Themen.

  • Socket-Programmierung:Das ist ein der am weitesten verbreiteten Netzwerkkonzepte, das sehr detailliert erklärt wurde.

  • URL-Verarbeitung:Dieser Teil wird in einem anderen Abschnitt erläutert, klicken Sie hier, um detaillierter über die URL-Verarbeitung in der Java-Sprache

Socket-Programmierung

Socket verwenden TCP, um ein Kommunikationsmechanismus zwischen zwei Computern zu bieten. Das Client-Programm erstellt einen Socket und versucht, eine Verbindung zum Socket des Servers herzustellen.

Wenn die Verbindung hergestellt wird, erstellt der Server ein Socket-Objekt. Der Client und der Server können jetzt durch Schreiben und Lesen auf dem Socket-Objekt kommunizieren.

java.net.Socket 类代表一个套接字,并且 java.net.ServerSocket 类为服务器程序提供了一种监听客户端并与他们建立连接的机制。

以下步骤在两台计算机之间使用套接字建立 TCP 连接时会出现:

  • 服务器示例化一个 ServerSocket 对象,表示通过服务器上的端口通信。

  • 服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。

  • 服务器正在等待时,一个客户端示例化一个 Socket 对象,指定服务器名称和端口号来请求连接。

  • Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。

  • 在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。

连接建立后,通过使用 I/在进行通信时,每一个 socket 都有一个输出流和一个输入流,客户端的输出流连接到服务器端的输入流,而客户端的输入流连接到服务器端的输出流。

TCP 是一个双向的通信协议,因此数据可以通过两个数据流在同一时间发送。以下是一些类提供的一套完整的有用的方法来实现 socket。

ServerSocket 类的方法

服务器应用程序通过使用 java.net.ServerSocket 类来获取一个端口,并且侦听客户端请求。

ServerSocket 类有四个构造方法:

NummerMethodenbeschreibung
1public ServerSocket(int port) throws IOException
创建绑定到特定端口的服务器套接字。
2public ServerSocket(int port, int backlog) throws IOException
使用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。
3public ServerSocket(int port, int backlog, InetAddress address) throws IOException
创建服务器,使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址。
4public ServerSocket() throws IOException
Erstellt einen nicht gebundenen Server-Socket.

Erstellt einen nicht gebundenen Server-Socket. Wenn der ServerSocket-Konstruktor keine Ausnahme wirft, bedeutet dies, dass Ihre Anwendung erfolgreich auf den angegebenen Port gebunden und auf Client-Anfragen gehört wird.

Hier sind einige häufig verwendete Methoden der ServerSocket-Klasse:

NummerMethodenbeschreibung
1public int getLocalPort()
  Gibt den Port zurück, auf dem dieser Socket abgehört.
2public Socket accept() throws IOException
Wartet und akzeptiert eine Verbindung zu diesem Socket.
3public void setSoTimeout(int timeout)
 Aktiviert durch Angabe eines Zeitouts/Deaktiviert SO_TIMEOUT in Millisekunden.
4public void bind(SocketAddress host, int backlog)
Bindet den ServerSocket an eine bestimmte Adresse (IP-Adresse und Portnummer).

Methoden der Socket-Klasse

Die Klasse java.net.Socket repräsentiert den Socket, der sowohl von Clients als auch von Servern zur Kommunikation verwendet wird. Der Client erhält ein Socket-Objekt durch Instantiierung, während der Server ein Socket-Objekt durch den Rückgabewert der Methode accept() erhält.

Die Socket-Klasse hat fünf Konstruktoren.

NummerMethodenbeschreibung
1public Socket(String host, int port) throws UnknownHostException, IOException.
Erstellt einen Stream-Socket und verbindet ihn mit dem angegebenen Host und dem angegebenen Port.
2public Socket(InetAddress host, int port) throws IOException
Erstellt einen Stream-Socket und verbindet ihn mit der angegebenen IP-Adresse und dem angegebenen Port.
3public Socket(String host, int port, InetAddress localAddress, int localPort) throws IOException.
Erstellt einen Socket und verbindet ihn mit der angegebenen Remote-Adresse und dem angegebenen Remote-Port.
4public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) throws IOException.
Erstellt einen Socket und verbindet ihn mit der angegebenen Remoteadresse und dem angegebenen Remoteport.
5public Socket()
Erstellt einen nicht verbundenen Socket durch das Systemdefaulttypische SocketImpl

Wenn der Socket-Constructor zurückgegeben wird und ein Socket-Objekt einfach instantiiert wurde, versucht es tatsächlich, eine Verbindung zum angegebenen Server und Port herzustellen.

Im Folgenden sind einige interessante Methoden aufgeführt, beachten Sie, dass sowohl auf der Client- als auch auf der Serverseite ein Socket-Objekt vorhanden ist, daher können sowohl Client als auch Server diese Methoden aufrufen.

NummerMethodenbeschreibung
1public void connect(SocketAddress host, int timeout) throws IOException
Verbindet diesen Socket mit dem Server und gibt eine Timeout-Wert an.
2public InetAddress getInetAddress()
 Gibt die Adresse zurück, mit der der Socket verbunden ist.
3public int getPort()
Gibt den Remoteport zurück, auf dem dieser Socket verbunden ist.
4public int getLocalPort()
Gibt den lokalen Port zurück, auf dem dieser Socket gebunden ist.
5public SocketAddress getRemoteSocketAddress()
Gibt die Adresse des Endpunkts der Socket-Verbindung zurück, falls noch nicht verbunden, wird null zurückgegeben.
6public InputStream getInputStream() throws IOException
Gibt den Eingabestrom dieses Sockets zurück.
7public OutputStream getOutputStream() throws IOException
Gibt den Ausgabestrom dieses Sockets zurück.
8public void close() throws IOException
Schließen Sie diesen Socket.

Methoden der InetAddress-Klasse

Diese Klasse stellt die Internet-Protokoll-Adresse (IP) dar. Im Folgenden sind einige nützliche Methoden für die Socket-Programmierung aufgeführt:

NummerMethodenbeschreibung
1static InetAddress getByAddress(byte[] addr)
Im Falle der angegebenen ursprünglichen IP-Adresse wird ein InetAddress-Objekt zurückgegeben.
2static InetAddress getByAddress(String host, byte[] addr)
Erstellt eine InetAddress basierend auf dem angegebenen Hostnamen und der IP-Adresse.
3static InetAddress getByName(String host)
Bestimmt die IP-Adresse des Hosts für einen gegebenen Hostnamen.
4String getHostAddress() 
Gibt die IP-Adresse als String zurück (in Textform).
5String getHostName() 
 Gibt den Hostnamen der IP-Adresse zurück.
6static InetAddress getLocalHost()
Gibt die lokale Maschine zurück.
7String toString()
Konvertieren Sie diese IP-Adresse in einen String.

Beispiel eines Socket-Client

Der folgende GreetingClient ist ein Client-Programm, das über Socket eine Verbindung zum Server herstellt, eine Anfrage sendet und daraufhin auf eine Antwort wartet.

// Dateiname 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("Verbindung mit Host: " + serverName + ", Portnummer: " + port);
         Socket client = new Socket(serverName, port);
         System.out.println("Remote host address:") + client.getRemoteSocketAddress());
         OutputStream outToServer = client.getOutputStream();
         DataOutputStream out = new DataOutputStream(outToServer;)
 
         out.writeUTF("Hallo von " + client.getLocalSocketAddress());
         InputStream inFromServer = client.getInputStream();
         DataInputStream in = new DataInputStream(inFromServer;
         System.out.println("Server antwortet: " + in.readUTF());
         client.close();
      catch(IOException e)
      {
         e.printStackTrace();
      }
   }
}

Socket Server Beispiel

Der folgende GreetingServer-Programm ist eine Server-Anwendung, die Socket verwendet, um auf einen bestimmten Port zu hören.

// Dateiname 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 a remote connection, port number:") + serverSocket.getLocalPort() + "..."
            Socket server = serverSocket.accept();
            System.out.println("Remote host address:") + server.getRemoteSocketAddress());
            DataInputStream in = new DataInputStream(server.getInputStream());
            System.out.println(in.readUTF());
            DataOutputStream out = new DataOutputStream(server.getOutputStream());
            out.writeUTF("Danke für die Verbindung zu mir:" + 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();
      }
   }
}

Compile the above two java files and execute the following command to start the service, using port: 6066:

$ javac GreetingServer.java 
$ java GreetingServer 6066
Waiting for remote connection, port:6066...

Open a new command window and execute the following commands to start the client:

$ javac GreetingClient.java 
$ java GreetingClient localhost 6066
Connecting to host: localhost, port:6066
Remote Host Address: localhost/127.0.0.1:6066
Server Response: Thank you for connecting to me:/127.0.0.1:6066
Goodbye!