Heim  >  Artikel  >  Java  >  Detaillierte Erläuterung des Netzwerkprogrammier-Sockets

Detaillierte Erläuterung des Netzwerkprogrammier-Sockets

Y2J
Y2JOriginal
2017-05-08 14:04:481273Durchsuche

Dieser Artikel stellt hauptsächlich die Klassenmethoden und Beispiele in der Java-Netzwerkprogrammierung vor.

Netzwerkprogrammierung bezieht sich auf das Schreiben von Programmen, die auf mehreren Geräten (Computern) ausgeführt werden über das Internet.

Die J2SE-API im java.net-Paket enthält Klassen und Schnittstellen, die Kommunikationsdetails auf niedriger Ebene bereitstellen. Sie können diese Klassen und Schnittstellen direkt verwenden, um sich auf die Lösung von Problemen statt auf Kommunikationsdetails zu konzentrieren.

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

TCP: TCP ist die Abkürzung für Transmission Control Protocol. Es garantiert zuverlässige Kommunikation zwischen zwei Anwendungen. Wird häufig für Internetprotokolle verwendet, bekannt als TCP/IP.

UDP: UDP ist die Abkürzung für User Datagram Protocol, ein verbindungsloses Protokoll. Stellt Datenpakete bereit, die zwischen Anwendungen gesendet werden sollen.
In diesem Tutorial werden hauptsächlich die folgenden zwei Themen erläutert.

Socket-Programmierung: Dies ist das am weitesten verbreitete Netzwerkkonzept und wurde ausführlich erklärt

URL-Verwaltung: Dieser Teil wird an anderer Stelle besprochen. Klicken Sie hier, um mehr über die URL-Verarbeitung in der Java-Sprache zu erfahren.

Socket-Programmierung

Sockets bieten einen Kommunikationsmechanismus zwischen zwei Computern über TCP. Das Client-Programm erstellt einen Socket und versucht, eine Verbindung zum Socket des Servers herzustellen.

Wenn die Verbindung hergestellt ist, erstellt der Server ein Socket-Objekt. Der Client und der Server können nun kommunizieren, indem sie in das Socket-Objekt schreiben und daraus lesen.

Die Klasse java.net.Socket stellt einen Socket dar, und die Klasse java.net.ServerSocket stellt einen Mechanismus für Serverprogramme bereit, um auf Clients zu hören und Verbindungen mit ihnen herzustellen.

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

Der Server instanziiert ein ServerSocket-Objekt, das einen Port für die Serverkommunikation darstellt.

Der Server ruft die Methode „accept()“ der Klasse „ServerSocket“ auf, die wartet, bis der Client eine Verbindung zum angegebenen Port auf dem Server herstellt.

Während der Server wartet, instanziiert ein Client ein Socket-Objekt und gibt den Servernamen und die Portnummer an, um eine Verbindung anzufordern.

Der Konstruktor der Socket-Klasse versucht, den Client mit dem angegebenen Server und der angegebenen Portnummer zu verbinden. Wenn die Kommunikation hergestellt ist, wird auf dem Client ein Socket-Objekt erstellt, um mit dem Server zu kommunizieren.

Auf der Serverseite gibt die Methode „accept()“ eine neue Socket--Referenz auf dem Server zurück, die mit dem Socket des Clients verbunden ist.

Nach dem Verbindungsaufbau erfolgt die Kommunikation über I/O-Streams. Jeder Socket verfügt über einen Ausgabestream und einen Eingabestream. Der Ausgabestream des Clients ist mit dem Eingabestream des Servers verbunden, und der Eingabestream des Clients ist mit dem Ausgabestream des Servers verbunden.

TCP ist ein bidirektionales Kommunikationsprotokoll, sodass Daten gleichzeitig über zwei Datenströme gesendet werden können. Im Folgenden finden Sie einen vollständigen Satz nützlicher Methoden, die von einigen Klassen zum Implementieren von Sockets bereitgestellt werden.

Methoden der ServerSocket-Klasse

Die Serveranwendung erhält einen Port mithilfe der Klasse java.net.ServerSocket und wartet auf Clientanforderungen.

Die ServerSocket-Klasse verfügt über vier Konstruktormethoden:

