我这个班有问题:
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。我该怎么办?
答案 0 :(得分:3)
当您使用Java 1.5时,您显然错过了this:“注意:在早于Java SDK v 6.0的系统上,此属性将被忽略,因为SDK中不支持读取超时。”
这必须意味着属性本身是在1.6中引入的,因为套接字自年份点以来已经读取了超时。
答案 1 :(得分:0)
JNDI不应该在新代码中用于多种原因,其中一个原因是超时问题,尽管还有很多其他原因:
请改用UnboundID LDAP SDK。此SDK不仅支持连接超时,还支持一般的操作超时,并支持在超时时自动放弃操作。