Problema com sockets e text area

Ola galera tudo bem?
Alguém poderia ajudar a resolver um problema:
Seguinte,estou tentando criar um chat em java,porém os soquetes se conectam(socket e o socketserver),porém ao retornar uma mensagem para a aplicação cliente a variável não aparece no textarea da aplicação cliente com o método settext.

ai vai a aplicação cliente:


package conexao_rede;
import java.io.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;

class cliente_rede extends javax.swing.JFrame {
         Socket socket;
      
    
    public cliente_rede() {
        initComponents();
        setSize(400,300);
    }
    
    public  void gera_conexao(){
        try {
           socket=new Socket("127.0.0.1",4585);
           InputStreamReader reader=new InputStreamReader(socket.getInputStream());
           BufferedReader read=new BufferedReader(reader);
           String mensagem = null;
           while(read.readLine()!=null){
               mensagem=read.readLine();
           }
           
           jtaconversa.setText(mensagem);
        } 
        
        catch (UnknownHostException ex) {
            Logger.getLogger(cliente_rede.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(cliente_rede.class.getName()).log(Level.SEVERE, null, ex);
        }
        
                
    }
    
   

   
  
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jtfmensagem = new javax.swing.JTextField();
        jbtenviar = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        jtaconversa = new javax.swing.JTextArea();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        getContentPane().setLayout(null);

        jPanel1.setLayout(null);
        jPanel1.add(jtfmensagem);
        jtfmensagem.setBounds(40, 250, 260, 30);

        jbtenviar.setText("Enviar");
        jPanel1.add(jbtenviar);
        jbtenviar.setBounds(310, 250, 75, 23);

        jtaconversa.setColumns(20);
        jtaconversa.setRows(5);
        jScrollPane1.setViewportView(jtaconversa);

        jPanel1.add(jScrollPane1);
        jScrollPane1.setBounds(40, 10, 260, 220);

        getContentPane().add(jPanel1);
        jPanel1.setBounds(0, 0, 400, 300);

        pack();
    }// </editor-fold>

   
    public static void main(String args[]) {
      
     cliente_rede cliente=new cliente_rede();
     cliente.setVisible(true);
      
     cliente.gera_conexao();
     
      
    }
    // Variables declaration - do not modify
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JButton jbtenviar;
    private javax.swing.JTextArea jtaconversa;
    private javax.swing.JTextField jtfmensagem;
    // End of variables declaration
}


e abaixo o código da aplicação servidor:

package conexao_rede;
import java.io.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;

class servidor_rede extends javax.swing.JFrame {
        
    
    public servidor_rede() {
        initComponents();
        setSize(400,300);
    }
    
    public void gera_conexao(){
        try {
            
           ServerSocket socket=new ServerSocket(4585);
           while(true){
            Socket socketrecepcao=socket.accept();
            PrintWriter writer=new PrintWriter(socketrecepcao.getOutputStream());
            writer.println("ola bom dia");
            writer.flush();
               
           }
            
        } catch (UnknownHostException ex) {
            Logger.getLogger(servidor_rede.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(servidor_rede.class.getName()).log(Level.SEVERE, null, ex);
        }
        
                
    }
    
 

   
    
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jtfmensagem = new javax.swing.JTextField();
        jbtenviar = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        jtaconversa = new javax.swing.JTextArea();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        getContentPane().setLayout(null);

        jPanel1.setLayout(null);
        jPanel1.add(jtfmensagem);
        jtfmensagem.setBounds(40, 250, 260, 30);

        jbtenviar.setText("Enviar");
        jPanel1.add(jbtenviar);
        jbtenviar.setBounds(310, 250, 75, 23);

        jtaconversa.setColumns(20);
        jtaconversa.setRows(5);
        jScrollPane1.setViewportView(jtaconversa);

        jPanel1.add(jScrollPane1);
        jScrollPane1.setBounds(40, 10, 260, 220);

        getContentPane().add(jPanel1);
        jPanel1.setBounds(0, 0, 400, 300);

        pack();
    }// </editor-fold>

   
    public static void main(String args[]) {
      new servidor_rede().setVisible(true);
      
      servidor_rede server=new servidor_rede();
      server.gera_conexao();
    }
    // Variables declaration - do not modify
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JButton jbtenviar;
    private javax.swing.JTextArea jtaconversa;
    private javax.swing.JTextField jtfmensagem;
    // End of variables declaration
}

Se alguma boa alma puder me ajudar,ficarei muito agradecido!!!

Você precisa disparar a leitura do socket numa thread secundária.

Entendi Viny,mas o que eu não entendi é pq por exemplo se eu usar na aplicação cliente o System.Out.Println ou o JOptionPane.ShowMessageDialog a varíavel é lida no console(Ola bom dia) e no text area não?

