我正在使用给定的client.jar编写聊天室应用程序。我的主要工作是编写服务器。然后我可以在命令窗口中运行server.jar,如果我想设置第二个服务器,我将打开另一个命令窗口并再次运行server.jar。这是我的简要代码:
public class Server {
public static void main(String args[]) {
/*Read the parameter,such as IP address and port from config file
Each line in the file represents a server*/
// Code: Get the parameter for setting serverSocket...
/*Here I want to use a ServerInfo class to store
name of all the activated server, it has an attribute
'ArrayList<String> list', every time before set
up the server, firstly add server name to the list*/
ServerInfo.getInstance().list.add(server name);
try {
// set up the serversocket
while(true) {
// listening to the client
}
} catch {
// other codes
}
}
}
对于ServerInfo
类,我使用单例来获取其实例,这样每次我都可以将服务器名称添加到同一个ArrayList
问题就出现了。在我第一次运行server.jar之后,我可以成功地为列表添加一个名称,但是,当我再次运行server.jar来设置另一个服务器时,方法getInstance()
不起作用,看起来像创建ServerInfo
类的新实例,并将第二个服务器名称添加到此新实例的Arraylist
。所以我无法将所有名称添加到同一实例的ArrayList
中。
无论如何要处理这个问题?
答案 0 :(得分:0)
首先,您运行server.jar两次。这会创建两个不同的java进程和而不是线程。这里,由于两个进程(2 server.jar进程)之间没有进程间通信,因此无法共享对象。它们被视为一个独立的。
需要非常仔细地考虑在两个不同的服务器实例之间共享对象。
例如:假设您有2个不同的服务器来处理您网站的请求,当用户登录您的网站时,您希望共享会话对象在两台服务器之间,如果一台服务器发生故障,另一台服务器可以处理正在进行的请求。因此,用户不会获得任何内部服务器异常。
可以通过在托管域模式下使用某些应用服务器(如 JBoss AS)来实现此方案。
有关Jboss AS托管域模式的更多详细信息,请检查此项 https://docs.jboss.org/author/display/AS7/Operating+modes