Ir ao conteúdo

Problemas com orientação a objetos


MarvinRio

Posts recomendados

Postado
E aí caras! Tudo bem ? 

 

Eu tenho uma classe em JAVA que é um Servidor, eu pus nesta classe servidor, o argumento porta, por exemplo se eu for chamar esta classe eu faria assim : new Servidor(5000); , 5000 é o argumento desta classe servidor, então eu criei uma nova classe frame com um botão, e na ação deste botão eu chamo esta classe servidor 5 vezes, mas com os argumentos diferentes e ficou assim :

 

 



private void botaoIniciaServidoresActionPerformed(java.awt.event.ActionEvent evt) {                                                      
       
        Servidor servidor = new Servidor(5000);
        Servidor servidor1 = new Servidor(5001);
        Servidor servidor2 = new Servidor(5002);
        Servidor servidor3 = new Servidor(5003);
        Servidor servidor4 = new Servidor(5004);
}


 

 

Mas o problema é que quando eu clico no botão, o único servidor que inicia é o primeiro na porta 5000, eu já fiz o debug aqui e observei que somente a primeira instrução é executada, as outras 4 não são, por que isso ? 

 

Eu já tentei fazer assim :

 

 



private void botaoIniciaServidoresActionPerformed(java.awt.event.ActionEvent evt) {                                                      
        
        new Servidor(5000);
        new Servidor(5001);
        new Servidor(5002);
        new Servidor(5003);
        new Servidor(5004);
}


 

 

Mesmo assim não dá certo, eu fiz o debug nos dois casos e somente o servidor da porta 5000 é iniciado, alguém ajuda ?

Postado

Não está lançando nenhuma exceção dentro do construtor da classe Servidor?

 

Se postar o código completo posso te ajudar a encontrar o problema, somente com esse trecho fica impossível.

Postado

em um botão você não vai conseguir nunca fazer o java processar 5 instancias sem antes perguntar com uma condição if...else ou switch...case. Pense comigo você tem duas mão, como você vai pegar em outras 3 mãos? difícil né? Olha o conselho q te dou é para se criar classes e dentro delas criar métodos e com eles por no botão fazendo perguntas ao sistema ou ao usuário...e uma pergunta no Construtor de sua classe cada um recebe um argumento diferente ou é um só recebendo todos esses valores?? 

Postado

Não está lançando nenhuma exceção dentro do construtor da classe Servidor?

 

Se postar o código completo posso te ajudar a encontrar o problema, somente com esse trecho fica impossível.

Não meu amigo, não tenho nenhum problema, o servidor roda normalmente ok ? Só tenho problema para executar mais de uma classe servidor com argumentos diferentes, pois quero iniciar uns 100 servidores, mas só vão mudar as portas, e do jeito que está eu tenho que ir de um em um ! Kkk ! Vou postar o codigo, muito obrigado ! :)

