0

単一のポートで、マルチキャスト、UDP、およびTCPトラフィックをリッスンしたいと思います。(私のLAN上で)何かが検出された場合、UDP経由でも応答したいと思います。

コードは以下で機能しますが、マルチキャスト検出の場合のみです。while(true)ループは、main()から間違いなくそれを実行しています。

しかし、私は別のプロトコル検出方法を追加することで壁にぶつかっています。単一のアプリケーションで、複数のプロトコルで複数のソケットを開くことができますか?糸脱毛についての私の限られた知識だと確信していますが、誰かが私のしゃっくりを下で見ることができるかもしれません。

public class LANPortSniffer  {

  private static void autoSendResponse() throws IOException {

     String sentenceToSend = "I've detected your traffic";
     int PortNum = 1234;

     DatagramSocket clientSocket = new DatagramSocket();
     InetAddress IPAddress = InetAddress.getByName("192.168.1.121");
     byte[] sendData = new byte[1024];

     sendData = sentenceToSend.getBytes();
     DatagramPacket sendPacket = 
       new DatagramPacket(sendData, sendData.length, IPAddress, PortNum);
     clientSocket.send(sendPacket);
     clientSocket.close();


  }//eof autoSendResponse


  private static void MulticastListener() throws UnknownHostException {

     final InetAddress group = InetAddress.getByName("224.0.0.0");
     final int port = 1234;

     try {

       System.out.println("multi-cast listener is started......"); 
       MulticastSocket socket = new MulticastSocket(port);
       socket.setInterface(InetAddress.getLocalHost());
       socket.joinGroup(group);

       byte[] buffer = new byte[10*1024];

       DatagramPacket data = new DatagramPacket(buffer, buffer.length);

       while (true) {
          socket.receive(data);

           // auto-send response
           autoSendResponse();

       }


      } catch (IOException e) {
         System.out.println(e.toString());
      }

  }//eof MulticastListener

// this method is not even getting launched
private static void UDPListener() throws Exception {

    DatagramSocket serverSocket = new DatagramSocket(1234);
    byte[] receiveData = new byte[1024];

    System.out.println("UDP listener is started......"); 
    while(true)
       {
          DatagramPacket receivePacket = 
                new DatagramPacket(receiveData, receiveData.length);
          serverSocket.receive(receivePacket);
          String sentence = new String( receivePacket.getData());
          System.out.println("UDP RECEIVED: " + sentence);

       }    

}



    public static void main(String[] args) throws Exception {
            //Schedule a job for the event-dispatching thread:
            //creating and showing this application's GUI.
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI(); 
                }
             });


            try {
            MulticastListener();

        } catch (UnknownHostException e) {

            e.printStackTrace();
        }


           // this does not appear to be detected:
            try {
            UDPListener();

        } catch (Exception e) {

            e.printStackTrace();
        }


    }
}//eof LANPortSniffer

main()で、単純なUDPListener()メソッドのために、2番目のtry/catchを追加してみました。
しかし、Eclipseでアプリケーションを実行すると無視されるようです。

main()メソッドは1回の試行/キャッチのみを許可しますか?

一言で言えば、マルチキャスト、UDP、およびTCPパケットをすべて同時に1つのポートでリッスンしたいと思います。これは可能ですか?

4

2 に答える 2

2

ここでスレッドの問題に陥ります。Javaの理解にブラッシュアップする必要があると思います。呼び出すMulticastListener()と、接続が失敗するまでそのブロックを離れることはありません。連続 while ループがあります。これらのアクティビティごとに新しいスレッドを作成する必要があります。

Thread t = new Thread(new Runnable() { 
   public void run() {
         MulticastListener();
   }
}
t.start();

ただし、スレッド化されたプログラムの実装を開始する前に、プログラム フローの理解と、よりオブジェクト指向のアプローチの使用についてよくお読みになることをお勧めします。

于 2012-12-20T17:24:38.150 に答える
0

1) MulticastListener では得られない raw ソケット アクセスが必要です。2) Java でプロミスキャス モードと raw ソケットを検索します。3) スレッド化の問題は無関係です - それらはより良いリアクティブ パフォーマンスを提供するだけです - コードを改善する前に 1 つのスレッドで動作させることをお勧めします。

于 2014-03-30T00:33:20.620 に答える