序号 方法描述
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

创建非绑定服务器套接字

Seriennummer
Methodenbeschreibung
1 öffentlicher ServerSocket(int port) löst eine IOException aus Erstellen Sie einen Server-Socket, der an einen bestimmten Port gebunden ist
2 public ServerSocket(int port, int backlog) löst eine IOException aus Erstellen Sie einen Server-Socket mit dem angegebenen Backlog und binden Sie ihn an die angegebene lokale Portnummer
3 öffentlicher ServerSocket (int-Port, int-Backlog, InetAddress-Adresse) löst eine IOException ausErstellt einen Server mit dem angegebenen Port, dem angegebenen Überwachungs-Backlog und der lokalen IP-Adresse für die Bindung
4 public ServerSocket() löst eine IOException ausErstellen Sie einen ungebundenen Server-Socket

Erstellen Sie einen ungebundenen Server-Socket. Wenn die ServerSocket-Konstruktionsmethode keine Ausnahme auslöst , bedeutet dies, dass Ihre Anwendung erfolgreich an den angegebenen Port gebunden wurde und auf Clientanforderungen wartet.

Hier sind einige gängige Methoden der ServerSocket-Klasse:

序号  方法描述
1

 public int getLocalPort()

返回此套接字在其上侦听的端口

2

public Socket accept() throws IOException

侦听并接受到此套接字的连接

3

public void setSoTimeout(int timeout)

通过指定超时值启用/禁用 SO_TIMEOUT,以毫秒为单位

4

public void bind(SocketAddress host, int backlog)

将 ServerSocket 绑定到特定地址(IP 地址和端口号)

Seriennummer

Methode Beschreibung
1
public int getLocalPort()

Gibt den Port zurück, auf dem dieser Socket lauscht

2 public Socket Accept() löst eine IOException aus

Überwachen und akzeptieren Sie diese Socket-Verbindung

3
public void setSoTimeout(int timeout)
序号  方法描述
1

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

创建一个流套接字并将其连接到指定主机上的指定端口号

2

public Socket(InetAddress host, int port) throws IOException

创建一个流套接字并将其连接到指定 IP 地址的指定端口号

3

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

创建一个套接字并将其连接到指定远程主机上的指定远程端口

4

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

创建一个套接字并将其连接到指定远程地址上的指定远程端口

5

public Socket()

通过系统默认类型的 SocketImpl 创建未连接套接字

Aktivieren/deaktivieren durch Angabe des Timeout-Werts SO_TIMEOUT in Millisekunden
4 public void bind(SocketAddress host, int backlog)Binde ServerSocket an eine bestimmte Adresse (IP-Adresse). und Portnummer)
Methoden der Socket-Klasse Das java.net Die .Socket-Klasse stellt den Socket dar, über den sowohl Clients als auch Server miteinander kommunizieren. Der Client erhält ein Socket-Objekt durch Instanziierung, und der Server erhält ein Socket-Objekt über den Rückgabewert der Methode „accept()“. Die Socket-Klasse verfügt über fünf Konstruktionsmethoden.
Seriennummer Methodenbeschreibung
1 public Socket(String host, int port) löst UnknownHostException, IOException aus. Erstellt einen Stream-Socket und verbindet ihn mit der angegebenen Portnummer auf dem angegebenen Host
2 public Socket(InetAddress host, int port) throws IOExceptionErstellt einen Stream-Socket und verbindet ihn mit der angegebenen Portnummer der angegebenen IP-Adresse td>
3 public Socket(String host, int port, InetAddress localAddress, int localPort) löst eine IOException aus >Erstellt einen Socket und verbindet ihn mit dem angegebenen Remote-Port auf dem angegebenen Remote-Host
4 public Socket(InetAddress host, int port, InetAddress localAddress, int localPort) löst eine IOException ausErstellt einen Socket und verbindet ihn mit dem angegebenen Remote-Adressen-Remote-Port
5 public Socket()passed Der Systemstandardtyp von SocketImpl erstellt eine nicht verbundene socket

Wenn der Socket-Konstruktor zurückkehrt, instanziiert er nicht einfach ein Socket-Objekt, sondern versucht tatsächlich, eine Verbindung zum angegebenen Server und Port herzustellen.

