JavaのTCPソケット、つまりSocketとServerSocketを使用して、サーバーとクライアントの両方として機能するノードがいくつかあります。各ノードは永続的な接続を使用して、4〜10個のネイバーと通信します。ただし、ノード(node1)が別のノード(node2)に接続しようとすると、次の例外がスローされる場合があります。
java.net.ConnectException:接続が拒否されました
node2でnetstatを実行すると、適切なポート(この場合は61685)でnode1とのTCP接続が確立されていることが示されます。
tcp 0 0(ノード2):61685(ノード1):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個は拒否されるためです。私が試したすべてのノードでファイアウォールが実行されているとは思えません。サービスがポートで実行されていることは間違いありません。この例外がスローされる他の理由はありますか?ありがとう!