Problema na troca de mensagens do Socket

6 respostas
moacirjava

Pessoal meu problema não é grande só não tenho experiência pra isso…

é o seguinte, baseando no livro do deitel (java como programar 6ª) eu achei um código que modificado ficou com um problema que é + ou - assim, eu digito uma mensagem em um jtext do cliente (ou do servidor) e ele já aparece na outra telinha instantaneamente, sem precisar de clicar no botão.

Como eu faço para as mensagens serem passadas para a outra janelinha só depois de clicar no botão?

import java.io.*;
import java.net.*;
import msn.telas.*;

public class Cliente {
     
    private String mensagem;
    private DataOutputStream saida;
    private DataInputStream entrada;
    private Socket cliente;     
    private TelaCliente telacliente;

    public Cliente(String IP, int porta) {
        //Passo 1: Criar socket
        
        try{
            cliente = new Socket(InetAddress.getByName(IP), porta);
            telacliente = new TelaCliente();
            telacliente.setVisible(true);
            }catch (EOFException eof) {
                System.out.println("\nConexao finalizada com servidor - erro \n");
		eof.printStackTrace();
            }catch (IOException e) {
		e.printStackTrace();
	}
    }
    
    
    /***********************************************************
     * Efetua o tratamento para deixar o cliente conectado com o servidor   *
     ***********************************************************/
    public void runCliente(){
        Scanner msn = new Scanner (System.in);
        try {
            //Passo 1: Inicia socket cliente
            System.out.println("Conectando ....");
            
            System.out.println("Conectando ao Servidor: " + cliente.getInetAddress().getHostName());

            //Passo 2: Obtendo os fluxos de entrada e de sai­da
            System.out.println("Obtendo streans de entrada e saida");
            
            saida = new DataOutputStream (cliente.getOutputStream());
            entrada = new DataInputStream (cliente.getInputStream());
            saida.flush();
            
            //Passo 4: Estabelecendo conexão com o servidor
            do{
                try{
                    //obtem mensagem enviada pelo servidor
                    mensagem = (String) entrada.readUTF();
                    
                    telacliente.setTextArea1(mensagem);
                    
                    //inicia comunicação aguardando o cliente digitar a mensagem
                    System.out.print("CLIENTE >>");
                    
                    mensagem = telacliente.getJTextField3();
                    sendData(mensagem);            
                     
                    }catch (Exception cnfex) {
                        System.out.println( "\n Objeto de conexao desconhecido\n");
                    }

            }while(!mensagem.equals("HALT") );

            //PASSO 4: Fecha a conexao
            System.out.println("\nFechando conexao\n");
            entrada.close();
            saida.close();
            cliente.close();
            
            }catch (EOFException eof) {
                System.out.println("\nConexao finalizada com servidor\n");
            }catch (IOException e) {
                e.printStackTrace();
            }
	}
    
    
    /*******************************************************
     * Metodo utilizado para o envio de mensagem para um servidor   *
     *******************************************************/
    public void sendData (String s){
        try{
            saida.writeUTF(s);
            saida.flush();
            }catch (IOException cnfex) {
                System.out.println("\nErro ao gravar dados");
            }
	}


     public static void main (String args[]){

	Cliente c = new Cliente("127.0.0.1", 5000);   
         
	c.runCliente(); 
    }
    
}

E esse é o servidor…

package Fluxo;

import java.io.*;
import java.net.*;
import msn.telas.TelaServidor;
import msn.telas.TelaCliente;

public class Servidor {
    
    private ServerSocket servidor;
    private Socket connection;
    private int contador=1;
    private String mensagem;
    private DataOutputStream saida;
    private DataInputStream entrada;
    private TelaServidor telaservidor;

    public Servidor(int porta, int tamFila) {
        
        try{

            servidor = new ServerSocket(porta, tamFila);
            
            telaservidor = new TelaServidor();
            telaservidor.setVisible(true);
            
        }catch (EOFException eof) {
            System.out.println("\n Erro de conexao com o cliente\n");
	    eof.printStackTrace();
	
	}catch (IOException io) {
            io.printStackTrace();
	}
    }
    
