У меня есть несколько узлов, выступающих в качестве серверов и клиентов, использующих сокеты 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 отклонены. Я сомневаюсь, что на всех узлах, которые я пробовал, работают брандмауэры, и я уверен, что служба работает на порте. Есть ли какая-то другая причина, по которой это исключение будет выброшено? Спасибо!