除了在该端口上启动服务器之外,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;
}
答案 0 :(得分: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写入锁定文件来解决,并在isRunning
中检查PID是否处于活动状态。如果它不活动,请删除该文件并返回false。
答案 1 :(得分:0)
我不确定这个(RawServerSocket)是否更好&#34;然而,与HttpServer解决方案相比,它可能更有意义。
我认为这意味着简单地锁定&#34;港口和解锁港口是值得的。它提供了使用信号量恕我直言的好方法。
/*
* 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;
}