Java:我如何才能创建一个应用程序,只有当它的一个实例不存在时才会启动,并在实例存在的情况下调用该实例?
问题描述:
我想用Java创建一个程序,一次只能运行一个它的实例。 我正在使用套接字和服务器套接字尝试实现此目的。Java:我如何才能创建一个应用程序,只有当它的一个实例不存在时才会启动,并在实例存在的情况下调用该实例?
程序应该如何工作:
主要方法将检查是否有任何参数都已经过去了,它会尝试的第一个参数写入服务器,如果失败这意味着,这意味着这是唯一运行的实例,所以它将打开ServerSocket并启动框架。如果它没有失败,那么应用程序已经运行,所以它应该发送字符串,另一个实例应该能够读取并处理它。
这里的主要方法:
public static void main(String[] args) {
String fileName = null;
if (args.length >= 1) {
fileName = args[0];
}
if (Singleton.sendSignal(fileName)) {
Frame.getFrame().open(fileName);
Singleton.checkInput();
}
}
而这里的服务器类:
public class Singleton {
private static final int portNumber = 4243;
private static ServerSocket serverSocket;
private static Socket clientSocket;
private static Socket echoSocket;
public static boolean sendSignal() {
try {
echoSocket = new Socket(InetAddress.getLocalHost().getHostName(), portNumber);
PrintWriter out = new PrintWriter(echoSocket.getOutputStream(), true);
out.write("Open\n");
out.close();
close();
return false;
} catch (Exception e) {
close();
return true;
}
}
public static void checkInput() {
try {
renewReader();
} catch (Exception e) {
close();
}
}
public static void renewReader() throws Exception {
serverSocket = new ServerSocket(portNumber);
clientSocket = serverSocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String inputLine = in.readLine();
if (inputLine.equals("Open")) {
Widget.getInstance().setVisible(true);
}
close();
renewReader();
}
public static void close() {
try {
serverSocket.close();
} catch (Exception e) {
}
try {
clientSocket.close();
} catch (Exception e) {
}
try {
echoSocket.close();
} catch (Exception e) {
}
}
}
虽然半这段代码的工作(只有一个实例同时运行),只有第一套数据正在传递,然后程序停止阅读。如何让套接字听,直到程序关闭?
答
我你checkInput()方法,你曾经在这里接受客户端的连接。尝试是这样的:
public static void checkInput()
{
//do something here
serverSocket = new ServerSocket(portNumber);
//wait for request from client.
Socket clientSocket = serverSocket.accept();
//
// do your processing here
// call checkInput method again.
checkInput();
}
只要另一个实例它开始,服务器将接受请求,做加工,然后再开始等待更多的请求(此我们再次呼吁cehckInput)。根据计划,您的插座会自动关闭终止
public static void main(String[] args)
{
String fileName = null;
if (args.length >= 1) {
fileName = args[0];
}
if (Singleton.sendSignal(fileName))
{
Frame.getFrame().open(fileName);
// start the server in a thread so that main method can continue on
new Thread()
{
public void run()
{
Singleton.checkInput();
}
}.start();
}
// do your other tasks.
}
在:
而且在main()中添加此。另外如果你想明确地关闭套接字,你可以添加一个关闭钩来关闭它。 一个简单的钩子看起来像这样。
Runtime.getRuntime().addShutdownHook(your thread that will close sockets);
是新的线程有必要吗?该程序工作正常,没有额外的一个。我的意思是什么都没有停顿 –
为了防万一,我添加了线程,就好像你在if()条件后的main()方法中添加了新的代码,它不会执行,因为checkInput()方法是递归调用的。因此,在线程中添加递归方法是明智的。是的,如果你确信之后不会有更多的代码行,你可以忽略线程部分。 –