2011-09-14 33 views
1

Javaプログラムの1つのインスタンスを開くことができるクラスを作成します。これは、ServerSocketを開くデーモンスレッドを使用します。 TCPポートがすでに使用されていた場合は、インスタンス化時に例外がスローされます。予期しないソケットが閉じられることがある(または開かない)

コードは、通常、LinuxおよびWindowsでは動作します。

は、ここで私が使用していたコードされています

public class SingleInstaceHandler extends Thread { 

    private static final Logger log = Logger.getLogger(IEPLC_Tool.class); 
    private boolean finished = false; 

    @SuppressWarnings("unused") 
    private ServerSocket serverSocket; 

    /* 
    * Constructor 
    * Generate the server socket. 
    * If the TCP door was busy throws IOException. 
    */ 
    public SingleInstaceHandler() throws IOException { 
     @SuppressWarnings("unused") 
     ServerSocket serverSocket = new ServerSocket(44331); 
     this.setDaemon(true); 
     this.start(); 
     log.info("Server socket initialized"); //if commented out it works 
    } 

    public void run() { 
     synchronized (this) { 
      while (!finished) { 
       try { 
        log.debug("Server socket goes to sleep"); 
        this.wait(); 
        log.debug("Server socket waken up"); 
       } catch (InterruptedException e) { 
        log.debug("ERROR while sending SocketThread2 in wait status"); 
        e.printStackTrace(); 
        System.exit(-1); 
       } 
       log.info("Server socket end"); 
      } 
     } 
    } 

    public synchronized void shutdown() { 
     log.debug("SingleInstaceHandler shutdown() caled"); 
     finished = true; 
     notifyAll(); 
    } 
} 

は時々、代わりにポートが...任意のアイデアを忙しくされていませんか?


UPPENDEDさらなる試験AFTER:

他の多くのテストを実行しています。ポートが別のSWインスタンスのようなものによって取られた場合、new ServerSocket(44331);は例外をスローしますが、何らかの理由でポートが取得されない場合でも、このリソースを取得できないことがあります。この場合、例外は発生せず、私は自分のアプリケーションで必要なだけ多くのインスタンスを開くことができます。多分私はスレッドを強制的にポートをロックするいくつかの他の操作を行う必要があります...

何か考えですか?

おかげで、

サント

+0

はどのようにソケットが閉じたままであることを診断するのですか?あなたのクラスに未使用のserverSocketフィールドがあるのはなぜですか? –

+0

このコードはわかりません。なぜあなたは 'ServerSocket'をインスタンス変数に格納しないのですか?もう一度アクセスすることはできません。 – home

+0

私はコマンドnetstat -vatn |を使用します。 grep "44331"私はあなたが2つのソリューションを持って使用する同じソフトウェアのインスタンスにしないことを保証したい場合は、通常のアプリケーション – Stefano

答えて

0

は、私は私の質問への答えを投稿して愚かなビットを感じています...よく..私のコードは、把握する私は時間がかかったバグがあります。代わりの

ServerSocket serverSocket = new ServerSocket(44331); 

this.serverSocket = new ServerSocket(44331); 

私は前にそれに気付かなかったが... basicalyバグは、私は、コンストラクタ内のローカルソケットを宣言したということでした。コンストラクタプロシージャが終了したとき、ソケットは解放されたか、Garbadge Collectorに依存しませんでした。行動は全くランダムでした。面白いのは、ロガーを呼ぶ時間が長くても、Garbadgeのコレクターを始めようとしていたということでした。間違いに気づくのにかなり時間がかかりました。待機後

this.serverSocket.close()

は、さらに、それは置く方が良いでしょう。

とにかく助けてください!

乾杯、

サント

0

あなたはそれがGCの対象となるのServerSocketへの参照を保持していないと。 Oracle JDKを使用している場合、ソケットはGCed(java.net.PlainSocketImpl)のときに閉じられます。

問題はテコンストラクタで私が行うということです。

関連する問題