我正在尝试使用Java创建一个程序,该程序一次只能运行一个实例。 我正在使用Sockets和ServerSockets来尝试实现这一目标。
该计划应如何运作:
main方法将检查是否已经传递了任何参数,它会尝试将第一个参数写入服务器,如果失败则意味着这意味着这是唯一正在运行的实例,因此它将打开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) {
}
}
}
尽管此代码的一半有效(一次只运行一个实例),但只传递第一组数据,然后程序停止读取。在程序关闭之前,如何让套接字监听?
答案 0 :(得分:1)
我的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)。
同样在你的main()中添加:
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.
}
在程序终止时,您的套接字将自动关闭。此外,如果要显式关闭套接字,可以添加一个关闭钩子来关闭它。 一个简单的钩子看起来像这样。
Runtime.getRuntime().addShutdownHook(your thread that will close sockets);