0

そのポートでサーバーを起動する以外に、Dart でポートを「ロック」することは可能ですか。つまり、ポートはセマフォとして機能していると思います。あるいは、同じ結果を達成する別の方法はありますか?

この問題の解決策を求める質問を投稿したところ、Fox32 は特定のポートでサーバーを起動し、プログラムの別のインスタンスが既に実行されているかどうかを判断することを提案しました。実際に実行中かどうかではなく、実際の処理を開始する最初のインスタンスを決定する必要があり、そのソリューションは機能します。

その解決策はうまく機能しますが、よりカスタマイズされた解決策が必要であるように私には思えます。コード例は次のとおりです。

/*
 * Attempt to connect to specific port to determine if first process.
 */
async.Future<bool> fTestIfFirstInstance() {

  async.Completer<bool> oCompleter = new async.Completer<bool>();

  const String S_HOST = "127.0.0.1"; // ie: localhost 
  const int    I_PORT = 8087;

  HttpServer.bind(S_HOST, I_PORT).then((oHtServer) {
    ogHtServer = oHtServer;        // copy to global
    oCompleter.complete(true);     // this is the first process
    return;
  }).catchError((oError) {
    oCompleter.complete(false);    // this is NOT the first process
    return;
  });
  return oCompleter.future;
}
4

2 に答える 2

1

これは多くの場合、グローバルまたはユーザーごとのロックに応じて、'/tmp/my_program.lock' または '~/.my_program.lock' などのファイルを使用して行われます。

私はダーツインは次のように簡単です:

bool isRunning() {
  return new File(lockPath).existsSync();
}

起動:

void createLock() {
  if (isRunning()) throw "Lock file '$lockPath' exists, program may be running";
  new File(lockPath).createSync();
}

そして、プログラムを閉じるとき:

void deleteLock() {
  new File(lockPath).deleteSync();
}

プログラムが終了すると HttpServer は閉じられますが、ファイルは削除されないことに注意してください。これは、ファイルの作成時にプログラムの PID をロック ファイルに書き込み、PID が で有効かどうかを確認することで回避できますisRunning。生きていない場合は、ファイルを削除して false を返します。

于 2013-08-10T19:55:52.827 に答える
0

これ (RawServerSocket) が HttpServer ソリューションよりも「優れている」かどうかはわかりませんが、おそらくもっと理にかなっています。

ポートを単に「ロック」してロックを解除する手段は価値があると思います。これは、セマフォ IMHO を使用する優れた手段を提供します。

/*
 * Attempt to connect to specific port to determine if first process.
 */
async.Future<bool> fTestIfFirstInstance() {
  async.Completer<bool> oCompleter = new async.Completer<bool>(); 
  RawServerSocket.bind("127.0.0.1", 8087).then((oSocket) {
    ogSocket = oSocket;         // assign to global
    oCompleter.complete(true);
  }).catchError((oError) {
    oCompleter.complete(false);
  });

  return oCompleter.future;
}
于 2013-08-14T00:33:33.077 に答える