Java LDAP和JNDI的ServiceUnavailableException

Java LDAP和JNDI的ServiceUnavailableException,java,sockets,tcp,ldap,jndi,Java,Sockets,Tcp,Ldap,Jndi,我正在使用JNDI连接到LDAP,我需要它与许多同时的TCP连接一起工作。需要同时建立所有连接。神秘之处在于,有时它起作用,有时它只建立一些联系,例如30个中的17个。 我在谷歌上看到了类似的问题,但没有人提供解决方案。谢谢 堆栈跟踪: javax.naming.ServiceUnavailableException: 172.16.0.xxx:389; socket closed at com.sun.jndi.ldap.Connection.readReply(Connection.java

我正在使用JNDI连接到LDAP,我需要它与许多同时的TCP连接一起工作。需要同时建立所有连接。神秘之处在于,有时它起作用,有时它只建立一些联系,例如30个中的17个。 我在谷歌上看到了类似的问题,但没有人提供解决方案。谢谢 堆栈跟踪:

javax.naming.ServiceUnavailableException: 172.16.0.xxx:389; socket closed
at com.sun.jndi.ldap.Connection.readReply(Connection.java:464)
at com.sun.jndi.ldap.LdapClient.ldapBind(LdapClient.java:370)
at com.sun.jndi.ldap.LdapClient.authenticate(LdapClient.java:222)
at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2752)
at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:328)
at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:205)
at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:223)
at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:166)
at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:96)
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:695)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:318)
at javax.naming.InitialContext.init(InitialContext.java:253)
at javax.naming.InitialContext.<init>(InitialContext.java:227)
at javax.naming.directory.InitialDirContext.<init>(InitialDirContext.java:112)
javax.naming.ServiceUnavailableException:172.16.0.xxx:389;插座闭合
位于com.sun.jndi.ldap.Connection.readReply(Connection.java:464)
位于com.sun.jndi.ldap.LdapClient.ldapBind(LdapClient.java:370)
位于com.sun.jndi.ldap.LdapClient.authenticate(LdapClient.java:222)
位于com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2752)
位于com.sun.jndi.ldap.LdapCtx.(LdapCtx.java:328)
位于com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:205)
位于com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:223)
位于com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:166)
位于com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:96)
位于javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:695)
位于javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:318)
位于javax.naming.InitialContext.init(InitialContext.java:253)
位于javax.naming.InitialContext。(InitialContext.java:227)
位于javax.naming.directory.InitialDirContext。(InitialDirContext.java:112)
编辑:一些代码

socket = new Socket(hostname, port);
is = socket.getInputStream();
os = socket.getOutputStream();
bif = new BufferedInputStream(is);
bof = new BufferedOutputStream(os);

env = new Hashtable<String, String>();
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, usr);
env.put(Context.SECURITY_CREDENTIALS, pwd);
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.REFERRAL,"follow");
env.put("java.naming.ldap.derefAliases", "never");
env.put(Context.PROVIDER_URL, "ldap:// /*address*/);
try {
    ctx = new InitialDirContext(env);//ERROR
} catch (ServiceUnavailableException e1) {
    e1.printStackTrace();
    System.out.println("service unavailable");
}
socket=新套接字(主机名、端口);
is=socket.getInputStream();
os=socket.getOutputStream();
bif=新的BufferedInputStream(is);
bof=新的缓冲输出流(os);
env=新哈希表();
环境put(Context.SECURITY_认证,“simple”);
环境投入(环境安全负责人,usr);
环境投入(上下文安全认证,pwd);
put(Context.INITIAL\u Context\u工厂,“com.sun.jndi.ldap.LdapCtxFactory”);
环境投入(上下文转介,“遵循”);
put(“java.naming.ldap.derefAliases”,“从不”);
env.put(Context.PROVIDER_URL,“ldap://*地址*/);
试一试{
ctx=新的InitialDirContext(env);//错误
}捕获(ServiceUnavailableException e1){
e1.printStackTrace();
System.out.println(“服务不可用”);
}

只是想告诉大家,问题是ldap服务器上的文件描述符有限,在提高限制后,它可以正常工作。

发布一些代码。这表明您在某个地方出现了编程错误。1.套接字用于什么?2.您在何处关闭上下文?不太可能。更有可能是在某个地方泄漏连接。您所做的只是更改问题发生的位置。您没有回答任何问题。例如,
Socket
完全没有意义。当然,这不是全部代码。我之所以这样做只是为了显示错误发生的位置。Socket用于将消息传输到ldap服务器。输入和输出流、Socket、上下文,等正确关闭,并且没有泄漏(使用visualvm检查)。起初我认为这是等待时间或类似的时间。在使用netstat的ldap服务器上,当出现错误时,我看到约1000个连接,默认FD值为1024(是的,实际上有这么多连接)。很抱歉,我认为有ldap经验的sb在许多tcp连接上也存在类似问题。否。消息通过调用
上下文上的方法传输到ldap服务器。
套接字与此无关。您应该能够自己看到,因为它不在任何地方使用。如果您认为它是用于此目的,您必须删除它:这是在浪费LDAP服务器上的资源。