    /******************************************************************
     * Efetua o tratamento para deixar o cliente conectado com o servidor                  *
     ********************************************************************/
    public void runServidor(){
        
        try{
            while( true ){
                //Passo 2: Espera uma conexao
                System.out.println("\nEsperando Conexao...\n");

                //Cria a conexao.
                connection = servidor.accept(); 
                
                System.out.println("\nConexao  " + contador + " recebido de: " + 
                        connection.getInetAddress().getHostName());

                //Passo 3: obtendo os fluxos de entrada e saida
                
                //responsável por emitir a resposta ao cliente.
                saida = new DataOutputStream(connection.getOutputStream());
                //responsável por receber a resposta do cliente.
                entrada =  new DataInputStream(connection.getInputStream());			
                //esvazia o buffer.
                saida.flush();
                

                System.out.println("\n Pegando streans (fluxos) de entrada e saida\n");

                //Passo 4: Processando conexao com cliente
                mensagem = "sucesso na conexao\n";
                saida.writeUTF(telaservidor.getJTextField3());
                saida.flush();
                
                do{
                    try{
                        //Lendo dados enviados pelo cliente
                        mensagem = entrada.readUTF();
                        //Coloca a mensagem enviada pelo cliente na tela do servidor.
                        telaservidor.setTextArea1(mensagem);

                        //Preparando para enviar dados para o cliente
			if (!mensagem.equals("HALT")){
                            System.out.print("\n SERVIDOR >>");
                           
                                mensagem = telaservidor.getJTextField3();
                                sendData(mensagem);
                            }//fim if.
                        
                        }catch (Exception cnfex) {
                            System.out.println("\n Objeto redebido desconhecido - ERRO!!");
			}
                    } while (!mensagem.equals("HALT"));
                
                //Passo 5: Fecha a conexão
		System.out.println("\n FIM DE CONEXAO COM CLIENTE " + 
		connection.getInetAddress().getHostName());
		++contador;
                }
            }catch (EOFException eof) {
                System.out.println("FIM DE CONEXAO COM CLIENTE ");
            }catch (IOException io) {
                io.printStackTrace();
            }
	}
    
	
       /********************************************************************************
        * Método utilizado para o envio de mensagem para um servidor                   *
        *******************************************************************************/
	public void sendData (String s)	{
            try{
                saida.writeUTF(s);
                saida.flush();
                }catch (IOException cnfex) {
                    System.out.println("\n Erro ao escrever stream!!");
                }
            }


        public static void main(String args[]){
           Servidor s = new Servidor(5000, 0);

           s.runServidor();
       }

}

6 Respostas

EugenioMonteiro

Coloca um evento de tecla do jTextField para quando você clicar ENTER ele executar a função de envio.

Procura por tutoriais sobre eventos.

moacirjava

to apanhando é nesse trecho de código

try{
      //Lendo dados enviados pelo cliente
      mensagem = entrada.readUTF();
       //Coloca a mensagem enviada pelo cliente na tela do servidor.
      telaservidor.setTextArea1(mensagem);

       //Preparando para enviar dados para o cliente
       if (!mensagem.equals("HALT")){
              System.out.print("\n SERVIDOR >>");
              mensagem = telaservidor.getJTextField3();<-------ACHO QUE MEU PROBLEMA MAIOR TÁ AQUI...
             sendData(mensagem);
      }//fim if.
                       
      }catch (Exception cnfex) {
                 System.out.println("\n Objeto redebido desconhecido - ERRO!!");
         }
      } while (!mensagem.equals("HALT"));
jessetsilva

acho que se vc colocar aquele pequenho trecho de codigo dentro de uma ação de um botão resolve teu problema, pq dai ele só sera ativo quando vc clicar em por exemplo: enviar

//Preparando para enviar dados para o cliente

if (!mensagem.equals(HALT)){

System.out.print("\n SERVIDOR >>");

mensagem = telaservidor.getJTextField3();<-------ACHO QUE MEU PROBLEMA MAIOR  AQUIsendData(mensagem);

}//fim if.

tenta dar uma isolada neste trecho e chama-lo apenas quando a mesagem do jtextfield estiver terminada

ViniGodoy

Além do que o pessoal falou, uma outra forma, mais intuitiva, é você também definir o seu botão de enviar como botão padrão. É interessante também porque ele fica desenhado de maneira mais forte.

Para fazer isso dê o seguinte comando após criar o botão do seu JFrame:

this.getRootPane().setDefaultButton(btnEnviar);

Isso faz com que o texto seja enviado também se seu usuário pressionar enter, sem que ele tenha que deslocar o mouse até o botão.

O evento irá forçar ele a usar o mouse e o default button torna o uso confortável. :slight_smile:

moacirjava

Não funcionou… :cry:

Dei uma mudada no código segundo conselhos e olha só:

Pessoal, a negócio tá brabo…

Dêem uma olhada…

Tenho uma aplicação que está utilizando Sockets de Cliente e Servidor, só que na mesma janela, abaixo tem uma foto pra ilustrar o que digo…

