2011-12-19 3 views
5

UDP 패킷을 보내고 UDP 서버에서 응답을 다시 받아야합니다. UDP는 Java의 java.net.DatagramPacket과 비슷하지만 DatagramPacket에 대한 설명서는 패킷을 보내지 만 아무것도 반환하지 않는 것으로 보입니다. 사용하는 데 올바른지 또는 Java를 사용해야합니까? net.SocketUDP 패킷을 보내고 Java에서 응답을 수신해야합니다.

+2

UDP는 데이터 그램입니다. 수신기가 무언가를 돌려 보내지 않으면 아무 것도 얻을 수 없습니다. 그것은 tcp 소켓과 동일합니다. 니가 원하는 걸 말하면 어쩌면? – Erik

+0

Ok 서버가 이미 존재하지만 (쓰여지지 않음) 패킷을 보낼 때 다시 보내야하지만 다시 보내는 패킷은 어떻게 받습니까? –

+0

첫 번째 질문은 : 서버가 udp를 다시 보냅니 까? 그렇다면 Datagram.receive() 메소드를 통해 자신의 UDP 소켓을 읽어야합니다. – Erik

답변

10

예 :

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

이것은 좋아 보인다,하지만 그 중 하나는 서버에 대해 정의 된 패킷 길이가 될 것, 즉 내가 서버에 의해 반환 된 패킷의 패킷 길이가 항상 같아 보이지 않는 것처럼 보입니다. 그래서 나는 단지 receiveData 버퍼는 가능한 가장 큰 패킷 크기를 처리 할만큼 충분히 큽니다. –

+0

예. UDP는 신뢰할 수없는 프로토콜이며, 대량의 데이터를 전송하는 데 거의 사용되지 않습니다. 그러나, 패킷이 수신 된 후에,'DatagramPacket.getLength()'에서 포함 된 실제 바이트 수를 읽을 수 있습니다. – bezmax

+2

'receivePacket.getData()'에는 수신 된 데이터 만 포함되어 있지 않습니다. 여기에는 버퍼의 사용되지 않은 부분도 포함됩니다. 수신 된 데이터로 문자열을 얻으려면'new String (receivePacket.getData(), 0, receivePacket.getLength(), StandardCharsets.UTF_8)'을 사용하고 charset을 원하는 것으로 조정하십시오. –

2

DatagramPacket과 DatagramSocket을 사용해야합니다. 패킷을 보낼 때 패킷 만 보내면됩니다. 당신이 패킷을받을 때 당신은

http://docs.oracle.com/javase/7/docs/api/java/net/DatagramSocket.html

소켓은 TCP 연결만을위한 것입니다 (예를 들어, 서버가 응답) 다른 프로그램에서 전송 된 패킷을 얻을 수 있습니다. UDP 데이터 그램을 보내고 (source)를 수신

관련 문제