簡體   English   中英

通過套接字進行通信:一台服務器和兩個客戶端

[英]communication through socket: one server and two clients

我有三個實體:A,B和C。A是服務器,而B和C是客戶端。 A是使用java.net的類實現的多線程服務器

我會實現一種通信,其中B向A發送消息,A向C發送消息,C向B發送消息。我的問題是:客戶端C甚至必須是服務器,或者只能是轉發消息的客戶端?

public class ServerA{

public static void main(String[] args){

    boolean listening = true;
    int port_number = 8888;

    try{

        ServerSocket ss = new ServerSocket(port_number);

        System.out.println("Waiting for incoming connection...");

        while(listening){

            new Thread(new ServerThread(ss.accept())).start();

        }

    }
    catch(IOException ioe){ioe.printStackTrace();}
}
}

public class ServerThread implements Runnable{

    @Override
    public void run(){

    }

}

您是否有任何特定原因想要設計這樣的體系結構?

回答您的問題:讓我們考慮一下。 從客戶端C向客戶端B發送消息需要什么? 您想如何實施? 您在評論中提到了一個渠道-但是您究竟需要在兩個客戶之間打開一個“渠道”嗎? 您需要以某種方式知道其(客戶端B的)位置以及端口B正在監聽的端口(最壞的情況是每個客戶端都知道所有/某些其他客戶端,更好的方法是在主服務器上查詢其他客戶端的列表/與所有客戶端都有某種注冊表)。 同樣,顯然,客戶端B需要打開端口並等待消息。

因此,基本上,客戶端C向服務器A查詢某事,獲取響應,然后(通過套接字)向客戶端B發送消息,客戶端B必須在監聽該消息(就像客戶端A一樣)。 這基本上就是服務器客戶端所做的。

如果您知道它將在LAN或類似設備中,則可以考慮使用UDP而不是TCP,但是由於它不那么可靠,因此您需要自己管理更多事情。

這種體系結構使我更想起了具有單個服務器的對等網絡(其中所有“客戶端”都更像是客戶端與服務器的組合),可以從某處獲取數據/進行一些計算。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM