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.
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);
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.
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