単一のポートで、マルチキャスト、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つのポートでリッスンしたいと思います。これは可能ですか?