Prinzipanalyse des UDP-Verbindungsobjekts und Anwendungsbeispiele

Prinzipanalyse des UDP-Verbindungsobjekts und Anwendungsbeispiele

Ich habe zuvor zum Einstieg in UDP ein einfaches UDP-Server- und Client-Beispiel geschrieben, aber bei der tatsächlichen Verwendung ist ein Problem aufgetreten!

Beim letzten Mal habe ich das Verbindungsobjekt DatagramSocket auch als statisch geschrieben und es bei der Initialisierung der Klasse verwendet. Es wird jedoch an vielen Stellen im System verwendet. Muss ich weiterhin Objekte dieser Klasse erstellen?

Sie können dies tun, es hat jedoch Konsequenzen und die Konsequenz ist ein Speicherüberlauf.

UDP ist zustandslos. DatagramSocket muss nur einmal erstellt werden, um auf einen Port an einer bestimmten Adresse zu verweisen, ohne jedes Mal neu erstellt werden zu müssen.

Da UDP zustandslos ist, erstellen Sie beim Erstellen eines DatagramSocket-Objekts nur ein Objekt, das auf das Netzwerk zeigt, so als würden Sie einen großen Lautsprecher in eine bestimmte Richtung aufstellen, aber nicht wissen, ob jemand in dieser Richtung zuhört.

Auch wenn Sie keinen laufenden Server haben, ist es kein Problem, ein Verbindungsobjekt zu erstellen und Daten an diese Adresse zu senden. Es ist nichts, wenn Sie mit einem Lautsprecher in eine bestimmte Richtung schreien und niemand zuhört! Sollten Sie allerdings keine Antwort erhalten, wenn Sie eine benötigen, wird nach einer Zeitüberschreitung ein Fehler gemeldet!

Paket udp; 
 
importiere java.net.*; 
 
/** 
 * @Beschreibung UDP-Client-Programm, das zum Senden von Daten an den Server und zum Empfangen der Antwortinformationen des Servers verwendet wird * @author cuisuqiang 
 * @version 1.0 
 * @since <a href="mailto:[email protected]" rel="external nofollow" >[email protected]</a> 
 */ 
