ldap超时在linux中不起作用

时间:2012-10-19 07:45:00

标签: java linux ldap

我这个班有问题:

package it.test;


import java.net.Socket;
import java.net.ServerSocket;
import java.io.*;
import javax.naming.*;
import javax.naming.directory.*;

import java.util.Calendar;
import java.util.Hashtable;

public class ReadTimeoutTest {

public static void main(String[] args) throws Exception {

    boolean passed = false;

    // Set up the environment for creating the initial context
    Hashtable<String, String> env = new Hashtable<String, String>(11);
    env.put(Context.INITIAL_CONTEXT_FACTORY,
            "com.sun.jndi.ldap.LdapCtxFactory");
    env.put("com.sun.jndi.ldap.read.timeout", "1000");
    env.put(Context.PROVIDER_URL, "ldap://localhost:2001");

    Server s = new Server();

    try {

        // start the server
        s.start();

        // Create initial context
        DirContext ctx = new InitialDirContext(env);
        System.out.println("LDAP Client: Connected to the Server");

        // Close the context when we're done
        ctx.close();
    } catch (NamingException e) {
        e.printStackTrace();
        System.out.println("Server: Connection refused"+" "
        +Calendar.getInstance().getTime());
    }
    s.interrupt();
}

static class Server extends Thread {

    static int serverPort = 2001;

    Server() {
    }

    public void run() {
        try {
            ServerSocket serverSock = new ServerSocket(serverPort);
            Socket socket = serverSock.accept();
            System.out.println("Server: Connection accepted"+" "
                    +Calendar.getInstance().getTime());

            BufferedInputStream bin = new BufferedInputStream(socket.
                    getInputStream());
            while (true) {
                bin.read();
            }
        } catch (IOException e) {
            // ignore
        }
    }
}
}

它应该测试ldap调用的超时,在超时之后得到一个naimngException它在windows中工作正常但不在linux中,它继续等待ldap连接。我无法在linux中正确设置超时,没有获得NamingException。我该怎么办?

2 个答案:

答案 0 :(得分:3)

当您使用Java 1.5时,您显然错过了this:“注意:在早于Java SDK v 6.0的系统上,此属性将被忽略,因为SDK中不支持读取超时。”

这必须意味着属性本身是在1.6中引入的,因为套接字自年份点以来已经读取了超时。

答案 1 :(得分:0)

JNDI不应该在新代码中用于多种原因,其中一个原因是超时问题,尽管还有很多其他原因:

  • JNDI使用断开连接的配置
  • JNDI不支持完整的LDAP标准
  • 网上的JNDI例子真的太可怕了

请改用UnboundID LDAP SDK。此SDK不仅支持连接超时,还支持一般的操作超时,并支持在超时时自动放弃操作。

另见