У меня есть несколько узлов, действующих как серверы и клиенты, использующие сокеты TCP Java, т. Е. Socket и ServerSocket. Каждый узел использует постоянные соединения для связи с 4-10 соседями. Тем не менее, иногда узел (node1) может привести следующее исключение при попытке подключиться к другому узлу (NODE2):Java: Connection отказано, но netstat говорит иначе
java.net.ConnectException: Соединение отклонено
Если я бегу NetStat на node2, это показывает, что TCP-соединение установлено с node1 на соответствующем порту (в этом случае 61685).
ТСР 0 0 (node2): 61685 (node1): 55150 СОЗДАН
Однако node1 бросает то же исключение каждый раз, когда он пытается подключиться.
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 отклоняются. Я сомневаюсь, что на всех узлах, которые я пробовал, есть брандмауэры, и я уверен, что служба работает на порту. Есть ли другая причина этого исключения? Благодаря!
- это ваш ConnectionHandler, начинающий собственный поток? – nos
Да, ConnectionHandler запускает новый поток, который продолжает проверять, было ли получено что-либо и что он должен делать с ним. – thodinc
Покажите точную трассировку стека, включая указание линии, в которой происходит исключение. –