English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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 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。
服务器应用程序通过使用 java.net.ServerSocket 类来获取一个端口,并且侦听客户端请求。
ServerSocket 类有四个构造方法:
Nummer | Methodenbeschreibung |
1 | public ServerSocket(int port) throws IOException 创建绑定到特定端口的服务器套接字。 |
2 | public ServerSocket(int port, int backlog) throws IOException 使用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。 |
3 | public ServerSocket(int port, int backlog, InetAddress address) throws IOException 创建服务器,使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址。 |
4 | public 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:
Nummer | Methodenbeschreibung |
1 | public int getLocalPort() Gibt den Port zurück, auf dem dieser Socket abgehört. |
2 | public Socket accept() throws IOException Wartet und akzeptiert eine Verbindung zu diesem Socket. |
3 | public void setSoTimeout(int timeout) Aktiviert durch Angabe eines Zeitouts/Deaktiviert SO_TIMEOUT in Millisekunden. |
4 | public void bind(SocketAddress host, int backlog) Bindet den ServerSocket an eine bestimmte Adresse (IP-Adresse und Portnummer). |
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.
Nummer | Methodenbeschreibung |
1 | public Socket(String host, int port) throws UnknownHostException, IOException. Erstellt einen Stream-Socket und verbindet ihn mit dem angegebenen Host und dem angegebenen Port. |
2 | public Socket(InetAddress host, int port) throws IOException Erstellt einen Stream-Socket und verbindet ihn mit der angegebenen IP-Adresse und dem angegebenen Port. |
3 | public 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. |
4 | public 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. |
5 | public 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.
Nummer | Methodenbeschreibung |
1 | public void connect(SocketAddress host, int timeout) throws IOException Verbindet diesen Socket mit dem Server und gibt eine Timeout-Wert an. |
2 | public InetAddress getInetAddress() Gibt die Adresse zurück, mit der der Socket verbunden ist. |
3 | public int getPort() Gibt den Remoteport zurück, auf dem dieser Socket verbunden ist. |
4 | public int getLocalPort() Gibt den lokalen Port zurück, auf dem dieser Socket gebunden ist. |
5 | public SocketAddress getRemoteSocketAddress() Gibt die Adresse des Endpunkts der Socket-Verbindung zurück, falls noch nicht verbunden, wird null zurückgegeben. |
6 | public InputStream getInputStream() throws IOException Gibt den Eingabestrom dieses Sockets zurück. |
7 | public OutputStream getOutputStream() throws IOException Gibt den Ausgabestrom dieses Sockets zurück. |
8 | public void close() throws IOException Schließen Sie diesen Socket. |
Diese Klasse stellt die Internet-Protokoll-Adresse (IP) dar. Im Folgenden sind einige nützliche Methoden für die Socket-Programmierung aufgeführt:
Nummer | Methodenbeschreibung |
1 | static InetAddress getByAddress(byte[] addr) Im Falle der angegebenen ursprünglichen IP-Adresse wird ein InetAddress-Objekt zurückgegeben. |
2 | static InetAddress getByAddress(String host, byte[] addr) Erstellt eine InetAddress basierend auf dem angegebenen Hostnamen und der IP-Adresse. |
3 | static InetAddress getByName(String host) Bestimmt die IP-Adresse des Hosts für einen gegebenen Hostnamen. |
4 | String getHostAddress() Gibt die IP-Adresse als String zurück (in Textform). |
5 | String getHostName() Gibt den Hostnamen der IP-Adresse zurück. |
6 | static InetAddress getLocalHost() Gibt die lokale Maschine zurück. |
7 | String toString() Konvertieren Sie diese IP-Adresse in einen String. |
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(); } } }
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!