我有服务器端我试图让它成为Singeltone以便从另一个类中获取服务器metodtds,但是当我运行服务器main然后我从另一个类执行Server.getInstance()
时它会抛出这个期望:
线程中的异常" main" java.net.BindException:已在使用的地址:JVM_Bind
我尝试了很多东西,但它不起作用
private static Server serverinstance = null;
private static Object obj=new Object();
public Server() throws IOException {
server = new ServerSocket(222);
hash = new HashMap<String, SocketData>();
}
public static Server getInstance() throws IOException {
synchronized (obj) {
if (serverinstance == null) {
serverinstance = new Server();
serverinstance.listenServer();
}
return serverinstance;
}
}
private void listenServer() throws IOException {
while (flag) {
ans = server.accept();
if (serverinstance != null)
new EchoThread(serverinstance, ans);
}
}
public static void main(String args[]) throws IOException {
Server.getInstance();
}
Class A()
{
public A()
{
Server.getInstance();
}
}
答案 0 :(得分:0)
尝试重新启动计算机。这是因为另一个程序已经在使用端口222,因此您的程序无法监听它。如果这不起作用,尝试将222切换到不同的东西,例如8000或9999,基本上是1000-65535之间的任何数字(如果你在Windows上,则为0-65535)
答案 1 :(得分:0)
Java singleton仅为每个JVM和每个ClassLoader保证一个实例。
在您的情况下,您通过调用两个单独的Server
方法将相同的main
类加载到两个不同的JVM和类加载器中。这会导致Server
构造函数被调用两次,从而尝试在同一个222端口上创建两个ServerSocket
。
一个快速的解决方案是直接或间接地从调用A
的{{1}}方法创建类main
。