UDP DUP-Timeout UPD-Portstatus-Erkennungscodebeispiel

UDP DUP-Timeout UPD-Portstatus-Erkennungscodebeispiel

Ich habe bereits zuvor ein Beispiel geschrieben, ein einfaches UDP-Server- und Client-Beispiel. Darin habe ich beschrieben, dass der Client seinen eigenen Port zum Senden von Daten angeben kann, wenn Sie sich als Client betrachten.

ds.setSoTimeout(5000); ist das Timeout für die Datenerfassung. Wenn es nicht festgelegt ist, bedeutet dies eine Wartezeit, die länger ist als die Wartezeit in Liebesfilmen in Fernsehdramen, und das Ergebnis ist dasselbe, d. h. Sie warten, bis Sie sterben, und hören dann auf zu warten. Diese Zeitüberschreitung kann jedoch nicht als die Zeitüberschreitung Ihrer Anfrage angesehen werden. Bitte beachten Sie dieses Konzept, da diese Zeitüberschreitung nur dazu dient, zu kennzeichnen, dass während dieser Zeit keine Daten aus dem Netzwerk abgerufen wurden. Selbst wenn die Daten abgerufen werden, sind sie möglicherweise nicht Ihre. Sie werden dies verstehen, wenn Sie sich das folgende Beispiel ansehen.

Dann gibt es noch das Portproblem. Wie oben erwähnt, können Sie den Port selbst angeben oder sich selbst als Client behandeln. Wenn Sie Daten senden müssen, erstellen Sie ein Verbindungsobjekt und senden dann Daten. Auf diese Weise ist der Port dynamisch. Dies bedeutet, dass der lokal geöffnete UDP-Port nicht geschlossen wird, solange das DatagramSocket-Objekt nicht neu initialisiert wird oder verschwindet.

Dann gibt es noch das Problem des UDP-Status. Tatsächlich gibt es dazu bereits einen Artikel: „Understanding and Using UDP Connection Objects“. Zustandslos bedeutet, dass diese Verbindung keinen Zustand hat. Niemand weiß, ob sie einen Server hat oder nicht, und niemand weiß, ob der Server tot ist oder nicht. Aber für den lokalen Port gilt: Wenn Ihr DatagramSocket-Objekt immer existiert, dann ist Ihr lokaler Port zustandsbehaftet und aktiv.

Dann machen Sie ein Beispiel:

Pakettest;
importiere java.io.*;
importiere java.net.*;
importiere java.util.Arrays;
/**
 * UDP-Client-Programm, das zum Senden von Daten an den Server und zum Empfangen der Antwortinformationen des Servers verwendet wird */
öffentliche Klasse UdpClientSocket {
	privater Byte[] Puffer = neues Byte[1024];
	privater statischer DatagramSocket ds = null;
	/**
	 * Testen Sie die Methode des Clients zum Senden von Paketen und Empfangen von Antwortinformationen */
	öffentliche statische void main(String[] args) wirft Exception {
		UdpClientSocket-Client = neuer UdpClientSocket();
		Zeichenfolge serverHost = "127.0.0.1";
		int ServerPort = 10002;
		client.send(Server-Host, Server-Port, neues Byte[]{1,2,3,4,5});
		während(wahr){
			byte[] bt = client.empfangen();
			wenn(null != bt && bt.length > 0)
				System.out.println("Empfangene Daten: " + Arrays.toString(bt));
			Thread.sleep(1000);
		}
	}
	/**
	 * Konstruktor, UDP-Client erstellen */
	öffentliche UdpClientSocket() wirft Ausnahme {
		ds = neuer DatagramSocket(8899); // Als Client an lokalen Port binden ds.setSoTimeout(5000);
	}
	/**
	 * Dateninformationen an den angegebenen Server senden */
	public final void send(final String host, final int port, final byte[] bytes) throws IOException {
		DatagramPacket dp = neues DatagramPacket (Bytes, Bytes.Länge, InetAddress.getByName (Host), Port);
		ds.send(dp);
	}
	/**
	 * Vom angegebenen Server zurückgesendete Daten empfangen */
	öffentliches finales byte[] receive() löst Exception aus {
		versuchen {
			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());		
			Daten zurückgeben;
		} Fang (Ausnahme e) {
			e.printStackTrace();
			gibt null zurück;
		}
	}
}

