- - PR -
プロセスの終了と UDP ポート
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-06-30 13:24
お世話になっております。
プロセスの実行と終了について質問があります。 環境は以下のとおりです。 Windows XP SP2 JRE 1.4.2 アプリケーション起動と同時に UDP ポートを開きます。 (サンプルでは syslog 514 ポート) ユーザがあるメニューを選択してプロセスを実行します。 (サンプルでは runtime.exec() を利用して Web ブラウザを起動します。) 起動された Web ブラウザは終了しないで、アプリケーションのみ終了する時、 終了処理でプロセスを destroy() せずに終了すると、アプリケーション自体は 終了しているにも関わらず(Web ブラウザは生きてる) 、UDP ポートが開放 されません。 (コマンドプロンプトより netstat -a で確認。) destroy() 処理を行って、アプリケーションの終了と同時に Web ブラウザを 終了すれば、UDP ポートは開放されます。 アプリケーションは終了しても、起動された Web ブラウザは 生かしておいてほしいという要求があり、困っております。 JRE1.4.1 を使用した場合は、同条件で destroy() せずともポートが開放されること を確認しております。 なぜ JRE1.4.2 から変更されたのか。 そもそも Java のバグで修正されただけのことか。 回避策などご存知の方がいらっしゃいましたら、ご教授いただけないでしょうか? よろしくお願いいたします。 ↓↓↓↓↓↓↓↓↓↓↓↓↓以下サンプル↓↓↓↓↓↓↓↓↓↓↓↓↓ import java.net.DatagramSocket; import java.awt.*; import java.awt.event.*; import javax.swing.*; /** *Sample サンプルプログラム<BR> *フレーム生成と同時に syslog 受信 UDP ポート 514 をオープンします。 *メニューからWebブラウザを選択すると Webブラウザをプロセスとして起動します。 *フレームを閉じる際に、ポートの close() 処理を行いますが、プロセスを destroy() *しないと、この Sample 自体は終了するにも関わらず、syslog ポート 514 は *オープンされたままの状態になります。 */ public class Sample extends JFrame { private JMenuBar jMenuBar = new JMenuBar(); private JMenu jMenu = new JMenu("メニュー"); private JMenuItem jMenuItem = new JMenuItem("Web ブラウザ"); private DatagramSocket socket = null; private final int REC_PORT = 514; private Process process = null; private final String WEB_BROWSER = "C:\\Program Files\\Internet Explorer\\iexplore.exe"; /** *コンストラクタ */ public Sample() { try { openSyslogPort(); } catch(Exception e) { System.out.println("ポートオープン失敗。"); return; } this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jMenuItem.addActionListener(new MenuListener()); jMenu.add(jMenuItem); jMenuBar.add(jMenu); this.getContentPane().setLayout(new BorderLayout()); this.getContentPane().add(jMenuBar, BorderLayout.NORTH); this.addWindowListener(new WinListener()); this.setSize(new Dimension(400, 200)); this.setVisible(true); } public static void main(String[] args) { new Sample(); } /** *メニューを選択したときの処理 */ class MenuListener implements ActionListener { public void actionPerformed(ActionEvent e) { try { openWebBrowser(); } catch(Exception ee) { System.out.println("Web ブラウザの起動に失敗。"); } } } /** *フレームを閉じたときの処理 */ class WinListener extends WindowAdapter { public void windowClosing(WindowEvent e){ socket.close(); //このコメントを外せば、ポートは開放されるが、Webブラウザも終了してしまう // process.destroy(); dispose(); } } //syslog 受信ポートを開きます。 private void openSyslogPort() throws Exception { socket = new DatagramSocket(REC_PORT); } //Web ブラウザを起動します。 private void openWebBrowser() throws Exception { Runtime runtime = Runtime.getRuntime(); process = runtime.exec(WEB_BROWSER); } } | ||||
|
投稿日時: 2005-06-30 21:59
limpbizkitさん、こんにちは。
アプリケーションは終了したように見えていても、 ブラウザのプロセスを終了させるまでJREのプロセスも残って いるということはありませんか? # ついでに恐れながら、この場合の UDPポートに関しては #「開放」(open)ではなくて「解放」(free, release)ですね。 | ||||
|
投稿日時: 2005-07-01 13:13
Kissinger さん、ご返答ありがとうございます。
タスクマネージャで確認した限りでは、アプリケーション終了時に、 java.exe は終了しております。 ポートは解放されず。。。です。 "解放" 失礼しました。(^^; | ||||
|
投稿日時: 2005-07-01 14:10
unibon です。こんにちわ。
プロセスが終了してもポートが残っているということが想像しにくいので、いろいろと想像してみたのですが、もしかしたらひょっとしたら、ブラウザーの Java アプレット用の Java と干渉しているのかもしれません。Java アプレットを無効にしたり、JRE(Java PlugIn)をアンインストールしてみたりしてはどうでしょうか。 | ||||
|
投稿日時: 2005-07-01 16:33
unibon さん。こんにちは。
ご返答ありがとうございます。 なるほど!と思い アプレットを無効にしてみる --> 状況変わらず。 Java PlugIn を無効にしてみる --> 状況変わらず。 JRE アンインストール --> 状況変わらず。 でした。 JRE をアンインストールしたので、サンプルを動かすときは 別の PC にインストールされている JRE をディレクトリごと 持ってきて(インストールしないで)、その JRE の java を 直接たたいたので影響は無いとは思っているのですが。 何かほかに試せることは。。と思い、Opera と Firefox で 同サンプルを動かしてみましたが、結果は同じでポートは 解放されませんでした。 | ||||
|
投稿日時: 2005-07-01 17:32
自己レスです。
JRE のバージョンを変えて実行してみました。 1.4 の最新版 JRE1.4.2_08 --> ポート解放されない。 1.5 の最新版 JRE1.5.0_04 --> ポート解放される。 となりました。 1.5 からは以前の 1.4.1 の状態(仕様?)に戻ったと言うことでしょうか。 Kissinger さん、unibon さん、ご意見いただきありがとうございました。 |
1