Java - UDP和多播检测

时间:2012-12-20 17:17:04

标签: java tcp udp multicast

在单个端口上,我想监听多播,UDP和TCP流量。 (在我的局域网上) 如果检测到某些内容,我也想通过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()中,我尝试添加第二个try / catch,用于简单的UDPListener()方法 但是当我在Eclipse中运行应用程序时,它似乎被忽略了。

main()方法是否只允许一次try / catch?

简而言之,我想同时在单个端口上侦听多播,UDP和TCP数据包。这可能吗?

2 个答案:

答案 0 :(得分:2)

您在此处遇到线程问题。我认为你需要了解Java。当您致电MulticastListener()时,它将永远不会离开该块,直到您的连接失败。它有一个连续的while循环。您需要为每个活动创建一个新线程。

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

但是,在您开始尝试实现线程化程序之前,我建议您阅读您对程序流程的理解以及使用更面向对象的方法。

答案 1 :(得分:0)

1)您将需要原始套接字访问,而MulticastListener无法获得该访问权限。 2)在Java中查找混杂模式和原始套接字。 3)线程问题是无关紧要的 - 它们只会给你更好的反应性能 - 建议你在改进代码之前使用一个线程。