这是一个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那一块。。小弟懵懂,,希望大侠能够帮帮忙。。
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那一块。。小弟懵懂,,希望大侠能够帮帮忙。。
解决方案 »
- ThreadLocal应用存储客户端请求session的合理性?
- 一个关于java的直接跳转执行的问题,求助编程高手,谢谢!
- swing中组件注册监听器的问题
- 用C/S模式做的JAVA QQ,S端导出JAR包后连不上数据库,连不上1433端口,请高手们支下招吧。。。
- JAVA 查询MYSQL带中文问题
- 求助高手~~~java.lang.NullPointerException
- 内隐类的方法在外部类可以调用吗?(在线等)
- windows 界面移植问题
- 散分先:(菜鸟问题)关于在jsp中调用xml中的数据
- 求救:关于socket
- java2 sdk 1.4 0 是做什么用的啊,也是java的开发工具吗
- parseInt("Kona", 27) returns 411787 请问怎样计算的?
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了!
oooO ↘┏━┓ ↙ Oooo
( 踩)→┃你┃ ←(死 )
\ ( →┃√┃ ← ) /
\_)↗┗━┛ ↖(_/
oooO ↘┏━┓ ↙ Oooo
( 踩)→┃你┃ ←(死 )
\ ( →┃√┃ ← ) /
\_)↗┗━┛ ↖(_/
s.setRegister(false);
s.setLogout(true);
new Thread(new Client(localHostIP, remoteHostIP)).start();
s.setRegister(true);
s.setLogout(true);
Thread.sleep(100);//让当前现成休眠一下吧
学习!