我有几个节点充当使用Java的TCP套接字的服务器和客户端,即Socket和ServerSocket。每个节点使用持久连接与4到10个邻居通信。但是,有时节点(node1)在尝试连接到另一个节点(node2)时可能会抛出以下异常:
java.net.ConnectException:拒绝连接
如果我在node2上运行netstat,则表明已在相应端口上建立了与node1建立的TCP连接(在本例中为61685)。
tcp 0 0(node2):61685(node1):55150 ESTABLISHED
但是,每次尝试连接时,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个被拒绝。我怀疑在我试过的所有节点上都运行了防火墙,我很确定该服务是在端口上运行的。是否会抛出此异常?谢谢!
答案 0 :(得分:0)
答案 1 :(得分:0)
在Windows下,您可能必须告诉Windows防火墙允许Java执行网络活动。这可能是意外拒绝的。