package Pacote;import Pacote.Mensageiro.Acao;import java.io.EOFException;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.net.ServerSocket;import java.net.Socket;import java.util.Calendar;import java.util.Date;import java.util.HashMap;import java.util.HashSet;import java.util.Map;import java.util.Set;import java.util.logging.Level;import java.util.logging.Logger;@SuppressWarnings("unchecked")public class Servidor {    private ServerSocket serverSocket;    private Socket socket;    private Map<String, ObjectOutputStream> mapOnline = new HashMap<String, ObjectOutputStream>();    public int porta;    // nova lista para armazenar todas as janelas ativas    private Map<String, ObjectOutputStream> mapJanelaLista = new HashMap<String, ObjectOutputStream>();    Calendar data = Calendar.getInstance();    int horas = data.get(Calendar.HOUR_OF_DAY);    int minutos = data.get(Calendar.MINUTE);    int segundos = data.get(Calendar.SECOND);    public Servidor(int porta) {                try {            serverSocket = new ServerSocket(porta);            System.out.println("Servidor "+ porta + " Online ");            serverSocket.setSoTimeout(0);            while (true) {                socket = serverSocket.accept();                new Thread(new ListenerSocket(socket)).start();            }        } catch (IOException ex) {        }    }    private class ListenerSocket implements Runnable {        private ObjectOutputStream output;        private ObjectInputStream input;        public ListenerSocket(Socket socket) {            try {                this.output = new ObjectOutputStream(socket.getOutputStream());                this.input = new ObjectInputStream(socket.getInputStream());            } catch (IOException ex) {            }        }        public void run() {            Mensageiro message = null;            try {                while ((message = (Mensageiro) input.readObject()) != null) {                    Acao action = message.getAcao();                    if (action.equals(Acao.CONNECT)) {                        boolean isConnect = conectar(message, output);                        if (isConnect) {                            mapOnline.put(message.getNome(), output);                            enviarOnline();                            enviarJanelaLista();                            System.out.println(message.getNome() + " " + new Date().getHours() + ":" + new Date().getMinutes() + " Entrou ");                        }                    } else if (action.equals(Acao.DISCONNECT)) {                        desconectar(message, output);                        enviarOnline();                        enviarJanelaLista();                        return;                    } else if (action.equals(Acao.SEND_ONE)) {                        enviarUm(message);                    } else if (action.equals(Acao.SEND_ALL)) {                        enviarTodos(message);                    } else if (action.equals(Acao.DISCONNECT_JANELA_LISTA)) { // faz a conexao para a janela da lista                        // remove a janela da lista                        mapJanelaLista.remove(message.getNome());                        // formamos o fim do while (da thread referente) para esta janela                        message = null;                    } else if (action.equals(Acao.CONNECT_JANELA_LISTA)) { // desconecta a janela da lista                        //adiciona a janela na lista                        mapJanelaLista.put(message.getNome(), output);                        enviarJanelaLista();                    }                }            } catch (IOException ex) {                desconectar(message, output);            } catch (ClassNotFoundException ex) {                Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex);            }        }    }    private boolean conectar(Mensageiro message, ObjectOutputStream output) {        for (Map.Entry<String, ObjectOutputStream> kv : mapOnline.entrySet()) {            if (kv.getKey().equalsIgnoreCase(message.getNome())) {                message.setText("NO");                enviar(message, output);                return false;            }        }        if (mapOnline.size() == 0) {            message.setText("YES");            enviar(message, output);            return true;        } else {            message.setText("YES");            enviar(message, output);            return true;        }        // return false;    }    private void desconectar(Mensageiro message, ObjectOutputStream output) {        // como temos agora 2 tipos de mensagem, do chat e da janela, precisamos fazer uns testes extras        if (message != null) {            // vamos aqui retirar um cliente do chat            if (mapOnline.containsKey(message.getNome())) {                mapOnline.remove(message.getNome());                enviarOnline();                enviarJanelaLista();            }            // vamos aqui retirar um janela de lista            if (mapJanelaLista.containsKey(message.getNome())) {                mapJanelaLista.remove(message.getNome());            }            System.out.println(message.getNome() + " " + new Date().getHours() + ":" + new Date().getMinutes() + " Saiu ");        }    }    private void enviar(Mensageiro message, ObjectOutputStream output) {        try {            output.writeObject(message);        } catch (IOException ex) {            Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex);        }    }    private void enviarUm(Mensageiro message) {        for (Map.Entry<String, ObjectOutputStream> kv : mapOnline.entrySet()) {            if (kv.getKey().equals(message.getNomeReservado())) {                try {                    kv.getValue().writeObject(message);                } catch (IOException ex) {                    Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex);                }            }        }    }    private void enviarTodos(Mensageiro message) {        for (Map.Entry<String, ObjectOutputStream> kv : mapOnline.entrySet()) {            if (!kv.getKey().equals(message.getNome())) {                message.setAcao(Acao.SEND_ONE);                try {                    kv.getValue().writeObject(message);                } catch (IOException ex) {                    Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex);                }            }        }    }    private void enviarOnline() {        Set<String> setNames = new HashSet<String>();        for (Map.Entry<String, ObjectOutputStream> kv : mapOnline.entrySet()) {            setNames.add(kv.getKey());        }        Mensageiro message = new Mensageiro();        message.setAcao(Acao.USERS_ONLINE);        message.setSetOnline(setNames);        for (Map.Entry<String, ObjectOutputStream> kv : mapOnline.entrySet()) {            message.setNome(kv.getKey());            try {                kv.getValue().writeObject(message);            } catch (IOException ex) {                Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex);            }        }    }    // esse metodo atualiza a lista de clientes ativos no chat para as janelas da lista que estão abertas    private void enviarJanelaLista() {        Set<String> setNames = new HashSet<String>();        for (Map.Entry<String, ObjectOutputStream> kv : mapOnline.entrySet()) {            setNames.add(kv.getKey());        }        Mensageiro message = new Mensageiro();        message.setAcao(Acao.USERS_ONLINE);        message.setSetOnline(setNames);        for (Map.Entry<String, ObjectOutputStream> kv : mapJanelaLista.entrySet()) {            message.setNome(kv.getKey());            try {                kv.getValue().writeObject(message);            } catch (IOException ex) {                Logger.getLogger(Servidor.class.getName()).log(Level.SEVERE, null, ex);            }        }    }    }
Postado

Bom dia,

 

O problema está no construtor da classe servidor, mais precisamente nesse trecho:

            while (true) {                socket = serverSocket.accept();                new Thread(new ListenerSocket(socket)).start();            }

A execução do construtor nunca será finalizada porque você está esperando novas conexões na mesma thread que está chamando o construtor.

 

Para solucionar o problema você deve criar uma nova thread para ficar aguardando novas conexões.

 

Sugiro também você dar uma estuda na API NIO do java, pois pela quantidade de servidores que você quer criar, ela vai oferecer uma melhor performasse e utilizara menos recursos.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!