现在有一个类KWICServer一直运行,但是突然死掉。Monitor进程通过连接1001端口监视KWICServer的状态,当发现KWICServer死掉时,需要重新建立KWICServer进程,并让KWICServer中的main方法开始执行。有办法吗?
急急急!!!多谢各位指点代码如下:
public class KWICServer {
private static final int PORT = 1001; // 每个KWIC实例处理一个客户请求,并发执行。
public static void main(String[] args) throws IOException {
System.out.println("Server started...");
ServerSocket server = new ServerSocket(PORT);
try {
// 将每一个请求生成的socket分给一个KWIC线程
while (true) {
Socket sock = server.accept();
Runnable kwic = new KWIC(sock);
Thread t = new Thread(kwic);
t.start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}public class Monitor {
private static final int PORT = 1001; public static void main(String[] args) {
Monitor mnt = new Monitor();
while (true) {
try {
Socket sock = new Socket("localhost", PORT);
} catch (IOException e) {
System.out.println("server wrong..............");
Process p = mnt.startProcess();
}
try {
TimeUnit.SECONDS.sleep(3);// 每隔3秒监听一次server进程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public void startProcess() {
Process p = null;// Process代表一个进程对象
try {
//!!!!!!!!!!!!!!!!!!!!!!!!问题在这儿
p = Runtime.getRuntime().exec(
"F:\\programming\\KWIC\\src\\kwic2\\KWICServer.java");
} catch (Exception e) {
e.printStackTrace();
}
}
}
急急急!!!多谢各位指点代码如下:
public class KWICServer {
private static final int PORT = 1001; // 每个KWIC实例处理一个客户请求,并发执行。
public static void main(String[] args) throws IOException {
System.out.println("Server started...");
ServerSocket server = new ServerSocket(PORT);
try {
// 将每一个请求生成的socket分给一个KWIC线程
while (true) {
Socket sock = server.accept();
Runnable kwic = new KWIC(sock);
Thread t = new Thread(kwic);
t.start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}public class Monitor {
private static final int PORT = 1001; public static void main(String[] args) {
Monitor mnt = new Monitor();
while (true) {
try {
Socket sock = new Socket("localhost", PORT);
} catch (IOException e) {
System.out.println("server wrong..............");
Process p = mnt.startProcess();
}
try {
TimeUnit.SECONDS.sleep(3);// 每隔3秒监听一次server进程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public void startProcess() {
Process p = null;// Process代表一个进程对象
try {
//!!!!!!!!!!!!!!!!!!!!!!!!问题在这儿
p = Runtime.getRuntime().exec(
"F:\\programming\\KWIC\\src\\kwic2\\KWICServer.java");
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 将每一个请求生成的socket分给一个KWIC线程
while (true) {
Socket sock = server.accept();
Runnable kwic = new KWIC(sock);
Thread t = new Thread(kwic);
t.start();
}
} catch (Exception e) {
e.printStackTrace();
} 上面代码的try-catch块最好放在while循环里面,这样即使抛出异常循环也不会停止,也就不会影响到下一个网络连接的处理了哦
把方法弄明白再写代码。
exec是执行一条命令,F:\\programming\\KWIC\\src\\kwic2\\KWICServer.java这个算是一条命令么?
应该是(如果你没引用jre以外的包的话):
java F:\\programming\\KWIC\\src\\kwic2\\KWICServer
如果引用了其他的包,你还要写别的参数。
建议你先在dos下把这个命令调试通过了,再copy到这里来。
你这句代码不报错么?startProcess是没有返回值的。
你确定你的server停止运行了么?
把Runtime.getRuntime().exec的异常信息贴出来看看。
p.getInputStream()就能得到命令启动的输出信息。
另外,server采用Ctrl+C的方式强行结束的。请指点。public class Monitor {
private static final int PORT = 1001; public static void main(String[] args) {
Monitor mnt = new Monitor();
while (true) {
try {
Socket sock = new Socket("localhost", PORT);
} catch (IOException e) {
System.out.println("server wrong..............");
mnt.startProcess();
}
try {
TimeUnit.SECONDS.sleep(3);// 每隔3秒监听一次server进程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public void startProcess() {
Process p = null;// Process代表一个进程对象
try {
p = Runtime.getRuntime().exec(
"F:\\programming\\KWIC\\src\\kwic2\\KWICServer.java");
} catch (Exception e) {
e.printStackTrace();
}
}
}
另外,server采用Ctrl+C的方式强行结束的。请指点。 public class Monitor {
private static final int PORT = 1001; public static void main(String[] args) {
Monitor mnt = new Monitor();
while (true) {
try {
Socket sock = new Socket("localhost", PORT);
} catch (IOException e) {
System.out.println("server wrong..............");
mnt.startProcess();
}
try {
TimeUnit.SECONDS.sleep(3);// 每隔3秒监听一次server进程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public void startProcess() {
Process p = null;// Process代表一个进程对象
try {
p = Runtime.getRuntime().exec(
"java F:\\programming\\KWIC\\bin\\kwic2\\KWICServer");
} catch (Exception e) {
e.printStackTrace();
}
}
}
你可在程序运行一定的时间后,在程序中中断Server进程。
若还是不行,你把KWIC的代码发给我。我试试。
p = Runtime.getRuntime().exec( "java -cp F:\\programming\\KWIC\\bin\\ kwic2.KWICServer");
你可以采用这种方式。
命令的完整意思是把那个bin加入classpath,然后在这些classpath下找kwic2包中的KWICServer类,执行之。
java不在默认包下的类在使用java命令执行时需要制定类和classpath。你试试看还有问题吗?
还有多谢 bayougeng 的多次的指点。