Socket x AWT/Swing

Primeiramente gostaria de pedir desculpas se postei no local incorreto minha dúvida.
Meu problema é o seguinte, preciso fazer uma comunicação entre cliente e servidor, neste caso, quando eu completar a venda para certo cliente o servidor mandará os dados do cliente e da venda para o cliente (computador que ficará em seu quarto). Neste computador precisará aparecer Nome, CPF, dados do pacote comprado e os itens que seram ativados (ar condicionado, tv, banheira, luz), esses itens que seram ativados poderam ser modificados dentro do quarto mesmo nesta primeira implementação. Segue o código do Servidor e Cliente:

Servidor

[code]package Controller;

import Model.;
import java.io.
;

import java.net.*;

public class serverSocket {

private static Object clienteSocket;
private static DataOutputStream out;

public static boolean executar(String cpf) {
    Socket clientSocket = null;
    registerSales rs = new registerSales();
    Venda v = rs.Retrieve(cpf + ".txt");
    String nomeCliente = v.getNomeCliente().getNome();
    String cpfCliente = v.getNomeCliente().getCpf();
    String nomePacote = v.getPacote().getNome();
    String itensPacote = v.getPacote().getItens();
    String canais = v.getPacote().getCanais();
    String valorPacote = v.getPacote().getValor();
    String valorTotal = v.getValor();
    try {
        int serverPort = 7000;
        ServerSocket listenSocket = new ServerSocket(serverPort);
        while (true) {
            // esta linha é bloqueante ou seja fica aqui enquanto
            // um cliente não aceita
            clientSocket = listenSocket.accept();
            out = new DataOutputStream(clientSocket.getOutputStream());
            out.writeUTF(nomeCliente + "\nCPF: " + cpfCliente + "\n" + nomePacote + "\n" + itensPacote + "\n" + canais + "\n" + valorPacote + "\n" + valorTotal);
            return false;
        }
    } catch (EOFException e) {
        System.out.println("EOF:" + e.getMessage());
    } catch (IOException e) {
        System.out.println("IO:" + e.getMessage());
    } finally {
        try {
            if (clienteSocket != null) {
                clientSocket.close();
            }
        } catch (IOException e) {/*close failed*/
            System.out.println("Close Failed: " + e.getMessage());
        }
    }// try

    return true;
}// main

}// class[/code]

No caso quando o funcionário clicar no botão Confirmar na tela de venda ele passa o CPF do cliente em questão para esse método do Servidor para que ele mande as informações para o cliente, porém a tela de venda fica “travada” até que o eu rode o cliente, acho que resolvendo o problema do cliente aqui tambem será resolvido.

Cliente

[code]package View;

import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.;
import java.net.
;
import javax.swing.*;

public class ClientWindow extends JFrame implements ActionListener {

public static void main(String[] args) throws IOException, ClassNotFoundException {
    Socket s = null;
    try {
        int serverPort = 7000;
        s = new Socket("127.0.0.1", serverPort);
        DataInputStream ois = new DataInputStream(s.getInputStream());
        String todos = ois.readUTF();
        System.out.println(todos);
    } catch (UnknownHostException e) {
        System.out.println("Sock:" + e.getMessage());
    } catch (EOFException e) {
        System.out.println("EOF:" + e.getMessage());
    } catch (IOException e) {
        System.out.println("IO:" + e.getMessage());
    } finally {
        if (s != null) {
            try {
                s.close();
            } catch (IOException e) {
                System.out.println("close:" + e.getMessage());
            }
        }
    }// try
    ClientWindow cw = new ClientWindow();
    cw.setVisible(true);
} // main
JTextField txt_cpf;
JList list_itens;
JButton btn_pedido;
JButton btn_ambiente;
JLabel lbl_ativado;
JLabel lbl_cpf;
JLabel lbl_lista;
JButton btn_sair;

public ClientWindow() {
    setTitle("Painel de Controle");
    setSize(500, 500);
    setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
    setLayout(null);

    txt_cpf = new JTextField();
    txt_cpf.setBounds(90, 10, 200, 20);
    list_itens = new JList();
    list_itens.setBounds(90, 35, 200, 100);
    btn_pedido = new JButton("Fazer Pedido");
    btn_pedido.setBounds(10, 150, 150, 30);
    btn_pedido.setEnabled(false);
    btn_pedido.setToolTipText("Implementação Futura!");
    btn_ambiente = new JButton("Ambiente");
    btn_ambiente.setBounds(170, 150, 150, 30);
    lbl_ativado = new JLabel("Desativado");
    lbl_ativado.setBounds(300, 10, 150, 20);
    lbl_ativado.setToolTipText("Estado do Painel");
    lbl_cpf = new JLabel("CPF:");
    lbl_cpf.setBounds(10, 10, 150, 20);
    lbl_lista = new JLabel("Listagem:");
    lbl_lista.setBounds(10, 35, 150, 20);
    btn_sair = new JButton("Sair");
    btn_sair.setBounds(85, 185, 150, 30);
    btn_sair.addActionListener(this);

    Container a = this.getContentPane();
    a.add(txt_cpf);
    a.add(list_itens);
    a.add(lbl_cpf);
    a.add(lbl_lista);
    a.add(lbl_ativado);
    a.add(btn_ambiente);
    a.add(btn_pedido);
    a.add(btn_sair);
}

public void actionPerformed(ActionEvent e) {
    if (e.getSource().equals(btn_sair)) {
        this.setVisible(false);
    }
}

}
[/code]

No cliente gostaria de saber como eu posso deixar o cliente em atividade aguardando uma resposta do servidor e como jogaria as informações recebidas na parte gráfica da tela (Jlist, JTextField…).

Outra dúvida. É melhor eu mandar uma mensagem para cada campo de informação que eu quiser que o cliente preencha ou posso mandar tudo concatenado como está?
Aceito sugestões, críticas ou qualquer coisa que me ajudar :lol:

Desde já obrigado à todos.

Bom. Existe bastante coisa nessa sua dúvida, é até difícil responde-la.
Você precisa criar uma Thread para esperar a resposta.

Para transmitir vários dados, crie uma série de mensagens num protocolo. O ideal é usar um protocolo binário, pois é mais leve e mais rápido, e não concatenar coisas em Strings. Dê uma lida nesse tópico:

[quote=ViniGodoy]Bom. Existe bastante coisa nessa sua dúvida, é até difícil responde-la.
Você precisa criar uma Thread para esperar a resposta.

Para transmitir vários dados, crie uma série de mensagens num protocolo. O ideal é usar um protocolo binário, pois é mais leve e mais rápido, e não concatenar coisas em Strings. Dê uma lida nesse tópico:
http://www.guj.com.br/java/o-que-eh-um-protocolo#735860[/quote]

Obrigado pela resposta, porém o link não está funcionando (Error 404). :?

Corrigido.

Obrigado, vou ler o tópico.

Desculpe a demora, eu li o tópico que o ViniGodoy me mandou, porém não entendi como posso como adaptar para meu projeto.
Não foi dada a parte de Sockets ainda na faculdade, os professores deram o projeto no começo do semestre e no meio dele resolveram mandar todos implementarem sockets, mas disseram que teríamos que nos virar pois seria matéria dada no semestre que vem.
Então ainda tenho um pouco de dificuldade para entender essa parte, vou dar uma procurada melhor em outros tópicos sobre Threads e Sockets, mas se alguem tiver um exemplo ou explicação será de grande ajuda também.