öffentliche Klasse UdpClientSocket { 
  /** 
   * Verbindungsobjekt */ 
  privater statischer DatagramSocket ds = null; 
  /** 
   * Adressobjekt */ 
  private statische SocketAddress-Adresse = null; 
   
  /** 
   * Testen Sie die Methode des Clients zum Senden von Paketen und Empfangen von Antwortinformationen*/ 
  öffentliche statische void main(String[] args) wirft Exception { 
    init(); 
    während(wahr){ 
      UdpClientSocket.send(address,"Hallo, Liebling!".getBytes()); 
      UdpClientSocket.receive(); 
      versuchen { 
        Thread.sleep(3 * 1000); 
      } Fang (Ausnahme e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
   
  /** 
   * Initialisiere die Verbindung und Adresse */ 
  öffentliche statische Leere init(){ 
    versuchen { 
      ds = neuer DatagramSocket(8899); // Als Client an lokalen Port binden ds.setSoTimeout(2 * 1000); 
      Adresse = neue InetSocketAddress("127.0.0.1",3344); 
    } Fang (Ausnahme e) { 
      e.printStackTrace(); 
    } 
  } 
   
  /** 
   * Dateninformationen an den angegebenen Server senden */ 
  öffentliche statische void send(SocketAddress Adresse,Byte[] Bytes){ 
    versuchen { 
      DatagramPacket dp = neues DatagramPacket(Bytes, Bytes.Länge, Adresse); 
      ds.send(dp); 
    } Fang (Ausnahme e) { 
      e.printStackTrace(); 
    } 
  } 
 
  /** 
   * Vom angegebenen Server zurückgesendete Daten empfangen*/ 
  öffentliche statische Leere empfangen(){ 
    versuchen { 
      byte[] Puffer = neues Byte[1024]; 
      DatagramPacket dp = neues DatagramPacket(Puffer, Pufferlänge); 
      ds.empfangen(dp);    
      byte[] Daten = neues byte[dp.getLength()]; 
      System.arraycopy(dp.getData(), 0, Daten, 0, dp.getLength());  
      System.out.println("Serverantwortdaten: " + new String(data)); 
    } Fang (Ausnahme e) { 
      e.printStackTrace(); 
    } 
  } 
}

Die Ergebnisse der Ausführung des Codes sind wie folgt:

java.net.SocketTimeoutException: Zeitüberschreitung beim Empfang
bei java.net.PlainDatagramSocketImpl.receive0 (native Methode)
bei java.net.PlainDatagramSocketImpl.receive(PlainDatagramSocketImpl.java:136)
bei java.net.DatagramSocket.receive(DatagramSocket.java:712)
bei udp.UdpClientSocket.receive(UdpClientSocket.java:69)
bei udp.UdpClientSocket.main(UdpClientSocket.java:28)

Bei der Operation kam es zu einer Zeitüberschreitung, der Fehler wurde jedoch nicht beim Erstellen der Objekte und Senden der Daten verursacht, sondern durch eine Zeitüberschreitung beim Empfangen der Daten!

Dieses Programm läuft weiter, lasst uns einen Server erstellen:

Paket udp;

importiere java.net.DatagramPacket;
importiere java.net.DatagramSocket;
importiere java.net.InetSocketAddress;
importiere java.net.SocketAddress;

/**
 * @Beschreibung der UDP-Dienstklasse * @Autor cuisuqiang
 * @version 1.0
 * @since [email protected]
 */
öffentliche Klasse UdpServerSocket {
	
	privater statischer DatagramSocket ds = null;
	private statische SocketAddress-Adresse = null;
	
	/**
	 * Testmethode */
	öffentliche statische void main(String[] args) wirft Exception {
		init();
		System.out.println("---->Dienst beginnt zu lauschen!<----");
		während (wahr) {
			UdpServerSocket.receive();
			UdpServerSocket.response(address,"Hallo, hast du gegessen?");
		}		
	}
	
	öffentliche statische Leere init(){
		versuchen {
			ds = neuer DatagramSocket(3344);
			ds.setSoTimeout(0);
			Adresse = neue InetSocketAddress("127.0.0.1",8899);
		} Fang (Ausnahme e) {
			e.printStackTrace();
		}
	}

	/**
	 * Datenpakete empfangen. Diese Methode führt zu einer Blockierung des Threads */
	öffentliche statische Leere empfangen() {
		versuchen {
			byte[] Puffer = neues Byte[1024];
			DatagramPacket-Paket = neues DatagramPacket (Puffer, Pufferlänge);
			ds.receive(Paket);
			String-Info = neuer String (Paket.getData(), 0, Paket.getLength());
			System.out.println("Informationen erhalten: " + info);
		} Fang (Ausnahme e) {
			e.printStackTrace();
		}
	}

	/**
	 * Senden Sie das Antwortpaket an den Anforderer */
	öffentliche statische void-Antwort (SocketAddress-Adresse, String-Info) {
		versuchen {
			DatagramPacket dp = neues DatagramPacket(info.getBytes(), info.getBytes().Länge, Adresse);
			dp.setData(info.getBytes());
			ds.send(dp);
		} Fang (Ausnahme e) {
			e.printStackTrace();
		}		
	}
}

Nach dem Ausführen kann der Client normal Daten senden und empfangen!

Bei tatsächlicher Verwendung lege ich ein Systemstartelement fest, um das Init-Verbindungsobjekt und die Adresse zu initialisieren, und erfasse dann die Ausnahme bei der Verwendung!

Wenn Ihr Verbindungsobjekt jedes Mal erstellt und häufig verwendet wird, stürzt das System normalerweise innerhalb weniger Minuten ab!

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Codebeispiel für einen einfachen UDP-Server-Client
  • Detaillierte Erklärung der Python UDP-Programmierung
  • C#-Beispielcode mit TCP/UDP-Protokoll
  • Beispielanalyse eines Java-Netzwerks basierend auf einem UDP-Chat-Programm
  • Beispielcode für simulierte UDP-Kommunikation in Java
  • Python implementiert ein UDP-Programmkommunikationsprozessdiagramm
  • Python implementiert die Dateiübertragung unter dem UDP-Protokoll
  • Beispielanalyse für Java UDP-Kommunikationsclient und -server

<<:  JavaScript-Array-Deduplizierungslösung

>>:  Der Unterschied zwischen zwei MySQL-Anweisungen zum Löschen von Benutzern (Benutzer löschen und Benutzer löschen)

Artikel empfehlen

Prozessdiagramm zur Implementierung der Zabbix WEB-Überwachung

Nehmen Sie als Beispiel die WEB-Schnittstelle von...

Implementierungsschritte zur Installation eines Redis-Containers in Docker

Inhaltsverzeichnis Redis auf Docker installieren ...

So löschen Sie Dateinamen oder Verzeichnisse mit Sonderzeichen in Linux

Löschen einer Datei anhand ihrer Inode-Nummer Ver...

Erste Schritte mit MySQL - Konzepte

1. Was ist das? MySQL ist das beliebteste relatio...

So zeigen Sie JSON-Daten auf einer HTML-Seite an und formatieren sie

JSON-Daten werden auf der HTML-Seite angezeigt un...

Nexus nutzt API für den Betrieb

Nexus bietet RestApi, aber einige APIs müssen noc...

Detaillierte Erklärung der 10 häufigsten HTTP-Statuscodes

Der HTTP-Statuscode ist ein dreistelliger Code, d...

Schritte zum Übertragen von Dateien und Ordnern zwischen zwei Linux-Servern

Heute habe ich mich mit der Migration eines Proje...

Elementui exportiert Daten in XLSX- und Excel-Tabellen

Kürzlich habe ich vom Vue-Projekt erfahren und bi...

JavaScript-Grundlagen: Geltungsbereich

Inhaltsverzeichnis Umfang Globaler Umfang Funktio...

Teilen Sie einen auf Ace basierenden Markdown-Editor

Ich denke, Editoren lassen sich in zwei Kategorie...

MySQL verwendet SQL-Anweisungen zum Ändern von Tabellennamen

In MySQL können Sie die SQL-Anweisung „rename tab...