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 解决方案“更好”,但也许它更有意义。

我认为简单地“锁定”端口并解锁端口的方法是值得的。它提供了使用信号量恕我直言的好方法。

/*
 * 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 回答