【发布时间】:2020-10-10 08:23:05
【问题描述】:
我有一个项目,我必须构建一个系统,其中多个服务器相互通信以响应客户端。
我可以让客户端与服务器通信,但在让服务器启动它们之间的连接时遇到问题。
在下面的代码中,您可以看到我有一个包含所有服务器 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);
}
}
问题是服务器需要尝试与其他服务器连接并等待来自其他服务器的连接。并且在接收到新连接后,它需要停止尝试连接到对应服务器,或者如果服务器尝试连接到另一台服务器成功,它需要停止从该服务器接收新连接。
关于如何使用套接字实现此功能的任何建议?
【问题讨论】:
-
为什么不用zookeeper?实例之间的协调?
标签: java multithreading sockets distributed-system raft