私は現在Javaの宿題に取り組んでいます。基本的な DNS サーバーを作成するように求められました。ポート 53 でリッスンするスレッドである UDPSender クラスがあります。UDPManager と呼ばれる別のスレッドもあります。
UDPManager は、DatagramPacket の ArrayList を保持するネストされた実行可能なクラスでスレッドを開始します。UDPSender は UDPManager を集約し、UDP パケットを受信するたびにそれをマネージャーに送信して、彼がそれを arrayList に追加できるようにします。
import java.net.DatagramPacket;
import java.util.ArrayList;
import java.util.HashMap;
public class UDPManager {
private UDPManagerRunnable manager;
public UDPManager(String hostsFile, String remoteDNS, boolean localResolution) {
manager = new UDPManagerRunnable(hostsFile, remoteDNS, localResolution);
new Thread(manager).start();
}
public void managePacket(DatagramPacket p) {
manager.managePacket(p);
}
public void close() {
manager.close();
}
private class UDPManagerRunnable implements Runnable {
private ArrayList<DatagramPacket> packets;
private HashMap<Integer, String> clients;
private boolean localResolution;
private boolean running;
private String hostsFile;
private String remoteDNS;
public UDPManagerRunnable(String hostsFile, String remoteDNS, boolean localResolution) {
packets = new ArrayList<DatagramPacket>();
clients = new HashMap<Integer, String>();
this.localResolution = localResolution;
this.running = true;
this.hostsFile = hostsFile;
this.remoteDNS = remoteDNS;
}
public void managePacket(DatagramPacket p) {
packets.add(p);
System.out.println("Received packet. "+packets.size());
}
public void close() {
running = false;
}
public void run() {
DatagramPacket currentPacket = null;
while(running) {
if(!packets.isEmpty()) {
currentPacket = packets.remove(0);
byte[] data = currentPacket.getData();
int anCountValue = data[Constant.ANCOUNT_BYTE_INDEX];
if(anCountValue == Constant.ANCOUNT_REQUEST)
this.processRequest(currentPacket);
else if(anCountValue == Constant.ANCOUNT_ONE_ANSWER)
this.processResponse(currentPacket);
}
}
}
private void processRequest(DatagramPacket packet) {
System.out.println("it's a request!");
}
private void processResponse(DatagramPacket packet) {
System.out.println("it's a response!");
}
}
}
これが UDP マネージャーです。System.out.println が「Received packet」を正しく表示するので、パケットはマネージャに正しく送信されます。配列のサイズは増加します。私が直面している問題は、「run()」内でサイズが大きくならないことです。奇妙なことは、デバッグで完全に正常に動作することです。なぜこのように振る舞うのか分かりますか?
どうもありがとうございました。