我有几个节点使用 Java 的 TCP 套接字(即 Socket 和 ServerSocket)作为服务器和客户端。每个节点使用持久连接与 4 到 10 个邻居进行通信。但是,有时一个节点(node1)在尝试连接到另一个节点(node2)时可能会抛出以下异常:
java.net.ConnectException:连接被拒绝
如果我在 node2 上运行 netstat,它表明已在适当的端口(在本例中为 61685)上与 node1 建立了 TCP 连接。
tcp 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 个被拒绝。我怀疑我尝试过的所有节点上都运行着防火墙,并且很确定该服务正在端口上运行。还有其他原因会引发此异常吗?谢谢!