2011-12-19 11 views
5

Muszę wysłać pakiet UDP i uzyskać odpowiedź z powrotem z serwera UDP. Chociaż UDP było analogiczne do java.net.DatagramPacket w Javie, ale dokumentacja dla DatagramPacket wydaje się, że wysyłasz pakiet, ale nic nie odzyskujesz, czy to jest właściwa rzecz, czy powinienem używać java. net.SocketNależy wysłać pakiet UDP i otrzymać odpowiedź w Javie

+2

UDP to datagram. Nic nie odzyskasz, dopóki odbiorca nie wyśle ​​czegoś z powrotem. Tak samo jest z gniazdem tcp. Jeśli powiesz nam, co chcesz robić, może? – Erik

+0

OK, serwer już istnieje (nie napisany przeze mnie) powinien wysłać coś z powrotem, gdy wyślę pakiet, ale jak mogę otrzymać pakiet, który odsyła? –

+0

Pierwsze pytanie brzmi: czy serwer wysyła udp z powrotem? Jeśli tak, musisz odczytać z własnego gniazda UDP za pomocą metody Datagram.receive(). – Erik

Odpowiedz

10

Przykład datagram UDP wysyłania i odbierania (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

To wygląda dobrze, ale wydaje się, że nie ma zdefiniowanej długości pakietu dla serwera, tzn. Nie sądzę, że długość pakietu zwróconego przez serwer jest zawsze taka sama, więc czy muszę po prostu upewnić się, że receiveData bufor jest wystarczająco duży, aby obsłużyć największy możliwy rozmiar pakietu. –

+0

Tak. Protokół UDP jest zawodnym protokołem i rzadko jest używany do przesyłania dużych porcji danych. Jednak po odebraniu pakietu można odczytać faktyczną ilość bajtów zawartych w 'DatagramPacket.getLength()'. – bezmax

+2

'receivePacket.getData()' nie tylko zawiera odebrane dane. Zawiera też nieużywaną część bufora. Aby uzyskać ciąg z odebranymi danymi, użyj 'new String (receivePacket.getData(), 0, receivePacket.getLength(), StandardCharsets.UTF_8)' i dostosuj zestaw znaków do tego, czego oczekujesz. –

Powiązane problemy