Re:nao troca mensagem aplicação cliente x servidor
6 respostas
M
mizael86
Mano é um seguinte, quando eu mexo com socket eu utilizo uns metodos diferentes para receber e enviar mensagens, nao vou dizer que o seu codigo esta errado pois nao testei. Mais vai la minha posição:
Quando vc da um serversocket.accept() esse metodo fica em estado de espera ate que alguem tente se conectar utilizando a sua maquina na porta que vc abriu. Quando alguem tenta conectar esse metodo retorna o objeto Socket da conexao. Ate ae blza. Agora para enviar e receber mensagens eu crio um BufferedReader para a leitura. Essa classe possui o metodo readLine(), esse metodo fica em espera tbm ate que a outra ponta envie uma mensagem, quando ela envia, esse metodo começa a retornar linha a linha, caso ela nao envia, ele continua em espera enquanto a conexao estiver aberta. Tanto no lado cliente quanto no servidor vc tem que deixar ele totalmetne em escuta, esperando por mensagens. Vc pode enviar quantas mensagens quizer mesmo estando em estado de espera, pois pra isso que serve as thread, porem para vc conseguir receber, vc tem que esta sempre esperando mensagens, e nao simplesmente da um read quando vc achar q vai vim mensagem. Caso vc nao tenha entendido eu postarei um codigo padrao de cliente e servidor que costumo usar.
Para receber vc tem que por isso no run da thread, ele vai ficar em espera e retornar uma linha cada vez que receber.
e pra enviar vc pode usar um PrintWriter e da um println depois um flush().
M
mizael86
Ah outra coisa, o ideal é que tanto a classe cliente quanto servidor extenda Thread, pois se nao sua aplicacao vai ficar travada esperando mensagem, e vc nao podera fazer mais nada alem de esperar.
I
igson_mendes_da_silv
packagetce.am.gov.br.cliente;importjava.io.EOFException;importjava.io.IOException;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.net.InetAddress;importjava.net.Socket;importjava.net.UnknownHostException;publicclassCliente{privateSocketconexao;privateStringhost;privateObjectOutputStreamenviar;privateObjectInputStreamreceber;publicCliente(Stringhost){this.host=host;}publicvoidrun(){try{iniciarConexao();fluxoMensagem();receberMensagem();}catch(EOFExceptione){System.out.println("Conexao finalizada");}catch(UnknownHostExceptione){e.printStackTrace();}catch(IOExceptione){e.printStackTrace();}}privatevoidiniciarConexao()throwsUnknownHostException,IOException{System.out.println("Cliente solicitando conexão.");conexao=newSocket(InetAddress.getByName(host),12345);System.out.println(" Conexão estabelecida com : "+conexao.getInetAddress().getHostName());}privatevoidfluxoMensagem()throwsIOException{enviar=newObjectOutputStream(conexao.getOutputStream());enviar.flush();receber=newObjectInputStream(conexao.getInputStream());}publicvoidreceberMensagem()throwsIOException{System.out.println("Agaurdando Mensagem do Servidor...");enviarMensagem("Obirgado !");Stringmensagem="";try{do{mensagem=(String)receber.readObject();System.out.println("Servidor >> "+mensagem);System.out.println("Esta dentro do looping do cliente");}while(!mensagem.equals(""));}catch(ClassNotFoundExceptione){// TODO Auto-generated catch blocke.printStackTrace();}}publicvoidenviarMensagem(Stringmensagem)throwsIOException{enviar.writeObject(mensagem);enviar.flush();}privatevoidfecharConexao()throwsIOException{enviar.close();receber.close();conexao.close();}publicstaticvoidmain(String[]args){Clientecliente=newCliente("127.0.0.1");cliente.run();try{cliente.enviarMensagem("teste cliente 1");}catch(IOExceptione){// TODO Auto-generated catch blocke.printStackTrace();}}}
Servidor
packagetce.am.gov.br.servidor;importjava.io.EOFException;importjava.io.IOException;importjava.io.ObjectInputStream;importjava.io.ObjectOutputStream;importjava.net.ServerSocket;importjava.net.Socket;publicclassServidor{privateServerSocketservidor;privateSocketconexao;privateObjectOutputStreamenviar;privateObjectInputStreamreceber;publicvoidiniciarServidor(){try{servidor=newServerSocket(12345);}catch(IOExceptione){System.out.println("Conexão não estabelecida com o cliente.");}try{while(true){aguardarConexao();fluxoMensagem();receberMensagem();}}catch(IOExceptione){System.out.println("Erro na ");}}privatevoidaguardarConexao()throwsIOException{System.out.println("Servidor aguardando conexão...\n");conexao=servidor.accept();System.out.println(" Conexão estabelecida com : "+conexao.getInetAddress().getHostName());}privatevoidfluxoMensagem()throwsIOException{enviar=newObjectOutputStream(conexao.getOutputStream());enviar.flush();receber=newObjectInputStream(conexao.getInputStream());}privatevoidfecharConexao()throwsIOException{enviar.close();receber.close();conexao.close();}privatevoidenviarMensagem(Stringmensagem)throwsIOException{enviar.writeObject(mensagem);enviar.flush();}privatevoidreceberMensagem()throwsIOException{System.out.println("Agaurdando Mensagem do CLiente...");enviarMensagem("Seja Bem Vindo !");Stringmensagem="";try{do{mensagem=(String)receber.readObject();System.out.println("Cliente >> "+mensagem);System.out.println("Esta dentro do looping do servidor");}while(!mensagem.equals(""));}catch(ClassNotFoundExceptione){e.printStackTrace();}}publicstaticvoidmain(String[]args){Servidorserver=newServidor();server.iniciarServidor();try{server.enviarMensagem("Olá !");}catch(IOExceptione){// TODO Auto-generated catch blocke.printStackTrace();}}}
Gente depos que o clinte realiza conexao com o servidor não ocorre a troca de mensagem !!!
Alguem pude me ajudar a identificar onde esta o bug !?!?!?
I
igson_mendes_da_silv
Alguem pode ajudar…é so a troca da mensagem ke nao esta ocorrendo !!!
I
igson_mendes_da_silv
Só basta eu colocar um extends Thread !!???
I
igson_mendes_da_silv
Ainda não funcionou !!!
O cliente e servidor fica se ouvindo todo momento .