Проблема в повторном использовании одного и того же сокета сервера - PullRequest
0 голосов
/ 02 декабря 2010

Я реализовал следующий код для создания сокета сервера 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.can кто-нибудь сказать, в чем проблема?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2010

Наконец-то я смог разобраться в проблеме. Но проблема была где-то еще. Выше код не имеет никакой ошибки. Первоначальный реализатор кода не выявил реальной ошибки. Вот почему я не мог понять. Простите меня за проблему.

0 голосов
/ 03 декабря 2010

Ошибка выделения сокета сервера для определенного порта

Это не сообщение об исключении Java. Это происходит из какой-то нераскрытой точки в вашем коде. Судя по точности сообщения об ошибке, которое вы печатаете в случае сбоя setReuseAddress (), оно может не иметь ничего общего с фактическим состоянием ошибки. Поскольку вы вызываете setReuseAddress (true), я нахожу весьма маловероятным, что это проблема связывания. Вам нужно будет сообщить нам фактическое исключение и сообщение об ошибке.

Здесь есть мораль: не выдумывайте свои собственные сообщения об ошибках; используйте тот, который указан в исключении.

Также этот код устарел на десять лет. Все содержимое com.sun.net.ssl. * Должно быть заменено на javax.net.ssl. * И вам не нужно добавлять провайдера. @ с JDK 1.3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...