Java: соединение отказано, но netstat говорит иначе - PullRequest
0 голосов
/ 29 июля 2009

У меня есть несколько узлов, выступающих в качестве серверов и клиентов, использующих сокеты TCP для Java, т. Е. Socket и ServerSocket. Каждый узел использует постоянные соединения для связи с 4-10 соседями. Однако иногда узел (узел1) может выдать следующее исключение при попытке соединения с другим узлом (узел2):

java.net.ConnectException: в соединении отказано

Если я запускаю netstat на узле 2, это показывает, что установлено TCP-соединение с узлом 1 на соответствующем порту (в данном случае 61685).

tcp 0 0 (узел2): 61685 (узел1): 55150 УСТАНОВЛЕНО

Однако узел 1 выдает одно и то же исключение при каждой попытке подключения.

ServerSocket создается следующим образом:

void OpenRcvSocket(final int port) {
    Thread rcvthread = new Thread () {
            @Override
        public void run () {
            ServerSocket rcvlistener = null;
            boolean running = true;

            try {
                rcvlistener = new ServerSocket(port);
                while(running) {
                    Socket incoming = rcvlistener.accept();
                    new ConnectionHandler(incoming);
                }
            } catch (IOException ex) {
                System.out.println(ex);
            }

            finally {
                try {
                    rcvlistener.close();
                } catch (IOException ex) {
                    System.out.println(ex);
                }
            }
        }
    };
    rcvthread.start();

}

Отправляющая часть выглядит так:

synchronized void SendMsg(String dest, Message myMsg) {
    PrintWriter printwr = SendingConnectionList.get(dest);
    try {
        if(printwr == null) {
            Socket sendsock = new Socket(dest, port);
            printwr = new PrintWriter(sendsock.getOutputStream(), true);
            SendingConnectionList.put(dest, printwr);
        }
        printwr.print(myMsg.MsgToString());
        printwr.flush();
    } catch (UnknownHostException ex) {
        System.out.println(dest+": "+ex);
    } catch (IOException ex) {
        System.out.println(dest+": "+ex);
    }
}

Странно то, что эти узлы обычно не отклоняют все входящие соединения, потому что из 10 соседей 6 могут быть в состоянии соединиться, тогда как 4 отклонены. Я сомневаюсь, что на всех узлах, которые я пробовал, работают брандмауэры, и я уверен, что служба работает на порте. Есть ли какая-то другая причина, по которой это исключение будет выброшено? Спасибо!

Ответы [ 2 ]

0 голосов
/ 29 июля 2009

В Windows вам, возможно, придется указать брандмауэру Windows разрешить Java выполнять сетевую активность. Это могло быть случайно отклонено.

0 голосов
/ 29 июля 2009

Вы можете проверить свой файл политики безопасности Java.

Файл политики по умолчанию

Там может быть что-то, что мешает вашей JVM использовать порты / адрес.

...