Beim Ausführen wird immer ein Fehler gemeldet:

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 test.UdpClientSocket.receive(UdpClientSocket.java:46)
bei test.UdpClientSocket.main(UdpClientSocket.java:20)
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 test.UdpClientSocket.receive(UdpClientSocket.java:46)
bei test.UdpClientSocket.main(UdpClientSocket.java:20)

Verwenden Sie TCPUDPDbg, um Daten an 8899 zu senden und Sie können Folgendes empfangen:

Empfangene Daten: [16, 17, 18, 19, 20]

Dieses Beispiel wurde geschrieben

1. Der lokale Port ist 8899

2. Das Timeout für den Datenempfang beträgt 5 Sekunden

3. Ein Datensatz wurde an den lokalen Port 10002 gesendet. Wer weiß, ob er empfangen wurde?

4. Kontinuierlich UDP-Daten abrufen, die auf dem lokalen Port 8899 empfangen werden

Dann gefunden

1. Beim Senden von Daten wird kein Fehler gemeldet

2. Die Fehlermeldung "Timeout der Datenerfassung" wird immer angezeigt

3. Verwenden Sie TCPUDPDbg, um Daten an 8899 zu senden und sie können empfangen werden

Zusammenfassen:

1.UDP kann ein Timeout für den Datenempfang angeben, das Timeout für jede Anforderung muss jedoch von Ihnen selbst gesteuert werden

2.UDP kann die lokale Portnummer binden, und dieser Port kann in einem Zustand überleben

3.UDP hat keinen Status, aber lokal kann haben

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:
  • Verwendung und Unterschiedsanalyse von „Ersetzen in“ und „Einfügen in“ beim Update doppelter Schlüssel in MySQL
  • Java-Parallelität AtomicLongFieldUpdater Atomic-Klasse_PowerNode Java Academy
  • Der wirkliche Unterschied zwischen MySQLs Ersetzen in und Einfügen in bei doppeltem Schlüsselupdate
  • MySQL ON DUPLICATE KEY UPDATE-Anweisungsbeispiele
  • insert into … on duplicate key update / replace into Einführung in mehrere Datenzeilen
  • Detaillierte Analyse der MySQL-Syntax „ON DUPLICATE KEY UPDATE“
  • Mehrere Operationen des MySQL-Inserts (DELAYED, IGNORE, ON DUPLICATE KEY UPDATE)

<<:  Der Unterschied zwischen Löschen, Abschneiden und Löschen und wie man wählt

>>:  Detaillierte Beschreibung von Shallow Copy und Deep Copy in js

Artikel empfehlen

Rhit effiziente Visualisierung Nginx-Protokollanzeigetool

Inhaltsverzeichnis Einführung Installieren Anzeig...

Prinzip und Anwendung der MySQL-Master-Slave-Synchronisation

Inhaltsverzeichnis 1. Master-Slave-Synchronisatio...

So verwenden Sie Docker+DevPi zum Erstellen einer lokalen PyPi-Quelle

Vor einiger Zeit musste ich für die Entwicklung h...

Vue implementiert Countdown-Funktion

In diesem Artikelbeispiel wird der spezifische Co...

SQL-Fuzzy-Abfragebericht: ORA-00909: Lösung: Ungültige Anzahl von Parametern

Bei Verwendung einer Oracle-Datenbank für Fuzzy-A...

Natives JS zum Erzielen eines Schiebeknopfeffekts

Der spezifische Code des mit Js erstellten Schieb...

Schritte zur Installation von MySQL mit Docker unter Linux

Als Tester müssen Sie während des Lernprozesses h...

jQuery realisiert den Effekt der Sitzplatzauswahl und -reservierung im Theater

jQuery realisiert den Effekt der Sitzplatzauswahl...

So stellen Sie FastDFS in Docker bereit

Installieren Sie Fastdfs auf Docker Mount-Verzeic...

Lösung zur Bereinigung des Docker-Festplattenspeichers

Vor einiger Zeit stieß ich auf das Problem, dass ...