2011-12-19 11 views
5

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

+2

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

+0

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? –

+0

la prima domanda è: il server restituisce udp? Se è così, è necessario leggere dal proprio socket UDP attraverso il metodo Datagram.receive(). – Erik

risposta

10

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(); 
    } 
} 
+0

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. –

+0

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

+2

'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. –

2

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.