Multithread Sockets

2 respostas
V

Galera, eu estava precisando fazer um trabalho da faculdade, aonde você teria que colocar um servidor atendendo diferentes clientes, usando multithread.
Eu consegui, e devo agradecer ao Claudio:

http://www.guj.com.br/posts/list/0/2930.java#1021841

Aonde peguei o código dele e adaptei as minhas necessidades.

O nosso servidor:

import java.net.*;
import java.io.*;

/**
 *
 * @author Valter
 */
public class Servidor implements Runnable {

    ServerSocket ss;

    public Servidor(int porta) throws Exception {

        // informando em qual porta o servidor estará ouvindo
        ss = new ServerSocket(porta);

        // criando uma nova thread e já estou inicializando ela
        new Thread(this).start();

        // mensagem iniicial
        System.out.println("Servidor ouvindo na porta:" + porta);

    }

    public void run() {
        try {
            while (true) {
                // aceitando a conexão com o cliente e inicializando a outra thread
                new TrataCliente(ss.accept()).start();
                System.out.println("Mais um cliente atendido!");

            }

        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        }
    }

    public static void main(String[] args) {
        try {
            new Servidor(1024);

        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        }
    }
}

class TrataCliente extends Thread {

    private Socket client;

    public TrataCliente(Socket s) {
        client = s;
    }

    public void run() {
        try {
            // aqui vai a sua comunicacao com o cliente
            ObjectInputStream oi = new ObjectInputStream(client.getInputStream());

            // exibindo na tela o que recebemos do nosso cliente
            System.out.println("Chegou isso:" + oi.readObject());

            client.close();

        } catch (Exception e) {
            e.printStackTrace();
            System.exit(1);
        }
    }
}

O nosso cliente:

import java.net.*;
import java.io.*;

/**
 *
 * @author Valter
 */
public class Cliente extends Thread {

    // aqui no nosso caso será o 'localhost' que o ip da própria maquina aonde você executará
    private String server;
    // neste caso utilizaremos a partir da porta 1024, sendo que menor são para o Sistema Operacional
    private int porta;
    // aqui será a nossa string que será enviada para o servidor e ficará repetindo diversas vezes
    private String texto;

    public Cliente(String server, int porta) {
        try{
        // preparando o buffer para ler a stream (no caso o teclado)
        BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
        
        // estamos lendo a stream que esta vindo do usuário
        texto = inFromUser.readLine();

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

        this.server = server;
        this.porta = porta;
    }

    public static void main(String[] args) {
        try {

            // inicializando quem será nosso servidor (nossa máquina)
            String server = "localhost";
            
            // o numero da porta
            int porta = 1024;

            // o numero máx de clientes que podem ser atendidos, mais que isso começaremos a ter muitas exceções
            int numeroDeClientes = 10;

            for (int i = 0; i < numeroDeClientes; i++) {

                // criando um novo cliente para nosso servidor
                new Cliente(server, porta).start();

            }

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

    public void run() {
        try {

            while (true) {

                // abrindo uma porta para fazermos a comunicação entre nosso cliente e nosso servidor
                Socket s = new Socket(server, porta);

                // instaciando para enviarmos ao nosso servidor o que digitamos no cliente
                ObjectOutputStream oo = new ObjectOutputStream(s.getOutputStream());

                // informando aonde estamos conectados
                System.out.println("Conectado a " + server + ":" + porta);

                // enviando ao nosso servidor a nossa string
                oo.writeObject(texto);

                //fechando a nossa conexão
                s.close();
            }

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

Lembrando que para rodar o programa, vá no prompt , localize a pasta onde esta o servidor.java e o cliente.java, então faça o comando:

javac servidor.java

depois

java cliente.java

para testar, em uma janela do prompt você digita:

java servidor

em outra janela, voce digita:

java cliente

então no cliente você colocaria :

11111111111111 (por exemplo)

ao abrir outra janela, coloque:

22222222222222 (por exemplo)

no servidor você verá que fica alternando entre [telefone removido] e 222222222222, e assim vai,rs.

Bem eh isso galera, um forte abraço.

Obrigado GUJ.

2 Respostas

H

mas no caso, eu poderia ter vários servidores, tipo assim, 3 clientes em um servidor, tranquilo, ai o servidor cai, outro já poderia está esperando para continuar a conexão, vem a questão de disponibilidade, tem como?

H

Desinterrei a thread.heheeheh

Criado 27 de março de 2010
Ultima resposta 18 de jun. de 2012
Respostas 2
Participantes 2