Einige interessante Methoden sind unten aufgeführt. Beachten Sie, dass sowohl der Client als auch der Server über ein Socket-Objekt verfügen, sodass sowohl der Client als auch der Server diese Methoden aufrufen können.

序号  方法描述
1

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

将此套接字连接到服务器,并指定一个超时值

2

 public InetAddress getInetAddress()

返回套接字连接的地址

3

 public int getPort()

返回此套接字连接到的远程端口

4

public int getLocalPort()

返回此套接字绑定到的本地端口

5

 public SocketAddress getRemoteSocketAddress()

 返回此套接字连接的端点的地址,如果未连接则返回 null

6

public InputStream getInputStream() throws IOException

返回此套接字的输入流

7

public OutputStream getOutputStream() throws IOException

返回此套接字的输出流

8

public void close() throws IOException

关闭此套接字

Seriennummer

Methodenbeschreibung
1
public void connect(SocketAddress host, int timeout) throws IOException

Verbinden Sie diesen Socket mit dem Server und geben Sie einen Timeout-Wert an

2 public InetAddress getInetAddress()
序号 方法描述
1

static InetAddress getByAddress(byte[] addr)

在给定原始 IP 地址的情况下,返回 InetAddress 对象

2

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

根据提供的主机名和 IP 地址创建 InetAddress

3

static InetAddress getByName(String host)

在给定主机名的情况下确定主机的 IP 地址

4

String getHostAddress()

返回 IP 地址字符串(以文本表现形式)

5

String getHostName() 

获取此 IP 地址的主机名

6

static InetAddress getLocalHost()

返回本地主机

7

 String toString()

将此 IP 地址转换为 String

Gibt die Adresse der Socket-Verbindung zurück
3 public int getPort()Zu dieser Menge zurückkehren Remote-Port, mit dem die Schnittstelle verbunden ist
4 public int getLocalPort() Gibt den lokalen Port zurück, an den dieser Socket gebunden ist
5 public SocketAddress getRemoteSocketAddress() Gibt die Adresse des Endpunkts zurück, der mit diesem Socket verbunden ist, oder null, wenn nicht verbunden
6 public InputStream getInputStream() throws IOExceptionGibt den Eingabestream dieses Sockets zurück
7 public OutputStream getOutputStream() throws IOExceptionGibt den Ausgabestream dieses Sockets zurück
8 public void close() löst eine IOException ausDiesen Socket schließen
Methoden der InetAddress-KlasseDiese Klasse repräsentiert das Internet Protocol (IP) Adresse. Im Folgenden finden Sie eine Liste der nützlicheren Methoden für die Socket-Programmierung: Seriennummer
Methodenbeschreibung
1 statisch InetAddress getByAddress(byte[] addr)Angegeben die ursprüngliche IP-Adresse, Rückgabe InetAddress-Objekt
2 statisch InetAddress getByAddress(String host, byte[] addr)Erstellt eine InetAddress basierend auf dem angegebenen Hostnamen und der IP-Adresse
3 static InetAddress getByName(String host)Bestimmen Sie den Host anhand der IP-Adresse des Hostnamens
4 String getHostAddress( )Rückgabe der IP-AdresseString (ausgedrückt als Textform)
5 String getHostName() Holen Sie sich den Hostnamen dieser IP-Adresse
6 td>statische InetAddress getLocalHost()Lokalen Host zurückgeben
7 String toString()Konvertieren Sie diese IP-Adresse in String

Socket-Client-Instanz

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

// 文件名 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-Instanz

Das folgende GreetingServer-Programm ist eine serverseitige Anwendung, die Socket verwendet, um einen bestimmten Port abzuhören.

// 文件名 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 obigen Java-Code und führen Sie den folgenden Befehl aus, um den Dienst unter Verwendung der Portnummer 6066 zu starten:

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

Öffnen wie folgt: Kunde:

$ 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!

[Verwandte Empfehlungen]

1.Kostenloses Java-Video-Tutorial

2. Video-Tutorial zur Implementierung von Bildminiaturansichten in gleichen Proportionen in Java

3.Alibaba Java Development Manual

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Netzwerkprogrammier-Sockets. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn