“线程中的Java SingleOne异常”;“主要”;java.net.BindException:地址已在使用中:JVM\u Bind

“线程中的Java SingleOne异常”;“主要”;java.net.BindException:地址已在使用中:JVM\u Bind,java,Java,我在服务器端尝试将其设置为SingleTone,以便从另一个类访问服务器metodtds,但当我运行Server main,然后从另一个类执行Server.getInstance()时,它抛出以下期望: 线程“main”中出现异常 java.net.BindException:地址已在使用中:JVM\u Bind 我试了很多东西,但都不管用 private static Server serverinstance = null; private static Object ob

我在服务器端尝试将其设置为SingleTone,以便从另一个类访问服务器metodtds,但当我运行Server main,然后从另一个类执行
Server.getInstance()
时,它抛出以下期望:

线程“main”中出现异常 java.net.BindException:地址已在使用中:JVM\u 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();
    }
    }
private静态服务器serverinstance=null;
私有静态对象obj=新对象();
公共服务器()引发IOException{
服务器=新服务器套接字(222);
hash=新的HashMap();
}
公共静态服务器getInstance()引发IOException{
同步(obj){
if(serverinstance==null){
serverinstance=新服务器();
serverinstance.listenServer();
}
返回服务器实例;
}
}
私有void listenServer()引发IOException{
while(旗帜){
ans=server.accept();
if(serverinstance!=null)
新的EchoThread(serverinstance,ans);
}
}
公共静态void main(字符串args[])引发IOException{
getInstance();
}
A类()
{
公共A()
{
getInstance();
}
}

尝试重新启动计算机。这是因为另一个程序已经在使用端口222,所以您的程序无法侦听它。如果这不起作用,请尝试将222切换到不同的位置,比如8000或9999,基本上是1000-65535(如果您在Windows上,则为0-65535)之间的任何数字。

Java singleton保证每个JVM和每个类加载器只能有一个实例

在您的例子中,通过调用两个独立的
main
方法,将相同的
Server
类加载到两个不同的JVM和类加载器中。这会导致调用两次
服务器
构造函数,然后尝试在同一端口上创建两个
服务器套接字


一个快速的解决方案是直接或间接地从调用
Server.getInstance()的
main
方法创建类
A

@mat JVM bindexception表示端口已绑定到。如果您多次尝试更改端口,但都不起作用,那么您的笔记本电脑就会出现一些问题。如果它是Linux,请发布
netstat
@mat的输出。好的,我不记得netstat的等价物,但您可以在网上轻松找到它(它是一个内置命令)当我试图从另一个类访问VARABLE时,它的值为null,因此getinstance在同一个端口上再创建一个serversocket,这就是抛出的例外。您在同一个VM上运行这两个吗?看起来您正在运行主程序,该程序将启动一个JVM,然后从另一个JVM调用
Server.getInstance()
。如果是这种情况,那么您将创建两个单独的
Server
对象,它们将尝试打开同一个端口。我使用main运行服务器,然后使用main运行class A class A,class A需要是客户机类,因此如果我想运行客户机几次,如何操作?