Java服务器使用套接字连接到其他服务器



我有一个项目,我必须构建一个系统,在该系统中,多个服务器相互通信以响应客户端。

我可以让客户端与服务器通信,但我在让服务器启动它们之间的连接时遇到了问题。

在下面的代码中,你可以看到我有一个列表,其中包含所有服务器的ip。对于每个ip,当前服务器尝试与另一个服务器连接。您还可以看到服务器在等待连接,在这种情况下,等待来自其他服务器的连接。

@Override
public void run() {
// Trying to connect with server
for (String serverIp : servers) {
System.out.println("Trying to connect with " + serverIp);
try {
Socket clientSocket = new Socket(serverIp, this.port);
this.clientPool.submit(new ClientThread(clientSocket, this.streamHandler));
} catch (Exception e) {
System.out.println("Error");
}
System.out.println("Connected with " + serverIp);
}
// Receiving connections from other servers
// In these case we call client to the other server
try (ServerSocket serverSocket = new ServerSocket(port)) {
System.out.println("Waiting for clients to connect...");
while (true) {
Socket clientSocket = serverSocket.accept();
this.clientPool.submit(new ClientThread(clientSocket, this.streamHandler));
}
// serverSocket.close();
} catch (IOException e) {
Configuration.printError("Error starting server", e);
}
}

问题是服务器需要尝试与其他服务器连接,并等待来自其他服务器的连接。在接收到新连接后,它需要停止尝试连接到对应服务器,或者如果服务器成功尝试连接到另一台服务器,它需要从该服务器停止接收新连接。

关于如何用套接字实现这一点,有什么建议吗?

您似乎尝试分步骤执行此操作,首先所有服务器都尝试连接到其他服务器,但还没有服务器开始接受连接。在clientSocket连接到服务器之后,您就开始接受连接。听起来这可能会导致僵局。

您知道每个服务器都必须接受来自其他服务器的连接。您还知道,每个服务器都需要启动与其他服务器的连接。

您必须在两个不同的线程中接受连接启动的连接

在接收到新连接后,它需要停止尝试连接到对应服务器,或者如果服务器成功尝试连接到另一台服务器,则需要停止接收来自该服务器的新连接。

在这里你想避免一场比赛。如果每个服务器在尝试连接到其他服务器之前等待X次,那么这是最容易做到的。这个X应该是从启动开始的随机延迟。例如,服务器A在连接前等待5秒,服务器B等待1秒,服务器C在连接前等候13秒。但是服务器B和C将不会发起任何连接,因为服务器A已经建立了到这些服务器的连接。

最新更新