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:
-
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.
-
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:
- Checa se existe um cliente esperando pra conectar. Se existe, aceita a conexão e registra esse cliente no multiplexador de leitura;
- Lê todos os dados que podem ser lidos naquele momento da rede, sem dar block;
- Processa essas mensagens de alguma forma;
- Repete
Pra isso você precisa aprender a usar Channels, Selectors e Buffers.
Pra fazer rápido, a primeira solução é bem mais simples.
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();
`