在单个端口上,我想监听多播,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数据包。这可能吗?
答案 0 :(得分:2)
您在此处遇到线程问题。我认为你需要了解Java。当您致电MulticastListener()
时,它将永远不会离开该块,直到您的连接失败。它有一个连续的while循环。您需要为每个活动创建一个新线程。
Thread t = new Thread(new Runnable() {
public void run() {
MulticastListener();
}
}
t.start();
但是,在您开始尝试实现线程化程序之前,我建议您阅读您对程序流程的理解以及使用更面向对象的方法。
答案 1 :(得分:0)
1)您将需要原始套接字访问,而MulticastListener无法获得该访问权限。 2)在Java中查找混杂模式和原始套接字。 3)线程问题是无关紧要的 - 它们只会给你更好的反应性能 - 建议你在改进代码之前使用一个线程。