私はwhileループでUDPパケットを待ち受ける方法があります。私は彼らが到着すると、別のクラスの別のメソッドを使用してパケットを解析し、アプリケーションの別の部分で各パケットの多くの異なる解析と分析を行います。私はPacketParser
メソッドがループ外のQueueを処理する方が良いと考えています。 Queue
にパケットを追加してから、アプリケーションの別の部分がキューに入り、元のように他のアクションを実行している間、パケットをリッスンして追加することができます待ち行列?私はキューを監視し、パケットを処理する別の機能を持っています。またはStack
を監視するために、Java
に何かがありますか?これを行うより良い方法はありますか?whileループ内でアイテムとしてのキュー項目を処理する
public void read(String multicastIpAddress, int multicastPortNumber) {
PacketParser parser = new PacketParser(logger);
InetAddress multicastAddress = null;
MulticastSocket multicastSocket = null;
final int PortNumber = multicastPortNumber;
try {
multicastAddress = InetAddress.getByName(multicastIpAddress);
multicastSocket = new MulticastSocket(PortNumber);
String hostname = InetAddress.getLocalHost().getHostName();
byte[] buffer = new byte[8192];
multicastSocket.joinGroup(multicastAddress);
System.out.println("Listening from " + hostname + " at " + multicastAddress.getHostName());
int numberOfPackets = 0;
while (true) {
numberOfPackets++;
DatagramPacket datagramPacket = new DatagramPacket(buffer, buffer.length);
multicastSocket.receive(datagramPacket);
// add to queue for another function to process the packets
}
} catch (SocketException socketException) {
System.out.println("Socket exception " + socketException);
} catch (IOException exception) {
System.out.println("Exception " + exception);
} finally {
if (multicastSocket != null) {
try {
multicastSocket.leaveGroup(multicastAddress);
multicastSocket.close();
} catch (IOException exception) {
System.out.println(exception.toString());
}
}
}
}
私は自分のコードを脱脂し、無限ループを持っているように見えます。たぶん 'マルチスレッド化'や 'イベント処理'を試してみてください。 –
私はマルチスレッドを検討することをお勧めします。プロデューサ - コンシューマパターンを使用し、スレッド安全性のためにキューをブロックします。 – Krease
@クリス私はプロデューサー - コンシューマーのパターンについて聞いたことはありません。私はそれをもっと調べるつもりです。ちょっと説明した基本的な記事を見つけました。このパターンは私がしようとしていることを達成するのに役立つと思いますありがとう! https://dzone.com/articles/producer-consumer-pattern –