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

So konfigurieren Sie einfach mehrere Server in Nginx

1: Ich werde nicht näher auf die Installation von...

Detaillierte Erklärung des virtuellen DOM und des Diff-Algorithmus in React

Die Rolle des virtuellen DOM Zunächst müssen wir ...

Zwei Ideen zur Implementierung der horizontalen Datenbanksegmentierung

Einführung Aufgrund der zunehmenden Popularität v...

So aktivieren Sie den Fernzugriff in Docker

Docker-Daemon-Socket Der Docker-Daemon kann über ...

Zusammenfassung der Anwendungsbereiche von Kubernetes

Kubernetes ist aufgrund seiner Anwendungsportabil...

CentOS 7.9 Installations- und Konfigurationsprozess von zabbix5.0.14

Inhaltsverzeichnis 1. Grundlegende Umgebungskonfi...

Implementierung des HTML-Gleit- und Schwebeball-Menüeffekts

CSS-Stile html,Text{ Breite: 100 %; Höhe: 100%; R...

Die neueste Installations- und Konfigurationsmethode für MySQL-5.7.21

1. Entpacken Sie das heruntergeladene MySQL-Kompr...

CSS implementiert problemlos Container auf Blockebene mit festem Verhältnis

Beim Entwerfen eines H5-Layouts werden Sie normal...

JS verwendet die Methode „reduce()“, um Baumstrukturdaten zu verarbeiten

Inhaltsverzeichnis Definition Grammatik Beispiele...

Wie man mit React elegant CSS schreibt

Inhaltsverzeichnis 1. Inline-Stile 2. Importmetho...

Vue implementiert einfache Kommentarfunktion

In diesem Artikel wird der spezifische Code von V...