现在有一个类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();
}
}
}

解决方案 »

  1.   

    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();
    } 上面代码的try-catch块最好放在while循环里面,这样即使抛出异常循环也不会停止,也就不会影响到下一个网络连接的处理了哦
      

  2.   

    p = Runtime.getRuntime().exec("F:\\programming\\KWIC\\src\\kwic2\\KWICServer.java"); 
    把方法弄明白再写代码。
    exec是执行一条命令,F:\\programming\\KWIC\\src\\kwic2\\KWICServer.java这个算是一条命令么?
    应该是(如果你没引用jre以外的包的话):
    java F:\\programming\\KWIC\\src\\kwic2\\KWICServer
    如果引用了其他的包,你还要写别的参数。
    建议你先在dos下把这个命令调试通过了,再copy到这里来。
      

  3.   

    谢谢楼上。说的没错,不过这个进程死了之后如何让monitor把这个server进程重新启动呢?
      

  4.   

    谢谢,这样就不会报错了。不过下次monitor监听时还是显示没有server在监听1001端口。不知为什么,请指教一下。
      

  5.   

    Process p = mnt.startProcess();
    你这句代码不报错么?startProcess是没有返回值的。
    你确定你的server停止运行了么?
    把Runtime.getRuntime().exec的异常信息贴出来看看。
    p.getInputStream()就能得到命令启动的输出信息。
      

  6.   

    我修改了这个错误,把Monitor贴在了下面,这样就不会报错了。但是在Monitor调用startProcess()之后,下一次检测Socket连接时依然显示连接不成功。不知为何?
    另外,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(); 



      

  7.   

    我修改了这个错误,把Monitor贴在了下面,这样就不会报错了。但是在Monitor调用startProcess()之后,下一次检测Socket连接时依然显示连接不成功。不知为何? 
    另外,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(); 


      

  8.   

    先别使用ctrl+c的方式中断。
    你可在程序运行一定的时间后,在程序中中断Server进程。
    若还是不行,你把KWIC的代码发给我。我试试。
      

  9.   

    在public void startProcess()方法里,用下面这个语句: 
    p = Runtime.getRuntime().exec( "java -cp F:\\programming\\KWIC\\bin\\ kwic2.KWICServer"); 
    你可以采用这种方式。
    命令的完整意思是把那个bin加入classpath,然后在这些classpath下找kwic2包中的KWICServer类,执行之。
    java不在默认包下的类在使用java命令执行时需要制定类和classpath。你试试看还有问题吗?
      

  10.   

    #9楼 的修改方法很对,我运行后通过了,而且经测试没有问题。非常感谢!
    还有多谢 bayougeng 的多次的指点。