特定のポートを介して一連のファイルを複数のコンピューターに送信する必要があります。実際には、ファイルを送信するメソッドが呼び出されるたびに、宛先データ (アドレスとポート) が計算されます。したがって、メソッド呼び出しごとにスレッドを作成するループを使用し、BindException の try-catch ステートメントでメソッド呼び出しを囲み、既に使用されているポートを使用しようとするプログラムの状況を処理します (宛先アドレスが異なると、同じポートを介してメッセージを受信する) スレッドに、数秒待ってから再起動して再試行し、例外がスローされなくなる (配送が正常に実行される) まで試行を続けるように指示します。理由はわかりませんでした (最初に見たときは推測できましたが)、Netbeans は、ループ内で Thread オブジェクトをスリープ状態にすることは最善の選択ではないことを警告しました。これは別のスタックオーバーフローの投稿へのリンクで、とても面白そうでした (私はThreadPoolExecutor クラスについて聞いたことがありませんでした)。プログラムを改善するために、そのリンクと API の両方を読んでいますが、それを自分のプログラムにどのように適用すればよいか、まだよくわかりません。誰でもこれについて手を差し伸べてもらえますか?
編集:重要なコード:
for (Iterator<String> it = ConnectionsPanel.list.getSelectedValuesList().iterator(); it.hasNext();) {
final String x = it.next();
new Thread() {
@Override
public void run() {
ConnectionsPanel.singleAddVideos(x);
}
}.start();
}
private static void singleAddVideos(String connName) {
String newVideosInfo = "";
for (Iterator<Video> it = ConnectionsPanel.videosToSend.iterator(); it.hasNext();) {
newVideosInfo = newVideosInfo.concat(it.next().toString());
}
try {
MassiveDesktopClient.sendMessage("hi", connName);
if (MassiveDesktopClient.receiveMessage(connName).matches("hello")) {
MassiveDesktopClient.sendMessage(newVideosInfo, connName);
}
} catch (BindException ex) {
MassiveDesktopClient.println("Attempted to use a port which is already being used. Waiting and retrying...", new Exception().getStackTrace()[0].getLineNumber());
try {
Thread.sleep(MassiveDesktopClient.PORT_BUSY_DELAY_SECONDS * 1000);
} catch (InterruptedException ex1) {
JOptionPane.showMessageDialog(null, ex1.toString(), "Error", JOptionPane.ERROR_MESSAGE);
}
ConnectionsPanel.singleAddVideos(connName);
return;
}
for (Iterator<Video> it = ConnectionsPanel.videosToSend.iterator(); it.hasNext();) {
try {
MassiveDesktopClient.sendFile(it.next().getAttribute("name"), connName);
} catch (BindException ex) {
MassiveDesktopClient.println("Attempted to use a port which is already being used. Waiting and retrying...", new Exception().getStackTrace()[0].getLineNumber());
try {
Thread.sleep(MassiveDesktopClient.PORT_BUSY_DELAY_SECONDS * 1000);
} catch (InterruptedException ex1) {
JOptionPane.showMessageDialog(null, ex1.toString(), "Error", JOptionPane.ERROR_MESSAGE);
}
ConnectionsPanel.singleAddVideos(connName);
return;
}
}
}