O Swing roda numa thread, que faz o seguinte:

while (true) { desenhaATela(); processaEventos(); }

Quando você roda seu código na mesma thread do Swing, na fase de “processarEventos” você trava esse loop e a tela nunca é redesenhada.

No caso do System.out, esse loop não existe. Tudo que você envia para o System.out é imediatamente jogado para o sistema operacional, que desenha imediatamente o que foi escrito.

Agora eu entendi!!. Obrigadão Viny pela explicação,Obrigado mesmo,fica com Deus e ate á proxima!!!

Vini godoy,fiz da forma que vc disse,mas mesmo assim não funcionou,o que ainda está dando errado?Se puder me ajudar eu lhe agradeço!

Abaixo segue o código:

Aplicação cliente:



package conexao_rede;

import java.awt.BorderLayout;
import javax.swing.*;
import java.net.*;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class conexao_cliente {

    Socket socket;
    JFrame frame;
    JTextField field;
    JButton button;
    JTextArea text;
    JPanel painel;

    public void gui() {

        frame = new JFrame("Cliente");
        button = new JButton("Enviar");
        text = new JTextArea(10,20);
        field = new JTextField(20);
        painel = new JPanel();

        painel.add(BorderLayout.SOUTH, button);
        painel.add(BorderLayout.SOUTH, field);
        painel.add(BorderLayout.CENTER, text);
        frame.getContentPane().add(painel);
        Thread a=new Thread(new recebe_mensagem());
        a.start();
        frame.setSize(400,300);
        frame.setVisible(true);
      



    }

    public static void main(String[] args) {
     new conexao_cliente().gui();
    }

    public class recebe_mensagem implements Runnable {

        public void run() {

            try {
                socket = new Socket("127.0.0.1", 4585);
                InputStreamReader reader = new InputStreamReader(socket.getInputStream());
                BufferedReader read = new BufferedReader(reader);
                while (read.readLine() != null) {
                    text.setText(text.getText() + "\n" + read.readLine());

                }

            } catch (UnknownHostException ex) {
                Logger.getLogger(conexao_cliente.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(conexao_cliente.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
}

Aplicação servidor:






package conexao_rede;

import java.awt.BorderLayout;
import javax.swing.*;
import java.net.*;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class servidor_rede {
    
     ServerSocket socket;
    JFrame frame;
    JTextField field;
    JButton button;
    JTextArea text;
    JPanel painel;

    public void gui() {

        frame = new JFrame("Cliente");
        button = new JButton("Enviar");
        text = new JTextArea(10,20);
        field = new JTextField(20);
        painel = new JPanel();

        painel.add(BorderLayout.SOUTH, button);
        painel.add(BorderLayout.SOUTH, field);
        painel.add(BorderLayout.CENTER, text);
        frame.getContentPane().add(painel);
          
        
        
        frame.setSize(400,300);
        frame.setVisible(true);
       envia_mensagem();  



    }

    
    public void envia_mensagem(){
        try {
            socket= new ServerSocket(4585);
            while(true){
                Socket socketrecepcao=socket.accept();
                PrintWriter printer=new PrintWriter(socketrecepcao.getOutputStream());
                printer.println("ola tudo bem?");
                printer.flush();
                
            }
            
        } catch (IOException ex) {
            Logger.getLogger(servidor_rede.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }
    
    public static void main(String[] args) {
     new servidor_rede().gui();
    }

    
    
}

Por favor galera,quem puder me ajudar!!!,preciso disso para um trabalho na faculdade,preciso fazer isso funfar e ate agora nada!!!
Quem puder me ajudar,eu agradeço!!!

Se puder esperar a noite eu tento te ajudar!

Ok,espero sim,obrigado !
desde já agradeço pela atenção!!!
Fica com Deus e ate a noite!!!

O seu problema agora é outro: sockets não são muito adequados para criar protocolos do tipo texto -mesmo http, que é um protocolo texto, tem um campo chamado ContentLength: que serve justamente para indicar qual é o tamanho dos dados que seguem depois.
Se quiser continuar nessa linha, experimente, imediatamente depois de abrir o socket (tanto na parte server quanto na client), setar a opção TCP_NODELAY para True (procure por isso em http://docs.oracle.com/javase/6/docs/api/java/net/Socket.html#setTcpNoDelay(boolean)

Então vc me aconselharia a trabalhar com o que ? ja que sockets não são adequados para o tipo texto,coloquei aqui a opção settcpnodelay tanto no server quanto no cliente para true e não funcionou!!!se tiver outra idéia fico agradecido amigão!!!um abraço!!!