Servidor com mais de dois clientes

Olá, preciso de ajuda para um trabalho de faculdade que tem que ser feito por Java, porém não tenho a mínima noção de como programar nessa linguagem e o professor obrigou a ser nessa.
Preciso criar um programa onde o servidor pode manipular tarefas oriundas de vários clientes
simultaneamente, ou seja, em paralelo. Execute ao menos dois clientes,
usando mensagens pré-definidas e enviando-as ao servidor
intermitentemente. Tais mensagens devem seguir o padrão Cliente <n. do
cliente>: msg <n. da mensagem>. Incremente o número da mensagem a
cada mensagem enviada. No servidor, exiba as mensagens enviadas pelos
clientes à medida que elas forem chegando. Exiba a data e a hora de
chegada dessas mensagens.
Calcular e apresentar, no servidor, o atraso fim a fim para cada
mensagem enviada ao servidor.

Tem duas formas de fazer isso. Uma fácil e uma difícil:

  1. Multi-thread - blocking (fácil): Inicia o servidor criando um ServerSocket e aceitando conexões. Toda vez que um cliente conectar, você cria uma thread nova para lidar exclusivamente com aquele novo cliente. Toda vez que chega uma mensagem, a thread joga essa mensagem em algum lugar central para ser processada. É isso. Pra isso você precisa estudar threads, sincronização e network programming.

  2. Single-thread - non-blocking (difícil): Ao invés de usar uma thread por cliente, use apenas uma thread principal e os esquemas de Non-Blocking IO do pacote NIO do Java. A thread principal é um loop infinito de eventos:

    1. Checa se existe um cliente esperando pra conectar. Se existe, aceita a conexão e registra esse cliente no multiplexador de leitura;
    2. Lê todos os dados que podem ser lidos naquele momento da rede, sem dar block;
    3. Processa essas mensagens de alguma forma;
    4. Repete

    Pra isso você precisa aprender a usar Channels, Selectors e Buffers.

Pra fazer rápido, a primeira solução é bem mais simples.

1 curtida

O problema é que eu não sei como fazer nenhuma dessas formas, hahaha.
Só sei o básico do java, consigo enviar número para o servidor calcular, devolver o resultado e só…
De resto não sei quase nada.

Mandar o que você já fez, assim dar pra saber aonde você parou

Ele te obrigou a fazer algo numa linguagem que você não conhece? No mínimo estranho.

SERVIDOR:

public static void main(String[] args) throws IOException {

    // cria um socket servidor na porta 5555.
    ServerSocket server = new ServerSocket(5555);

    System.out.println("Servidor ativo...");

    // while(true) vai manter o servidor ativo ate que o console seja fechado
    while (true) {
        // este socket recebe o que foi enviado pelo cliente.
        Socket socket = server.accept();

        // recebe os dados contidos na mensagem do cliente
        Scanner scanner = new Scanner(socket.getInputStream());

        // recupera o primeiro numero (n1) e atribui a variavel result
        int n1 = scanner.nextInt();
        System.out.println("Numero recebido: " + n1);
        int n2 = scanner.nextInt();
        System.out.println("Numero recebido: " + n2);
        int res=n1+n2;
        System.out.println("Calculo realizado");
        // envia o dados para o cliente
        PrintStream saida = new PrintStream( socket.getOutputStream() );
        saida.println(res); // resultado atribuido a mensagem que sera retornada ao cliente            
    }
}

}

CLIENTE:

public static void main(String[] args) throws IOException {

    // conecta o socket no ip localhost na port 5555
    Socket socket = new Socket("localhost", 5555);

    // classe que vai ler os dados do teclado
    Scanner teclado = new Scanner(System.in);

    // le o numero
    System.out.print("Digite numero => ");
    int n1 = teclado.nextInt();
    System.out.print("Digite outro numero => ");
    int n2 = teclado.nextInt();

    // os numeros adicionados ao objeto saida sao enviados ao servidor
    PrintStream saida = new PrintStream( socket.getOutputStream() );
    saida.println(n1); // envia n1 ao servidor
    saida.println(n2);

    // cria objeto resposta para receber a resposta do servidor via socket
    Scanner resposta = new Scanner( socket.getInputStream() );

    // armazena dados oriundos do servidor na variavel result
    int res = resposta.nextInt();
    System.out.println("Resultado:> " + res);

    // encerra o PrintStream, socket e scanner
    teclado.close();
    saida.close();
    //resposta.close();
    socket.close();
}

}

Faca do seguinte modo
`

new Thread (new Runnable() {
public static Main main;
public void run() {

main.socket = main.server.accept();

}
}).start();
`