Как подключить несколько серверов к клиенту в Java с помощью сокетов? - PullRequest
0 голосов
/ 24 марта 2019

Я делаю программу по сокетам, от одного клиента до нескольких серверов, в интернете я не нашел информации об этом

Система состоит из подключения нескольких серверов к одному клиенту, клиент должен запросить число у пользователя, затем на сервере с этим номером будет выполнен алгоритм, который найдет число простых чисел от 0 до N, после этого время выполнения алгоритма вычисляется, а затем отправляется клиенту. Каждый раз каждый сервер отправляется клиенту, и клиент сохраняет их.

Проблема в том, что это соединение должно быть одновременным между желаемым количеством серверов, в дополнение к синхронизации этого соединения.

На данный момент я сделал простой код от клиента до сервера.

ГЛАВНЫЙ СЕРВЕР

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Server s = new Server(5000, "Hilo servidor");
    s.start();
    }

}

МОДУЛЬНЫЙ СЕРВЕР

Это метод, который находится внутри класса сервера, этот класс выполняет алгоритм для подсчета количества двоюродных братьев и отправки этого времени клиенту. Он запускается при вызове c.start () на главном сервере

private void startServer() {

            try {
                ServerSocket ss = new ServerSocket(port);
                System.out.println("Esperando Conexion");
                Socket socket = ss.accept();


                DataInputStream in = new DataInputStream(socket.getInputStream());
                int n = in.readInt();
                long time = encontrarPrimeros(n);
                DataOutputStream out = new DataOutputStream(socket.getOutputStream());
                out.writeLong(time);
                System.out.println(time);
            } catch (IOException ex) {
                Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
            }
}

ГЛАВНЫЙ КЛИЕНТ

public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
            Client c = new Client("Hilo cliente", 5000, "192.168.0.19");
            c.start();
    }

}

МОДУЛЬ КЛИЕНТА

    private void startClient() {
            try {
                    Socket socket = new Socket(ip, port); 
                    DataOutputStream out = new DataOutputStream(socket.getOutputStream());


                    System.out.println("Ingrese dato...");
                    Scanner scanner = new Scanner(System.in);
                    int n = scanner.nextInt();
                    out.writeInt(n);
                    DataInputStream in = new DataInputStream(socket.getInputStream());
                    long tiempo = in.readLong();
                    System.out.println(tiempo);
                    socket.close();
            } catch (IOException ex) {
                    Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
            }
    }

Проблема в том, как подключить несколько серверов к клиенту, чтобы они начали синхронизироваться?

Спасибо

Обновление

Я изменил основной метод клиента, из-за этого:

public class Main {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    Client c = new Client("Hilo cliente", 5000, "192.168.0.19");
    Client c2 = new Client("Hilo cliente", 5000, "192.168.0.19");
    c.start();
    c2.start();
}

}

Но при выполнении я получаю следующую ошибку:

mar 23, 2019 7:14:10 PM Client startClient
GRAVE: null
java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:210)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at java.io.DataInputStream.readFully(DataInputStream.java:195)
    at java.io.DataInputStream.readLong(DataInputStream.java:416)
    at Client.startClient(Client.java:69)
    at Client.run(Client.java:41)
    at java.lang.Thread.run(Thread.java:748)

Инструкция по выполнению ошибки следующая: long tiempo = in.readLong();

1 Ответ

0 голосов
/ 24 марта 2019

На самом деле, при программировании сокетов:

  • клиент может подключиться только к одному серверу
  • сервер может принимать множество клиентских подключений
  • Клиент управляет своим подключением к серверу через объект сокета

Если вашему клиенту необходимо подключиться ко многим серверам, клиент должен создать столько объектов сокетов, сколько и серверов. А для параллельного управления связью вы можете создать отдельный поток, в котором вы управляете IO для каждого сокета.

Применительно к вашему сценарию:

  • вы можете сохранить свой класс Client, так как он управляет одним сокетом
  • вы создаете N объектов Клиента по количеству серверов (каждый экземпляр Клиента связывается только с одним сервером)
  • вы можете сделать свой класс Client работоспособным (путем наследования от класса Thread).
  • вы запускаете свой Клиент как поток (вы можете поместить класс startClient () в защищенный метод void run (), который вы унаследовали от Thread).
  • В вашем main вы вызываете каждый метод start () объекта client (унаследованный от thread). это запустит метод run () в фоновом режиме.
  • чтобы собрать все результаты, вы вызываете join () для каждого объекта Client

Пример класса клиента

    public class Client extends Thread {

    private String ip;
    private int port;


    public Client(String serverIP, int serverPort) {
        this.ip = new String(serverIP);
        this.port = serverPort;
    }

    private void startClient() {
        try {
            Socket socket = new Socket(ip, port); 
            DataOutputStream out = new DataOutputStream(socket.getOutputStream());

            System.out.println("Ingrese dato...");
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            out.writeInt(n);
            DataInputStream in = new DataInputStream(socket.getInputStream());
            long tiempo = in.readLong();
            System.out.println(tiempo);
            socket.close();
        } catch (IOException ex) {
            ex.getStackTrace();
        }
    }

    @Override
    public void run() {

        startClient();

        super.run();
    }
}

Главная

Client client1 = new Client("192.168.1.100", 8888);
    Client client2 = new Client("192.168.1.101", 8888);
    Client client3 = new Client("192.168.1.102", 8888);

    client1.start();
    client2.start();
    client3.start();

    try {
        client1.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    try {
        client2.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    try {
        client3.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

Класс сервера

public class Server extends Thread {


ExecutorService threadPool = Executors.newCachedThreadPool();

//Private class
class ClientSocket implements Runnable {

    private Socket m_socket;

    ClientSocket(Socket sock) {
        m_socket = sock;
    }

    @Override
    public void run() {
        try {
            DataInputStream in = new DataInputStream(m_socket.getInputStream());
            int n = in.readInt();
            long time = n;
            DataOutputStream out = new DataOutputStream(m_socket.getOutputStream());
            out.writeLong(time);
            out.flush();
            System.out.println(time);
            System.out.flush();
        } catch (IOException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}


@Override
public void run() {
    startServer();
    super.run();
}

private void startServer() {

    try {
        ServerSocket ss = new ServerSocket(8888);
        System.out.println("Esperando Conexion");

        do {
            Socket socket = ss.accept();

            threadPool.execute(new ClientSocket(socket));

        } while(true);

    } catch (IOException ex) {
        Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
    }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...