2012-05-11 29 views
16
私はここに、クライアントからサーバにUDPパケットを送信するプログラムを作った

は、送信機コードJavaを使用してUDPパケットを送受信しますか?

import java.io.IOException; 
import java.net.*; 

/** 
* 
* @author hp 
*/ 
public class JavaApplication9 { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) throws UnknownHostException, SocketException, IOException { 
     // TODO code application logic here 
     byte[] buffer = {10,23,12,31,43,32,24}; 
     byte [] IP={-64,-88,1,106}; 
     InetAddress address = InetAddress.getByAddress(IP); 
     DatagramPacket packet = new DatagramPacket(
       buffer, buffer.length, address, 57 
       ); 
     DatagramSocket datagramSocket = new DatagramSocket(); 
     datagramSocket.send(packet); 
     System.out.println(InetAddress.getLocalHost().getHostAddress()); 


    } 
} 

受信コード機能は、私はWireSharkのプログラムを使用していた

public void run(){ 

    try{ 
     DatagramSocket serverSocket = new DatagramSocket(port); 
     byte[] receiveData = new byte[8]; 
     byte[] sendData = new byte[8]; 

     while(true) 
      { 
       DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
       serverSocket.receive(receivePacket); 
       String sentence = new String(receivePacket.getData()); 
       System.out.println("RECEIVED: " + sentence); 
       InetAddress IPAddress = receivePacket.getAddress(); 
       String sendString = "polo"; 
       sendData = sendString.getBytes(); 
       DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); 
       serverSocket.send(sendPacket); 
      } 
    }catch (Exception e){ 
    } 
} 

です。 UDPパケットは受信者のWireSharkプログラムで受信されますが、Javaプログラムはそれを認識せず、プログラムはポートをリッスンして何も起こりません。

+0

あなたはサーバーが右のポートをリッスンしていますか? – elias

+0

'address'が正しくなければ、' port'は57で、このコードは最初の 'receive()'呼び出しでブロックされます。 – EJP

+3

IPアドレスを負の数で表現しないでください。バカバカしい。実際のオクテット値を書き、キャストを使用します。 – EJP

答えて

28

受信者は送信者のDatagramPacketで設定されたポートと一致するように受信者のポートを設定する必要があります。デバッグするには、ポート> 1024(8000または9000など)でリッスンしてみてください。ポート< 1024は通常、システムサービスで使用され、そのようなポートでバインドするには管理者アクセス権が必要です。

受信者がリッスンしているハードコードされたポート(ポート57など)にパケットを送信し、送信者が同じマシンにある場合は、受信者自身にループバックを作成します。パケットから指定されたポートを常に使用してください。そのような場合を防ぐためには、プロダクションソフトウェアの場合にはチェックが必要です。

パケットが宛先に到達しない別の理由は、送信者に指定された間違ったIPアドレスです。 UDPとは異なり、アドレスに到達できず、送信者がエラー指示を受信しなくても、パケットを送信しようとします。これは、デバッグのための予防措置として、受信者のアドレスを印刷することで確認できます。

は、設定送信者の場合:

byte [] IP= { (byte)192, (byte)168, 1, 106 }; 
InetAddress address = InetAddress.getByAddress(IP); 

をが、文字列形式のアドレスを使用する方が簡単かもしれません。つまり

InetAddress address = InetAddress.getByName("192.168.1.106"); 

を、あなたは192.168.1.106と目標を設定しました。これが受信機でない場合、あなたはパケットを取得しません。ここで

は動作しますシンプルなUDP受信者の:

import java.io.IOException; 
import java.net.*; 

public class Receiver { 

    public static void main(String[] args) { 
     int port = args.length == 0 ? 57 : Integer.parseInt(args[0]); 
     new Receiver().run(port); 
    } 

    public void run(int port) {  
     try { 
     DatagramSocket serverSocket = new DatagramSocket(port); 
     byte[] receiveData = new byte[8]; 

     System.out.printf("Listening on udp:%s:%d%n", 
       InetAddress.getLocalHost().getHostAddress(), port);  
     DatagramPacket receivePacket = new DatagramPacket(receiveData, 
          receiveData.length); 

     while(true) 
     { 
       serverSocket.receive(receivePacket); 
       String sentence = new String(receivePacket.getData(), 0, 
           receivePacket.getLength()); 
       System.out.println("RECEIVED: " + sentence); 
       // now send acknowledgement packet back to sender  
       InetAddress IPAddress = receivePacket.getAddress(); 
       String sendString = "polo"; 
       byte[] sendData = sendString.getBytes("UTF-8"); 
       DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, 
        IPAddress, receivePacket.getPort()); 
       serverSocket.send(sendPacket); 
     } 
     } catch (IOException e) { 
       System.out.println(e); 
     } 
     // should close serverSocket in finally block 
    } 
} 
+0

これを行う簡単な方法は、応答の要求データグラムを再利用することです。すでにピアアドレス:ポートがあるためです。データをリセットするだけです。アドレスが間違っていてソケットが接続されていると、送信者は実際にエラーを起こします。 – EJP

関連する問題