nesses campos onde tem porta e IP não está sendo usado no momento. O aplicativo tem de receber algo na caixa de texto e jogar no textArea acima.

Daí na aplicação, eu tenho de startar o servidor junto com o cliente, isso é feito nesse código aqui:

package msn.telas;
import Fluxo.Cliente;
import Fluxo.Servidor;

public class TelaCliente extends javax.swing.JFrame {
    
    private int porta = 0;
    private int ip = 0;
    
    private Cliente cliente;
    
    public TelaCliente() { // no construtor, starto o servidor e cliente.
        initComponents();
        this.setVisible(true);
        this.setSize(400,350);
        this.setLocation(90,20);
        
        Servidor s = new Servidor(5000,0,this.jTextArea1);
        System.out.println("Instanciando Servidor na classe TelaCliente.");
        
        System.out.println("Instanciando Cliente na classe TelaCliente.");
        cliente = new Cliente("127.0.0.1",5000);
        
        System.out.println("Executando o método 'runServidor()'");
        s.runServidor();
    }
   
    
    private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jButton1MouseClicked
        cliente.runCliente(jTextField3.getText()); //esse botão dispara o método que irá mandar a mensagem.
    }
      
    public static void main(String args[]){
        System.out.println("Criando tela do cliente.");
        new TelaCliente().setVisible(true);
        
    }
    
}

Esse é meu Cliente:

package Fluxo;

import java.io.*;
import java.net.*;
import java.util.Scanner;
import msn.telas.*;

public class Cliente {
    
    
    private String mensagem;
    private DataOutputStream saida;
    private DataInputStream entrada;
    private Socket cliente;     
    private TelaCliente telacliente;

    public Cliente(String IP, int porta) {
        try{
            cliente = new Socket(InetAddress.getByName(IP), porta);
            
            }catch (EOFException eof) {
                System.out.println("\nConexao finalizada com servidor - erro \n");
		eof.printStackTrace();
            }catch (IOException e) {
		e.printStackTrace();
	}
    }
    
    public void runCliente(String msg){
        try {     
            System.out.println("Iniciando o método 'runCliente(String msg').");
            
            saida = new DataOutputStream (cliente.getOutputStream());
            saida.flush();
            try{
                System.out.println("Enviando mensagem...");
                saida.writeUTF(msg);
                saida.flush();
                }catch (Exception cnfex) {
                   System.out.println( "\n Objeto de conexao desconhecido\n");
                }
               

                System.out.println("Fechando conexão cliente.");
                saida.close();
                cliente.close();
            
            }catch (EOFException eof) {
                System.out.println("\nConexao finalizada com servidor\n");
            }catch (IOException e) {
                e.printStackTrace();
            }
	}
}

E meu Servidor:

package Fluxo;

import java.io.*;
import java.net.*;
import java.util.Scanner;
import javax.swing.JTextArea;
import msn.telas.TelaServidor;
import msn.telas.TelaCliente;

public class Servidor {
    
    private ServerSocket servidor;
    private Socket connection;
    private int contador=1;
    private String mensagem;
    private DataOutputStream saida;
    private DataInputStream entrada;
    
    private JTextArea jt;
    
    public Servidor(int porta, int tamFila, JTextArea jt) {
        try{
            this.jt = jt;
            
            servidor = new ServerSocket(porta, tamFila);
                                  
        }catch (EOFException eof) {
            System.out.println("\n Erro de conexao com o cliente\n");
	    eof.printStackTrace();
	}catch (IOException io) {
            io.printStackTrace();
	}
    }
    
    public void runServidor(){    
        try{
            while( true ){
                
                connection = servidor.accept(); 
                entrada =  new DataInputStream(connection.getInputStream());	
                
                System.out.println("Conexão recebida.");
                
                try{
                    mensagem = jt.getText(); //aqui deveria aparecer a mensagem e posteriormente escreve-la no System.out.
                    jt.setText(mensagem);
                    System.out.println("Mensagem : " + mensagem);
                    
                    }catch (Exception cnfex) {
                        System.out.println("\n Objeto redebido desconhecido - ERRO!!");
                    }
                }
            }catch (EOFException eof){
                System.out.println("FIM DE CONEXAO COM CLIENTE ");
            }catch (IOException io) {
                io.printStackTrace();
            }
	}
}

Só que não tá fazendo certo, poderiam me ajudar…? :cry: :cry:

moacirjava

?

Criado 1 de março de 2008
Ultima resposta 4 de mar. de 2008
Respostas 6
Participantes 4