这是一个servlet监听器,Tomcat启动时会自动执行contextInitialized方法,关闭时会自动执行contextDestroyedpublic class HostListenerServlet extends HttpServlet implements
ServletContextListener {
private String localHostIP = ""; //本机IP
private String remoteHostIP = ""; //主服务器IP
Server s = new Server();;

public void contextInitialized(ServletContextEvent sce) {
localHostIP = XMLManager.getInstance().getHostIP();
System.out.println("本机IP:" + localHostIP);
remoteHostIP = XMLManager.getInstance().getRemoteIP();
System.out.println("主服务器IP:" + remoteHostIP); if(localHostIP.equals(remoteHostIP)) {
System.out.println("本机是主服务器!"); 
System.out.println("等待客户机注册...");
//开始监听是否有其它机子连接过来
s.setRegister(true);
s.start();
} else {
//向主服务器注册
new Thread(new Client(localHostIP, remoteHostIP)).start();
System.out.println(localHostIP + "向主服务器注册成功");
}
}

public void contextDestroyed(ServletContextEvent sce) {
System.out.println("服务器正在退出...");
//注销ip
try {
if(localHostIP.equals(remoteHostIP)) {
//主机关闭,通知其他机子安全退出
System.out.println("主服务器正在关闭..");
System.out.println("通知其他服务器关闭..");
} else {
//发送自己IP到主服务器注销
s.setRegister(false);
s.setLogout(true);
new Thread(new Client(localHostIP, remoteHostIP)).start();
s.setRegister(true);
}
} catch(Exception e) {
System.out.println("不能注销" + localHostIP);
}
}
服务器端代码public class Server { ServerSocket ss = null;
Socket s = null;
DataInputStream dis = null;
DataOutputStream dos = null;
private int port = 6666;
String executeFlag = "";

boolean register = false;
boolean logout = false;

public void start() {
try {
ss = new ServerSocket(port);
while(true) {

if(register) { //注册
s = ss.accept();
HostRegister p = new HostRegister(s);
Thread t = new Thread(p);
t.start();
}
if(logout) { //注销
System.out.println("logout");
s = ss.accept();
HostLogout p = new HostLogout(s);
Thread t = new Thread(p);
t.start();
}
}
}catch (BindException e) {
System.out.println("端口:" + port + "已被占用,请关闭相应程序");
} catch (IOException e) {
System.out.println("不能监听端口:" + port);
e.printStackTrace();
} finally {
try {
if(dis != null)
dis.close();
if(s != null)
s.close();
if(ss != null)
ss.close();
} catch (IOException e) {
System.out.println("不能关闭相关资源");
e.printStackTrace();
}
}
}

class HostRegister implements Runnable {
private Socket s;

public HostRegister(Socket s) {
this.s = s;
} public void run() {
//取得IP,并将其插入nethost.xml文件
try {
dis = new DataInputStream(s.getInputStream());
String hostip = dis.readUTF();
XMLManager.getInstance().insertHostIP(hostip);
} catch (IOException e) {
e.printStackTrace();
}

}
} class HostLogout implements Runnable {
private Socket s;

public HostLogout(Socket s) {
this.s = s;
} public void run() {
try {
dis = new DataInputStream(s.getInputStream());
String hostip = dis.readUTF();
XMLManager.getInstance().deleteHostIP(hostip);
logout = false; //回到注册线程
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
//new Thread(new Server()).start();
}
public void setRegister(boolean register) {
this.register = register;
}
public void setLogout(boolean logout) {
this.logout = logout;
}
}
客户端代码public class Client implements Runnable {

Socket s = null;
private int port = 6666;//服务器端端口
private String remotehostIP = "";
private String localhostIP = "";
DataOutputStream dos = null;

public Client(String executeFlag, String remotehostIP) {
this.localhostIP = executeFlag;
this.remotehostIP = remotehostIP;
} public void run() {
try {
s = new Socket(remotehostIP, port);
dos = new DataOutputStream(s.getOutputStream());
dos.writeUTF(localhostIP);
} catch (UnknownHostException e) {
System.out.println("找不到主机");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
dos.close();
s.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}现在的问题是,启动Tomcat能够执行register那块,,但是tomcat关闭时,还是执行register的那一块,换句话说就是执行不到logout那一块。。小弟懵懂,,希望大侠能够帮帮忙。。

解决方案 »

  1.   


     if(localHostIP.equals(remoteHostIP)) {
           System.out.println("本机是主服务器!"); 
           System.out.println("等待客户机注册...");
                //开始监听是否有其它机子连接过来
                s.setRegister(true);
                s.start();
       }这句有问题。 s是Server,而Server的start方法 里有句while(true)无限循环。在启动初始化时就卡在while(true)这! 所以一直没有初始化成功[成功的标志就是contextInitialized(ServletContextEvent sce) 执行的结束] 因此你关闭tomcat的时候就不会掉contextDestroyed方法,原因就是因为没有初始化成功。说的绕了点,不知道你能不能理解。呵呵~建议你将Server继承Thread类或者实现Runnable接口。Server的start()方法放到线程run方法里。
    在s.setRegister(true); 后,对Server另启个线程,让初始化方法正常结束。这样应该就ok了!
      

  2.   


     oooO ↘┏━┓ ↙ Oooo 
     ( 踩)→┃你┃ ←(死 ) 
      \ ( →┃√┃ ← ) / 
      \_)↗┗━┛ ↖(_/ 
      

  3.   


     oooO ↘┏━┓ ↙ Oooo 
     ( 踩)→┃你┃ ←(死 ) 
      \ ( →┃√┃ ← ) / 
      \_)↗┗━┛ ↖(_/ 
      

  4.   

           //发送自己IP到主服务器注销
                                s.setRegister(false);
                    s.setLogout(true);
                    new Thread(new Client(localHostIP, remoteHostIP)).start();
                    s.setRegister(true);
    s.setLogout(true);
    Thread.sleep(100);//让当前现成休眠一下吧
      

  5.   

    好久都没看 Socket、线程相关问题,忘得差不多了 
    学习!