簡體   English   中英

多個服務器也是客戶端-JAVA中的通訊

[英]multiple servers that are also clients - communacation in JAVA

我在JAVA中使用套接字,並且我有3個服務器,它們的客戶端時間相同。 我希望他們交流一些信息。

這是我要創建的: 三台對等機器

輸入應該是這樣的:

服務器開始於:/172.16.2.22:8080第一信息,第二信息,第三信息,

服務器開始於:/172.16.2.22:8081第一信息,第二信息,第三信息,

服務器啟動於:/172.16.2.22:8082第一信息,第二信息,第三信息,

但是由於某種原因,它只顯示當前也是服務器的客戶端的信息。

所以我得到這個結果:

服務器首先從以下位置啟動:/172.16.2.22:8080信息

服務器在以下時間啟動:/172.16.2.22:8081信息

服務器在以下位置啟動:/172.16.2.22:8082信息

這就是我初始化代碼服務器的方式

    private void startServer() {

    ServerSocket providerSocket = null;
    BufferedReader in = null;
    try {
        InetAddress addr = InetAddress.getByName(this.serv.getIP());
        providerSocket = new ServerSocket(this.serv.getPort(), 50, addr);
        System.out.println("ServThread started at:" + addr + ":" + this.serv.getPort());


        // create a new thread object
        Thread t = new ClientHandler(providerSocket);

        // Invoking the start() method
        t.start();


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

    }

這是我用於線程ClientHandler

    class ClientHandler extends Thread {

    final ServerSocket s;

    // Constructor
    public ClientHandler(ServerSocket s) {
        this.s = s;
    }

    public void run() {

        Socket s = null;
        try {
            s = this.s.accept();
        } catch (IOException e) {
            e.printStackTrace();
        }
        while (true) {
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            try {

                BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
                // receive the answer from client


                String line = null;
                while ((line = in.readLine()) != null) {
                    System.out.println(line);
                }


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

    }

}

最后是我的客戶 ,這也是服務器。 我正在使用for循環讀取帶有我的服務器的所有IP,端口的txt:

    private void startSender() {

    for (MyServers servs : ServersTXT.fetchTXTofServers()) {
        BufferedWriter out;
        try (Socket s = new Socket(servs .getIP(), servs .getPort())) {
            out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            out.write(servs.info());
            out.newLine();
            out.flush();
        } catch (ConnectException err) {
            // Connection failed because not all servers on the txt are up
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


}

我花了一些時間來了解您的體系結構,並設法找出了問題所在。 ClientHandler確實是錯誤的,因為connection.accept()部分在while循環之外,並且連接丟失了。 您嘗試實現的體系結構具有以下規則。 一旦獲得連接,就產生一個線程來處理此連接,不僅是一次,而且是連續的。 只要將其放在 ClientHandler線程的run函數中,上面的代碼就可以解決您的問題。

ServerSocket providerSocket;
Socket connection;
InetAddress addr;
try {
    addr = InetAddress.getByName(this.broker.getIP());
    providerSocket = new ServerSocket(this.broker.getPort(), 50, addr);
    while (true) {
        connection = providerSocket.accept();
        ObjectOutputStream out = new ObjectOutputStream(connection.getOutputStream());
        ObjectInputStream in = new ObjectInputStream(connection.getInputStream());
        System.out.println(n.readUTF());
        in.close();
        out.close();
        connection.close();
    }
} catch (Exception err) {
      err.printStackTrace();
}

另外,在發送器部分的try塊中,您嘗試在括號內執行代碼,通常try塊沒有括號,在我的代碼中,我將其刪除了。

暫無
暫無

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

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