Chat multi usuários com Socket e Interface Swing

Este post foi removido e transferido para a seguinte url:

http://www.mballem.com/post/chat-multi-usuarios-com-socket-e-interface-swing

, ,

  1. #1 por Luis Augusto em 03/03/2013 - 19:27

    Vc pode me mandar esse arquivos?

  2. #2 por MBallem em 03/03/2013 - 20:18

    Olá Luis Augusto!
    Assista aos vídeos que você terá condições de montar o projeto sem problemas.

  3. #3 por Luis Augusto em 07/03/2013 - 23:04

    no Meu ele ta dando classNotFound quando converte o objectInputStream pra mensagem

  4. #4 por MBallem em 07/03/2013 - 23:18

    Olá Luiz, qual classe ele diz não encontrar na exceção lançada?

  5. #5 por Jackson em 30/03/2013 - 1:56

    ola amigo fiz igualzinho ao q vc fez, so q no meu textAreaREceive nao esta aperecendo o texto

  6. #6 por MBallem em 30/03/2013 - 11:50

    Olá Jackson. Revise novamente o que você fez. Deve ter alguma coisa que você deixou de fazer.

  7. #7 por Jackson em 30/03/2013 - 16:38

    cara vlw a força, mas desistir, revisei 2 vezes, vc pode nao acreditar mais fiz igual, mas nao consigo enviar a msg para todos, acabei desistindo

  8. #8 por Jackson em 30/03/2013 - 17:18

    cara nao tem como vc enviar as class nao, pois eu nao tou acreditando pq nao ta dando certo, quando coloco if(text.isEmpty()) no evento do botao enviar o cliente so envia a msg se estiver vazio o campo de txtAreaSend e ele envia pra ele mesmo, chamando o nome dele e a msn e tambem this.txtAreaReceive.append(“Voce disse: ” + text);, nao tou conseguindo resolver, me ajuda ai

  9. #9 por MBallem em 30/03/2013 - 17:59

    Jackson, o teste não é if (text.isEmpty()) e sim if (!text.isEmpty()) Você precisa testar se o campo é diferente de vazio e não se é igual a vazio.

  10. #10 por Jackson em 30/03/2013 - 23:10

    realmente, so que esta enfiando pra ele mesmo, nao para os outros

  11. #11 por Jackson em 31/03/2013 - 11:59

    vlw amigo, conseguir resolver o problema, so que apareceu outro rsrsrs, quando seleciono a pessoa pra enviar a msg reservada ainda continua indo pra todos

  12. #12 por MBallem em 31/03/2013 - 13:58

    Você tem certeza que quando envia a mensagem de forma reservada está enviando uma mensagem do tipo SEND_ONE? Faça um teste no método enviar do cliente, para ver se quando você seleciona um nome reservado ele realmente entra no IF que seta a mensagem como SEND_ONE.

    E no servidor, quando ele receber a mensagem o método que deve trata-la é o sendOne(), onde ele verificará na lista de clientes qual o cliente que ele deve enviar a mensagem de forma reservada.

  13. #13 por Jackson em 31/03/2013 - 15:05

    ele entra, mas nao executa, outra coisa tou fazendo um pra faculdade aonde tem q ter um interface grafica no servidor tbm e passar a porta para conectar, me dar um dica ai, pois a porta é um inteiro, como passa numa textfield??? me ajuda ai cara

  14. #14 por MBallem em 31/03/2013 - 16:58

    Na questão da porta é bem simples. Você recebe da interface gráfica uma String, basta converte-la em um int/Integer antes de inserir na variavel da porta do socket. Algo desse tipo:

    String s = jtextfield.getText();
    int v = Integer.parseInt(s);
    int porta = v;
    
  15. #15 por Jackson em 01/04/2013 - 2:05

    vlw cara pela ajuda que voce ta me dando, so que fiquei na duvida eu coloco isso ai no evento do botao conectar??? e como faço pra atribuir esse valor la no clienteService dizendo a porta que vou utilizar?? vlw pela atençao

  16. #16 por Raquel Amorim em 01/04/2013 - 10:48

    Olá, Marcio.
    Tudo bem?
    Obrigada pelas dicas.
    Assisti às suas vídeo-aulas e estão muito bem explicadas.
    Gostaria de um esclarecimento….
    Esse chat é somente desktop, onde somente as pessoas que estejam na mesma rede consigam se conectar, conversar?
    Teria como fazê-lo virar web? Se sim, como eu poderia fazer, por favor?
    Obrigada!

  17. #17 por MBallem em 01/04/2013 - 10:51

    eu coloco isso ai no evento do botao conectar?
    Pode colocar sim, mas vai depender de como você está montando seu projeto. O mais simples para você, seria criar a interface gráfica na mesma classe do seu servidor.

  18. #18 por MBallem em 01/04/2013 - 10:55

    Olá Raquel Amorim, sim é só desktop. Para web o melhor é tentar usar web-socket. Dê uma olhada nesse post http://www.devmedia.com.br/introducao-a-websockets-com-tomcat-7/26932

  19. #19 por Raquel Amorim em 01/04/2013 - 11:52

    Oi, Marcio.
    Obrigada, era isso mesmo que eu precisava, hehe. Já deu uma luz do que tenho que fazer, rsrsrs
    🙂
    É um trabalho da facul com WebSockets.
    Bom trabalho!
    Abraços

  20. #20 por Jackson em 01/04/2013 - 14:26

    tem como me fazer um exemplo de como eu passar a porta pelo textfeld da interface do servidor e joga no serverSocket = new ServerSocket (porta)

  21. #21 por MBallem em 01/04/2013 - 16:46

    Jackson, vamos dizer que você tem um botão conectar e um campo porta. No evento do botão conectar você lê o campo porta e captura o valor da porta, como eu exemplifiquei antes para você. Depois disso, basta passar o n° da porta como parâmetro para o método que inicializa seu servidor.

    Uma dica, visite o forum guj.com.br e crie um post lá sobre sua dúvida. O fluxo de usuários lá é grande e rapidamente você deve conseguir varias dicas. Se quiser, depois de criar o post, volte aqui e cole o link do seu post que quando puder eu apareço lá também.

  22. #22 por Jackson em 01/04/2013 - 23:47

    vlw cara pela força, mas isso é pra essa quarta agora, acredito q nao der mais tempo. Vlw pela atençao

  23. #23 por Jackson em 04/04/2013 - 16:09

    amigao vlw pela dica, demorou mais conseguir resolver, so ficou um problema em fazer um interface grafica no servidor, estou seguindo seu exemplo, vc acha melhor eu fazer essa interface na classe Servidor Service mesmo??? me dar uma luz ai de como devo resolver da maneira mais facil

  24. #24 por MBallem em 04/04/2013 - 16:47

    Oi Jackson! Eu acho que você pode sim fazer a interface na mesma classe do servidor. Vai ficar mais fácil para você trabalhar.

  25. #25 por Jackson em 07/04/2013 - 11:07

    hum, mas tem q ser uma class java ou form JFrame??? o ServidorService

  26. #26 por MBallem em 07/04/2013 - 13:14

    Será ambos. Faça como eu fiz no ClienteFrame, porém ao invés de ser um cliente, você vai construir o servidor.

  27. #27 por Jackson em 08/04/2013 - 18:41

    mas, o que tem la em ServidorService muda alguma coisa, porquer em ClienteService é diferente do ServidorService.

  28. #28 por MBallem em 08/04/2013 - 20:10

    Sim, muda, mas você precisa apenas adicionar a parte de interface gráfica. Onde pelo que eu entendi que você precisa, vai adicionar um campo para a porta e um botão para iniciar o servidor. A alteração feita será bem simples.
    No evento do botão você captura o numero da porta e adiciona como parâmetro no objeto que inicializa o servidor.

  29. #29 por Jackson em 08/04/2013 - 22:56

    entao vc acha q devo fazer a interface grafica na cloasse ServidorService “feita na mao”??? em vez de cliar um ServidorFrame do tipo JFrame??? vlw pela atençao

  30. #30 por MBallem em 09/04/2013 - 0:33

    Não, não precisa ser feita a mão. Pode usar o JFrame do Netbeans sem problemas. Como eu fiz na classe cliente. A diferença é que no cliente eu separei a classe de conexão e envio de mensagem só para o código não ficar tão grande. Se colocar o código dentro da classe com a interface, vai funcionar também, é isso que você deverá fazer no servidor.

  31. #31 por Jackson em 10/04/2013 - 1:10

    amigo vou novamente precisar uma grande força sua, segue o que voce e implemntei essa class JFrame:

    package Jackson.Frame;

    import Jackson.bean.ChatMessage;
    import Jackson.bean.Service.ServidorService;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.net.Socket;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import javax.swing.JOptionPane;

    public class ServidorFrame extends javax.swing.JFrame {

    private Socket socket;
    private ChatMessage message;
    private ServidorService service;

    public ServidorFrame() {
    initComponents();
    }

    private class ListernerSocket implements Runnable {

    private ObjectInputStream input;

    EDITADO
    // End of variables declaration
    }

  32. #32 por Jackson em 10/04/2013 - 1:11

    tou com esse trabalho pra entrega amanha me dar essa ajuda no que devo adicionar e /ou retirar, pois ou clicar no botao conectar do servidor ele conecta, mas fica travado a interface do servidor a minha do cliente pega normal, me ajuda ai passando a dica em codigo, vlw…

  33. #33 por MBallem em 10/04/2013 - 16:18

    Jackson, faz diferente. Crie uma nova classe JFrame e monte nela sua interface gráfica.
    Depois, no botão conectar você faz assim:

        private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
            final int porta = Integer.parseInt(jTextField1.getText());        
            Thread t = new Thread() {
                public void run() {
                    new ServidorService(porta);
                }
            };
            t.start();
        }

    E lá na classe ServidoService, mude apenas isso:

        public ServidorService(int porta) {
            try {
                serverSocket = new ServerSocket(porta);
                //.......
        }

    A Thread no botão vai garantir que sua classe não vai travar a interface. E faça a classe do JFrame, ser sua classe main.

  34. #34 por Jackson em 10/04/2013 - 22:47

    vlw man, sou nao conseguir habilitar a conexao para enviar msg pelo servidor tbm, mas muito obrigado

  35. #35 por MBallem em 11/04/2013 - 17:04

    Como assim? Qual problema que você teve?

  36. #36 por Jackson em 11/04/2013 - 23:01

    o servidor conecta, mas a interface nao funciona, tipo quando conecta o txtxfield, txtArea e o botao de enviar nao habilita e conectar nao fica desabilitado, fiz igualzinho ao cliente , mas nao funciona… vlw mesmo pela atençao

  37. #37 por aline moreira em 14/05/2013 - 16:49

    private void connect(ChatMessage message) {
    ClienteFrame a = new ClienteFrame();
    if(message.getText().equals(“NO”)){
    txtName.setText(“”);
    JOptionPane.showMessageDialog(a,”Conexão não realizada! \n Usuario tente outro nome”);
    return;
    }

    this.message = message;
    this.btnConnectar.setEnabled(false);
    txtName.setEnabled(false);

    nessa parte do codigo esta dando erro seu coloco this.btnConnectar esta dando erro
    se eu deixo btnConnectar nao da erro
    e o JOptionPane.showMessageDialog não esta aceitando o this ..
    pensei em fazer assim como mandei mais nao deu certo

    o q posso fazer pra arruma ?

  38. #38 por MBallem em 14/05/2013 - 17:11

    Olá Aline!

    Sobre o JOptionPane, ele só aceitará o this se você colocar na assinatura da classe “extends JFrame”. Confirme se você fez isso:

    public class ClienteFrame extends javax.swing.JFrame {}

    O caso do “this.btnConnectar”, só não vai funcionar em 2 casos, se você está tentando usar o “this” dentro de um método estático ou se não está dentro da mesma classe onde foi declarada a variável do botão: private JButton btnConnectar.

  39. #39 por aline moreira em 14/05/2013 - 20:49

    Obrigado deu certo .. to tendo outros probleminhas na classe ClienteFrame
    Sera que poderia me ajuda denovo , bom
    // close esta dando erro no metodo run
    }else if(action.equals(Action.DISCONNECT)){

    disconnected();
    socket.close();
    }

    // e no setListData e no SINGLE_SELECTION;
    private void refreshOnlines(ChatMessage message) {
    Set names = message.getSetOnlines();

    String[] array =(String[]) names.toArray(new String[names.size()]);
    this.listOnline.setListData(array);
    this.listOnline.setSelectionMode(listSelectionModel.SINGLE_SELECTION);

    }

    Saberia me disser por q esta dando erro, vi no video numero 8 que ele e assim mesmo
    alguma dica ?

  40. #40 por MBallem em 14/05/2013 - 21:40

    Oi Aline, mas qual o erro que aparece para você?

  41. #41 por aline moreira em 14/05/2013 - 21:55

    14/05/2013 21:53:45 Aps.service.ServidorService$ListenerSocket run
    GRAVE: null
    java.io.InvalidClassException: Aps.bean.ChatMessage; local class incompatible: stream classdesc serialVersionUID = -8802839524923604593, local class serialVersionUID = 9162783743144723321
    at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:562)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1582)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
    at Aps.service.ServidorService$ListenerSocket.run(ServidorService.java:67)
    at java.lang.Thread.run(Thread.java:662)

  42. #42 por MBallem em 15/05/2013 - 1:00

    Aline, segundo o erro, as classes ChatMessage no Servidor e no Cliente não estão idênticas. Como esse é um objeto serializado, as classes deves ser exatamente idênticas no Servidor e no Cliente. Eu falo sobre isso no vídeo onde crio as classes.

  43. #43 por aline moreira em 17/05/2013 - 16:37

    oie boa tarde .. ate o video 4 estava indo tudo certo, mais depois quando clico no botao conectar nao esta conectando e desativando o botao conectar e ativando os outros ,, sabe me disser qual e o problema ?

  44. #44 por aline moreira em 17/05/2013 - 17:52

    pode deixa .. conseguir aqui achei o defeito .. tinha criado uma string texto a mais na classe chatMessage.. Obrigado mais uma vez … seu videos foram a minha salvação tava com um trabalho aqui pra fazer de um chat pra entrega semana q vem

  45. #45 por MBallem em 17/05/2013 - 18:56

    Desculpa pela demora em responder Aline.
    Fico feliz que os videos tenham sido uteis para você.

  46. #46 por aline moreira em 17/05/2013 - 19:33

    gostaria de tirar uma duvida com vc, tenho um cabo cross-over queria saber se consigo me comunicar com esse chat, pra fazer uma demostração pro professor , teria como ? e se tiver o que preciso mudar so aquela porta ??

  47. #47 por MBallem em 18/05/2013 - 0:26

    Você precisa colocar no cliente o IP da máquina que contém o servidor e claro, a mesma porta.

    Você pode testar a comunicação entre cliente e servidor antes de executar o chat, apenas fazendo um ping de uma máquina para outra.

  48. #48 por aline moreira em 21/05/2013 - 19:02

    teria como vc me da uma exemplo de como faço isso, q nao tenho ideia .. eu coloquei o projeto cliente na outra maquina, igualzinho o do outro computador .. mais nao deu nao .
    como faço pra coloca esse ip no cliente e a mesma porta na classe do cliente
    se poder me ajuda agradeço

  49. #49 por aline moreira em 21/05/2013 - 19:05

    oie .. teria como me ajuda a fazer isso, que nao sei como faço essa comunicação colocando o ip e a porta no cliente ..
    eu coloquei o projeto cliente na outra maquina igualzinho so q nao deu certo
    se poder me ajuda, por q tenho q mostra pro professor na sexta e nao ta dando certo a comunicação entre as maquinas
    desde ja agradeço

  50. #50 por MBallem em 21/05/2013 - 21:15

    Oi Aline!
    Primeiramente você precisa saber se uma máquina está conectada a outra através de uma rede. Para isso você precisa descobrir o IP de da máquina onde você precisa colocar a sua aplicação servidor. Para saber isso, você pode digitar no prompt do DOS: ipconfig

    No resultado vai ter o IP da máquina.

    Então você vai até a máquina que pretende usar como cliente e abre o prompt do DOS e digita: ping ip_do_servidor

    Ao teclar enter, você deverá ter um resposta dizendo que existe ou não comunicação entre as máquinas. Veja no exemplo abaixo:

    C:\>ping 198.0.2.1
    
    Disparando 128.0.0.1 com 32 bytes de dados:
    Esgotado o tempo limite do pedido.
    
    
    C:\>ping 198.0.0.2
    
    Disparando 127.0.0.1 com 32 bytes de dados:
    Resposta de 127.0.0.1: bytes=32 tempo<1ms TTL=128
    

    Se você tiver um resultado parecido com o 1° teste, é porque não exite comunicação, mas se tiver um resultado semelhante ao segundo, está ok.

    Então, caso sua resposta seja ok, pegue o IP do servidor e coloque na classe de conexão do cliente, onde na vídeo aula foi usado … new Socket(“localhost”,5555), substituindo o localhost pelo ip da máquina do servidor.

  51. #51 por Luis Marques em 31/05/2013 - 12:59

    Boa tarde Marcio.

    Desde ja queria dar-lhe os parabens pela forma como implementou esse magnifico programa.
    Queria saber se me davas uma ajuda. Eu tenho um programa implementado em java, ele esta a funcionar direito e tudo, mas gostava de implementar-lhe a interface grafica, para que o trabalho fique bem feito, achas q me darias uma ajuda nisso? Se quiseres posso mandar-te meu programa para veres se da para implementar da mesma forma que no teu.
    Abraço

  52. #52 por MBallem em 31/05/2013 - 13:17

    Boa tarde Luis! Obrigado pelo comentário.
    Infelizmente eu não tenho tampo disponível para te dar essa ajuda. Aproveite essa oportunidade para desenvolver seu conhecimento e tente fazer você mesmo essa modificação em seu sistema.

  53. #53 por marcelo-h@ig.com.br em 04/06/2013 - 1:42

    Gostaria de saber se vc possui email ou skype, pois a dias estou tentando fazer um trabalho da faculdade e não estava conseguindo, até encontrar o seu blog. Tanto que estou desde das 10:00 da manhã do dia 3/06/13 e ainda não consigo fazer da classe ClienteFrame o botão conectar, conectar ao servidor e enviar a mensagem de conectado ao usuario, e gostaria de aproveitar todo o conhecimento que o senhor possui, para saber se é possivel implementar o codigo de envio de arquivo com socket e com colocar um logo, pois temos um objetivo nesse trabalho que é um ferramenta de comunicação para a “prefeitura ” onde engenheiros irão se comunicar enviando e recebendo arquivos e relatorios sobre o andamento da limpeza no rio Tiête, tanto que o tema que criamos com a logo ficou assim;”De olho no Tiête!”.

    Marcio acima de tudo quero agradecer a Deus, pq de uma certa maneira ele colocou vc no meu caminho na “NET” e te dizer que vc é o cara que ensinou melhor do que muitos professores lá na faculdade, continue assim com sua paciência e com a sua vontade de passar o seu conhecimento aos demais , pois tenho certeza de que logo cedo o seu reconhecimento será maior do que o de hoje.

  54. #54 por MBallem em 04/06/2013 - 12:04

    Olá Marcelo, obrigado pelos elogios.

    Nas vídeos aulas tem o passo a passo de como fazer essa conexão. Uma dica, assista aos vídeos e faça os exemplos como mostrado. Depois, quando você terminar dai sim tente fazer alguma coisa diferente, como o seu trabalho da faculdade, será mais fácil.

    Sobre o envio de arquivos, também já postei algumas video-aulas sobre isso, você verá que é bem simples( https://mballem.wordpress.com/2013/05/01/envio-de-arquivos-com-socket/ )

    No caso para enviar mais de um arquivo na mesma mensagem é só criar um objeto do tipo lista (java.util.List) e dai você poderá adicionar quantos arquivos quiser.

  1. Chat Multi Usuários com Socket | Programando com Java
  2. Envio de Arquivos com Socket | Programando com Java