0

我对这门课有一个问题:

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。我应该怎么办?

4

2 回答 2

3

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

这一定意味着该属性本身是在 1.6 中引入的,因为 Sockets 从年点开始就出现了读取超时。

于 2012-10-19T09:11:45.610 回答
0

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

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

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

也可以看看

于 2012-10-20T08:44:11.593 回答