Devo inviare un pacchetto UDP e ottenere una risposta dal server UDP. Ho pensato che UDP fosse analogo a un java.net.DatagramPacket in Java, ma la documentazione di DatagramPacket sembra essere quella di inviare un pacchetto ma non recuperare nulla, è questa la cosa giusta da usare o dovrei usare java. net.SocketÈ necessario inviare un pacchetto UDP e ricevere una risposta in Java
risposta
Esempio di UDP datagram invio e la ricezione (source):
import java.io.*;
import java.net.*;
class UDPClient
{
public static void main(String args[]) throws Exception
{
BufferedReader inFromUser =
new BufferedReader(new InputStreamReader(System.in));
DatagramSocket clientSocket = new DatagramSocket();
InetAddress IPAddress = InetAddress.getByName("localhost");
byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
String sentence = inFromUser.readLine();
sendData = sentence.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
clientSocket.send(sendPacket);
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
String modifiedSentence = new String(receivePacket.getData());
System.out.println("FROM SERVER:" + modifiedSentence);
clientSocket.close();
}
}
Questo sembra buono, ma uno non sembra essere una lunghezza del pacchetto definita per il server, cioè non penso che la lunghezza del pacchetto del pacchetto restituito dal server sia sempre la stessa quindi devo solo assicurarmi che il receiveData il buffer è abbastanza grande da gestire la dimensione del pacchetto più grande possibile. –
Sì. UDP è un protocollo inaffidabile ed è usato raramente per inviare grandi quantità di dati su di esso. Tuttavia, una volta ricevuto il pacchetto, è possibile leggere la quantità effettiva di byte contenuti da 'DatagramPacket.getLength()'. – bezmax
'receivePacket.getData()' non contiene solo i dati ricevuti. Contiene anche la parte inutilizzata del buffer. Per ottenere una stringa con i dati ricevuti usa 'new String (receivePacket.getData(), 0, receivePacket.getLength(), StandardCharsets.UTF_8)' e modifica il set di caratteri in base a ciò che ti aspetti. –
Devi utilizzare un DatagramPacket e un DatagramSocket. Quando si invia un pacchetto si invia semplicemente un pacchetto. Tuttavia, quando si riceve un pacchetto è possibile ottenere un pacchetto che è stato inviato da un altro programma (ad esempio i server di risposta)
http://docs.oracle.com/javase/7/docs/api/java/net/DatagramSocket.html
Socket è solo per le connessioni TCP.
La documentazione Java non copre come scrivere un client e un server.
http://docs.oracle.com/javase/tutorial/networking/datagrams/clientServer.html
si vuole guardare al DatagramSocket#receive
È proprio la distinzione tra i socket UDP e TCP.
UDP viene trasmesso, mentre TCP con java.net.Socket è punto a punto. UDP è fire-and-forget, analogo alla pubblicazione di un messaggio su un argomento JMS.
Vedere: http://docs.oracle.com/javase/tutorial/networking/datagrams/index.html
UDP non viene trasmesso. Broadcast è una cosa a livello IP. – OrangeDog
UDP è un datagramma. Non si ottiene nulla indietro a meno che il destinatario non risponda qualcosa. È lo stesso con una presa TCP. Se ci dici cosa vuoi fare, forse? – Erik
Ok il server esiste già (non è stato scritto da me) dovrebbe restituire qualcosa quando gli mando un pacchetto ma come faccio a ricevere il pacchetto che manda indietro? –
la prima domanda è: il server restituisce udp? Se è così, è necessario leggere dal proprio socket UDP attraverso il metodo Datagram.receive(). – Erik