Ich habe versucht, UDP mit Java zu kommunizieren

Ich habe untersucht, wie man UDP-Kommunikation mit Java macht. Ich wusste, wie man "DatagramSocket" benutzt, aber dieses Mal habe ich untersucht, wie man java.nio benutzt.

Erhalten

Schreiben wir zunächst den zu empfangenden Code, vorausgesetzt, Sie wissen, dass die UDP-Nachricht gesendet wird.

//UDP-Kanal erstellen
DatagramChannel channel = DatagramChannel.open();

//Empfangen Sie UDP-Nachrichten an Port 9999
channel.socket().bind(new InetSocketAddress(9999));

//Bereiten Sie einen Puffer zum Empfangen von Nachrichten vor.
//Wenn die Nachricht größer als der Puffer ist, wird die nicht passende Nachricht verworfen.
ByteBuffer buf = ByteBuffer.allocate(453);
buf.clear();

//Warten Sie, bis die Nachricht empfangen wurde
channel.receive(buf);

//Datenbyte[]Empfangen an
buf.flip();
byte[] data = new byte[buf.limit()];
buf.get(data);

Senden

Als nächstes schreiben wir den Code des Absenders.

//UDP-Kanal erstellen
DatagramChannel channel = DatagramChannel.open();
//Senden Sie UDP-Nachrichten von Port 9999
channel.socket().bind(new InetSocketAddress(9999));

//Machen Sie die zu sendenden Daten in Form von ByteBuffer.
//Hier String->byte[]->In ByteBuffer konvertiert.
String newData = "New String to write to file..." + System.currentTimeMillis();

ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes());
buf.flip();

//Senden
int bytesSent = channel.send(buf, new InetSocketAddress("127.0.0.1", 41234));

Es ist das gleiche, ob Sie empfangen oder senden, bis Sie einen "DatagramChannel" erstellen und den Socket binden. Konvertieren Sie dann den Inhalt, den Sie senden und empfangen möchten, in "ByteBuffer" und tauschen Sie ihn aus. Ich möchte selbst ein Low-Level-Protokoll implementieren! Wenn dies nicht der Fall ist, kann es meiner Meinung nach für allgemeine Zwecke verwendet werden, um den Inhalt der Nachricht mit einer Methode wie JSON in eine Zeichenfolge umzuwandeln und als "String" -> "Byte []" -> "ByteBuffer" zu senden. .. Für die Kommunikation zwischen Java-Anwendungen ObjectInputStream und ObjectOutputStream Es ist auch möglich, beliebige Objekte mit (/io/ObjectOutputStream.html) direkt auszutauschen.

Bitte beachten Sie, dass UDP nicht garantiert, dass die Nachricht die andere Partei wie TCP ordnungsgemäß erreicht. ** Es wird also kein Fehler verursacht, auch wenn sie nicht eintrifft. ** Daher kann es schwierig sein, festzustellen, ob Sie beim Debuggen einen Fehler in Ihrem Code gemacht haben.

Sonderedition

Mit Node.js ist das Senden und Empfangen von UDP übrigens so einfach.

Erhalten


const dgram = require('dgram');
const server = dgram.createSocket('udp4');

server.on('message', (msg, rinfo) => {
  console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});

//Warten Sie auf den Empfang an Port 9999
server.bind(9999);

Senden


const dgram = require('dgram');
const server = dgram.createSocket('udp4');

server.send('Hello', 9999, '127.0.0.1', (err, bytes) => {
  console.log(err, bytes)
});

Beim Debuggen des UDP-Nachrichten sendenden / empfangenden Teils einer Java-Anwendung kann es zweckmäßig sein, ein Testprogramm für das temporäre Senden von Nachrichten in Node.js zu schreiben.

Recommended Posts

Ich habe versucht, UDP mit Java zu kommunizieren
Ich habe versucht, mit Java zu interagieren
Ich habe versucht, OpenCV mit Java + Tomcat zu verwenden
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
Ich habe versucht, den Block mit Java zu brechen (1)
[Java] JSON-Kommunikation mit Jackson
Ich habe DI mit Ruby versucht
Ich habe versucht, Java REPL zu verwenden
Ich habe UPSERT mit PostgreSQL ausprobiert.
Ich habe BIND mit Docker ausprobiert
Ich habe versucht, Metaprogrammierung mit Java
[Java 11] Ich habe versucht, Java auszuführen, ohne mit Javac zu kompilieren
Ich habe versucht, mit OCR eine PDF-Datei mit Java zu verarbeiten
Ich habe versucht, Sterling Sort mit Java Collector zu implementieren
Ich habe versucht, mit Chocolatey eine Java8-Entwicklungsumgebung zu erstellen
Ich habe versucht, JOOQ mit Gradle zu verwenden
[K8s] Ich habe versucht, zwischen Pods zu kommunizieren!
Ich habe eine morphologische Analyse mit MeCab versucht
Ich habe das Java-Framework "Quarkus" ausprobiert.
Ich habe versucht, die Java8 Stream API zu verwenden
Was ich mit Java Gold gelernt habe
Ich habe versucht, JWT in Java zu verwenden
Ich habe GraphQL mit Spring Boot ausprobiert
Versuchen Sie die bidirektionale Kommunikation mit gRPC Java
Ich habe versucht, das Java-Lernen zusammenzufassen (1)
Ich habe Flyway mit Spring Boot ausprobiert
Was ich mit Java Silver gelernt habe
Ich habe jetzt versucht, Java 8 zusammenzufassen
Ich habe versucht, eine PDF-Datei mit Java part2 zu verarbeiten
Ich habe versucht, Slim mit Scaffold anzupassen
Ich habe versucht, die CameraX-Bibliothek mit Android Java Fragment zu verwenden
Ich habe versucht, Java Memo LocalDate zu verwenden
Ich habe versucht, Google HttpClient von Java zu verwenden
Ich habe versucht, eine Android-Anwendung mit MVC zu erstellen (Java)
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
Ich habe versucht, Realm mit Swift UI zu verwenden
Ich habe Cassandras Object Mapper für Java ausprobiert
Ich habe versucht, Java-Lambda-Ausdrücke zusammenzufassen
Java9 war enthalten, also habe ich jshell ausprobiert.
Ich habe versucht, mit Web Assembly zu beginnen
Ich habe versucht, Scalar DL mit Docker zu verwenden
Ich habe das neue Yuan-Problem in Java ausprobiert
Hinweise zur HTTP-Kommunikation mit Java (OkHttp)
Ich habe versucht, OnlineConverter mit SpringBoot + JODConverter zu verwenden
Ich habe mit Studyplus zeitsparendes Management-Lernen versucht.
Ich habe versucht, ein wenig mit BottomNavigationView zu spielen ①
Ich habe Lazy Initialization mit Spring Boot 2.2.0 ausprobiert
Ich habe Googles Aufnahmeprüfung (inoffiziell) [Java] ausprobiert.
Ich habe es mit Spring versucht.
Ich habe versucht, Tomcat zu setzen
Ich habe youtubeDataApi ausprobiert.
Ich habe versucht, ① umzugestalten
Ich habe FizzBuzz ausprobiert.
Ich habe JHipster 5.1 ausprobiert
Ich habe versucht, Java einfach auf meinen Mac zu bringen
Ich habe versucht, AdoptOpenJDK 11 (11.0.2) mit dem Docker-Image zu überprüfen
Ich habe versucht, die Federbeinkonfiguration mit Coggle zu verwalten
Ich habe versucht, Anmeldeinformationen mit JMX zu verwalten
Java Ich habe versucht, einen einfachen Block zu brechen