[英]Java server connect to other server using sockets
我有一個項目,我必須在其中構建一個系統,在該系統中多個服務器之間進行通信以響應客戶端。
我可以讓客戶端與服務器通信,但我在讓服務器在它們之間啟動連接時遇到問題。
在下面的代碼中,您可以看到我有一個包含所有服務器 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 已經與這些服務器建立了連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.