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

Zusammenfassung der Blockelemente, Inline-Elemente und variablen Elemente

Blockelement p - Absatz Text vorformatieren Tisch ...

Div adaptive Höhe füllt automatisch die verbleibende Höhe

Szenario 1: HTML: <div Klasse="äußere&quo...

So stellen Sie ElasticSearch in Docker bereit

1. Was ist ElasticSearch? Elasticsearch wird eben...

Tutorial zum Erstellen eines CA-Zertifikats unter Linux Centos8

Installieren der erforderlichen Dateien Yum insta...

Sammlung gemeinsamer DIV-Attribute

1. Immobilienliste Code kopieren Der Code lautet w...

Detaillierte Erklärung der Linux-RPM- und Yum-Befehle und -Verwendung

RPM-Paketverwaltung Ein Verpackungs- und Installa...

JS+Canvas zeichnet ein Glücksrad

In diesem Artikel wird der spezifische Code der J...

So invertieren Sie die Implementierung einer Bézierkurve in CSS

Schauen wir uns zunächst einen CSS-Karussell-Anim...

Meta-Tags einfach erklärt

Der META-Tag, umgangssprachlich auch als Tag beze...

So ändern Sie den Inhalt eines vorhandenen Docker-Containers

1. Docker ps listet Container auf 2. Docker cp ko...

Detaillierte Verwendung von React.Children

Inhaltsverzeichnis 1. Reagieren.Children.map 2. R...