2011-12-19 28 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

UDPデータグラムの例送信と受信(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

これはうまく見えますが、サーバーに定義されたパケット長ではないようです。すなわち、サーバーから返されたパケットのパケット長が常に同じではないと思います。つまり、receiveDataバッファーは最大の可能なパケットサイズを処理するのに十分な大きさです。 –

+0

はい。 UDPは信頼性の低いプロトコルであり、大量のデータをその上に送信することはめったにありません。しかし、パケットが受信された後、 'DatagramPacket.getLength()'から実際に含まれているバイト数を読み取ることができます。 – bezmax

+2

'receivePacket.getData()'には、受信したデータだけでなく、これには、バッファの未使用部分も含まれています。受信したデータでStringを取得するには、 'new String(receivePacket.getData()、0、receivePacket.getLength()、StandardCharsets.UTF_8)'を使用し、文字セットを期待どおりに調整します。 –

2

DatagramPacketとDatagramSocketを使用する必要があります。パケットを送信すると、パケットが送信されます。あなたがパケットを受信したときしかし、あなたは

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

ソケットは、TCP接続のためだけである(例えば、サーバが応答する)別のプログラムから送信されたパケットを取得することができます。

2

を見てみたいです。

UDPはブロードキャストされますが、java.net.SocketのTCPはポイントツーポイントです。 UDPは火災と忘れがあり、JMSトピックにメッセージを公開するのと同じです。

参照:http://docs.oracle.com/javase/tutorial/networking/datagrams/index.html

+0

UDPはブロードキャストされていません。ブロードキャストはIPレベルのものです。 – OrangeDog

関連する問題