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

MySQL-Schleife fügt zig Millionen Daten ein

1. Erstellen Sie eine Testtabelle Tabelle `mysql_...

React DVA-Implementierungscode

Inhaltsverzeichnis dva Verwendung von dva Impleme...

Mysql-Abfrageanweisung mit mehreren Bedingungen und dem Schlüsselwort „And“

MySQL-Abfrage mit mehreren Bedingungen und dem Sc...

Anwendungsbeispiele für den Mysql Inner Join (unbedingt lesen)

Grammatikregeln SELECT Spaltenname(n) FROM Tabell...

So erstellen Sie ein php-nginx-alpine-Image von Grund auf in Docker

Obwohl ich bereits einige Projekte in einer Docke...

Implementierungsprinzip und Nutzungsanalyse des Apache Bench-Stresstest-Tools

1: Durchsatz (Anfragen pro Sekunde) Eine quantita...

Fallzusammenfassung zur Vue-Komponentenkommunikationsmethode

Inhaltsverzeichnis 1. Übergeordnete Komponente üb...