重用相同的serversocket时出现问题

时间:2010-12-02 11:38:20

标签: java sockets

我已实现以下代码来创建SSL服务器套接字。

    public void createConnection(){
     port =8888;
    listen = true;
            isSvrRuning = true;
            try {


                String KEYSTORE = Config.KEYSTORE_FILE;
                // String KEYSTORE = "/u04/app/ato/data/keystore/ATradSvrKeyStore";
                char[] KEYSTOREPW = "abcd".toCharArray();
                char[] KEYPW = "abcd".toCharArray();
                com.sun.net.ssl.TrustManagerFactory tmf;

                boolean requireClientAuthentication;

                java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
                java.security.KeyStore keystore = java.security.KeyStore.getInstance(
                        "JKS");
                keystore.load(new FileInputStream(KEYSTORE), KEYSTOREPW);

                com.sun.net.ssl.KeyManagerFactory kmf = com.sun.net.ssl.KeyManagerFactory.getInstance("SunX509");
                kmf.init(keystore, KEYPW);

                com.sun.net.ssl.SSLContext sslc = com.sun.net.ssl.SSLContext.getInstance("SSLv3");
                tmf = com.sun.net.ssl.TrustManagerFactory.getInstance("sunx509");
                tmf.init(keystore);

                sslc.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
                SSLServerSocketFactory ssf = sslc.getServerSocketFactory();

                ssocket = (SSLServerSocket) ssf.createServerSocket();
                try {
                    ssocket.setReuseAddress(true);
                } catch (SocketException ex) {
                    loggerSvr.log(Level.SEVERE, "SocketException in setting timeout for serverSocket.");
                    ex.printStackTrace();
                }
                ssocket.bind(new InetSocketAddress(port));
                ssocket.setNeedClientAuth(true);
                while (listen) {
                    //wait for client to connect//
                    socket = ssocket.accept();
        // here goes the code which need to handle a new connection
    }

}catch(){
//there are several catch blocks to catch all checked exceptions
}
}

如果上面的套接字出现问题或异常,我会关闭套接字并通过调用上面的方法重新创建另一个服务器套接字。但问题是有一段时间我无法使用相同的端口重新创建服务器套接字。当我尝试这样做时,它会出现以下错误。

Server socket allocation error for the specific port

我在创建socket时也设置了可重用的属性。有人告诉我这是什么问题吗?

2 个答案:

答案 0 :(得分:0)

  

特定端口的服务器套接字分配错误

这不是Java异常消息。这来自您代码中的一些未公开的点。如果setReuseAddress()失败,则判断您正在打印的错误消息的准确性,它可能与实际错误条件无关。当你 调用setReuseAddress(true)时,我发现它不太可能是绑定问题。您必须告诉我们实际异常和错误消息。

这里有一个道德:不要编造自己的错误信息;使用例外中提供的那个。

此代码也已过期十年。所有com.sun.net.ssl。*的东西都应该被javax.net.ssl替换。*而且你不需要添加提供者。 @since JDK 1.3。

答案 1 :(得分:0)

最后我可以找出问题所在。但问题出在其他地方。上面的代码没有任何恐怖。代码的初始实现者没有暴露真正的错误。这就是我无法弄清楚的原因。请原谅我的问题。