多个服务器也是客户端-JAVA中的通讯

时间:2019-04-04 16:05:38

标签: java multithreading sockets server client

我在JAVA中使用套接字,并且我有3台同时位于客户端的服务器。我希望他们交流一些信息。

这是我要创建的: Three peer machines

输入应该是这样的:

服务器在以下位置启动:/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();
        }
    }


}

1 个答案:

答案 0 :(得分:0)

我花了一些时间来了解您的体系结构,并且设法弄清了问题所在。 ClientHandler确实是错误的,因为 connection.accept()部分在while循环之外,并且连接丢失了。您尝试实现的体系结构具有以下规则。一旦获得连接,就产生一个线程来处理此连接,不仅是一次,而且是连续的。只要将代码放在 ClientHandler线程中的运行功能内 内,上面的代码就可以解决您的问题。

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块没有括号,在我的代码中,我将其删除了。