Chat Multi Usuários com Socket

Este post foi removido e transferido para a seguinte url:

http://www.mballem.com/post/chat-multi-usurios-com-socket

Anúncios

, , ,

  1. #1 por jedi em 25/03/2011 - 20:26

    oi, gostaria de saber como é que seria o codigo se quisesse enviar mensagens para um cliente especifico em vez de mandar a mensagem para todos( que o caso do exemplo que deu, o broadcas). se puder colocar aqui codigo.Obrigado.

  2. #2 por MBallem em 25/03/2011 - 21:49

    Eu não tenho isso implementado.
    Talvez de para fazer, mas não sei como. Vou dar uma pensada nisso.
    O que ocorre é o seguinte, nesse exemplo que eu postei, os clientes conectados ao servidor ficam guardados no Vector CLIENTES, mas isso é um objeto de PrintStream, dai tem que ver uma maneira de enviar a mensagem apenas para esse objeto, e esse é que é o problema, saber que tal objeto representa a String com o nome de quem você quer enviar.

  3. #3 por MBallem em 26/03/2011 - 12:26

    Fiz umas modificações na classe servidor, pode pegá-las aqui: http://www.megaupload.com/?d=7A0FO9Z7

    Quando conectar o cliente e desejar que esse cliente envie mensagens para apenas uma pessoa, faça assim:

    Mensagem >Oi marcio:marcio
    1° a mensagem. 2° o nome, obrigatoriamente separado por ‘ : ‘ será para quem a mensagem será enviada em particular.

    Agora, dessa maneira você pode mandar para todos ou um de cada vez.

    Pode fazer as modificações que achar necessárias. Espero ter ajudado.

  4. #4 por jedi em 26/03/2011 - 15:28

    muito obrigado pela disponibilidade. irei continuar a seguir o seu blog com certeza, que explica muito bem. 😉

  5. #5 por jedi em 01/04/2011 - 20:11

    ola, apareceu uma duvida que é a seguinte, o exemplo que deu nao tem um Protocolo, ou seja, tipo, que confirme ao users que a mensagem chegou, se chegou, etc. como é colocava aqui um protocolo, que acho que é a parte mais importante e que poderia estar neste post. Se puder tirar esta duvida, Obrigado e ja li o seu no post muito bom. 😉

  6. #6 por MBallem em 01/04/2011 - 23:30

    Socket trabalha com protocolo TCP ou UDP. Nesse caso é TCP.
    Sobre ter uma resposta caso o cliente não receba uma resposta, isso deve ser implementado apenas na conexão reservada.
    Você pode pensar em várias formas de fazer isso. No caso do exemplo que eu postei, nessa alteração que fiz para conversa reservada, seria apenas anexar esse bloco de código:
    else if (!msg[1].contains(cliente.getKey())) {
    saida.println(msg[1].toUpperCase() + ” está desconectado!”);
    }

    no método send, após o if que contém o break.

    Aqui tem um bom material que fala sobre protocolo:
    http://www2.unoeste.br/~chico/comunicacao_socket/

    E nesse link: http://www.guj.com.br/java/74218-chat-em-java–usando-socket-e-thread/2#506163
    tem outro exemplo de socket, tanto com protocolo TCP quanto UDP. Está para download no comentário do ViniGodoy.

  7. #7 por jedi em 02/04/2011 - 12:53

    Muito obrigado, mais uma vez. 😉

  8. #8 por Silva em 01/07/2011 - 20:11

    Estava olhando seu codigo e testando aqui, ta funcionando blz, mas como comecei nao tem
    muito tempo com java gostaria,se possivel,de algumas explicações a respeito de determinadas
    partes do código
    por ex:

    – private static Map MAP_CLIENTES;
    – MAP_CLIENTES = new HashMap();

    Como funciona Map e HashMap ?
    Pq criar como map e depois inicializar como HashMap?

    – public void send(PrintStream saida, String acao, String[] msg) {
    out:
    for (Map.Entry cliente : MAP_CLIENTES.entrySet()) {
    PrintStream chat = cliente.getValue();
    if (chat != saida) {
    if (msg.length == 1) {
    chat.println(this.nomeCliente + acao + msg[0]);
    } else {
    if (msg[1].equalsIgnoreCase(cliente.getKey())) {
    chat.println(this.nomeCliente + acao + msg[0]);
    break out;
    }
    }
    }
    }
    }

    Esse for: o que faz o out: e o q faz o for ( for (Map.Entry cliente : MAP_CLIENTES.entrySet()) ) ?

    Grato

  9. #9 por MBallem em 01/07/2011 - 20:46

    Parece que sua dúvida não é em relação ao Sockets.
    Você deveria dar uma estudada nos fundamentos da linguagem Java.
    Para isso, indico o livro Use a cabeça Java!
    ou Java como Programar

    Vou tentar da uma explicação rápida sobre Map.
    Map faz parte do Framework de coleções Java.
    Map é uma interface que precisa ser inicializada por uma classe.
    Existem algumas classes que inicializam um Map, são elas HashMap, HashTable, linkedHashMap e TreeMap.
    Cada uma delas tem funções especificas, no caso da HashMap: é um mapa não classificado e não ordenado. Permite uma chave null e multiplos null.
    Map -> Chave é como se fosse um ID e não pode ser repetido. Valor é o valor propriamente dito.

    Map map = new HashMap();
    map.put(1, “olá”);
    map.put(2, “mundo”);

    O for é a maneira como percorremos um Map e outros varios tipos de coleções.
    No java existe 2 tipos de for, o mais atual e recomendado é o for each, disponivel a partir do Java 5.
    for (Map.Entry m : map.entrySet()) {
    m.getValue();//pega o valor
    m.getKey();//pega o ID
    }
    Cada loop no for pega uma linha na coleção.

    Em relação ao out:
    Essa técnica é chamda de rotulo.
    O rotulo é usado quando temos um loop dentro de outro e queremos em
    algum momento voltar para o loop rotulado ou sair definitivamente dele.
    Ou então simplesmente forçar a saida em um loop.
    Quando o código encontrar a linha “break out;” e saira do loop que possui a marcação out:
    Assim se existir mais linhas a serem percorridas pelo for, o rotulo força a saída antes
    que essas demais linhas sejam lidas. Assim poupa tempo.
    Caso você tenha 1000 linha e queira sair na quando encontrar a linha com a palavra “ola” e ela
    seja a linha 225, usando o rotulo força a saída do for e não precisa esperar até ele chegar no registro
    1000 para que o processo seja encerrado.

    Como eu disse no inicio, procure um destes livros para estudar. Se procurar bem no google, vc
    deve encontra-los em PDF ;D

  10. #10 por Lucas em 04/07/2011 - 10:48

    amigo tenho uma duvida.. como faço pra linkar uma interface com esse código? Pois gostaria de fazer uma interface grafica usando esse código para a execução mas nao estou conseguindo.. tem como dar umas dicas? obrigado

  11. #11 por MBallem em 04/07/2011 - 12:27

    Lucas, você deve substituir na classe cliente as entradas pelo teclado pelas entradas da interface gráfica e também o System.out.println() que exibe as mensagens enviadas pelo servidor.

  12. #12 por Lucas em 04/07/2011 - 12:37

    sim, isso eu sei.. mas o problema é que criar a interface na “mao” é mto dificil.. o que eu preciso usar esse código dentro de um projeto novo “aplicativo da área de trabalho java” cuja pode-se acrescentar botoes, textos e linkar os mesmos com o código..

  13. #13 por Lucas em 04/07/2011 - 14:22

    amigo, consegui construir a interface.. mas agora estou com um problema de entendimento do código.. o que seria esta parte do código, pois quero modifica-la mas nao consigo entender a mesma.
    // construtor que recebe o socket deste cliente
    public ZzzserverView(Socket socket){
    this.conexao = socket;

  14. #14 por MBallem em 04/07/2011 - 15:34

    Lucas, esse código é o método construtor classe. Sempre que criar uma instancia da classe, você deve passar um objeto Socket como parâmetro.
    Como por exemplo, entre as linhas 50 e 60 da Listagem 1. Assim, a variavel
    private Socket conexao; é inicializada sempre na instância da classe e o objeto this.conexão passa a ter esse socket.

  15. #15 por thiagods em 16/08/2011 - 16:08

    Estou tentando fazer um servidor parecido porém utilizando a interface Runnable, pois pelo que eu li é melhor utilizar Runnable do que dar um extends em Thread.

    Porém não estou conseguindo fazer a parte de mostrar os clientes conectados.

    A lista sempre fica zerada ao chamar o método new Thread(servidor).start(); para chamar o run().

    Também não sei se é assim que se faz exatamente =P

  16. #16 por thiagods em 16/08/2011 - 16:20

    Já resolvi 😉

    Era pq eu não tinha definido a lista como static.. vou tentar fazer sem usar static, se é que é possível ^^ (pensei em mandar o parametro clientes ao criar uma nova thread) apesar de eu não ter muito tempo para isso, tenho que fazer um chat web pra empresa que eu trabalho (estágio), tenho muito que fazer ainda, to fazendo esse por linha de comando só para ir pegando a manha com thread e sockets, nunca tinha usado antes.

    Valeu pelo post me ajudo muito.

  17. #17 por MBallem em 16/08/2011 - 18:33

    Olá thiagods,
    se vai fazer um chat web você pode fazer também com JMS. Acho até que fica melhor. Da uma olhada nos post que tenho sobre Chat com JMS.

  18. #18 por Hingriddi em 26/09/2011 - 20:56

    Estava precisando deste chat porém com interface gráfica, você não teria para disponibilizar?
    Grata.

  19. #19 por MBallem em 27/09/2011 - 10:20

    Oi Hingriddi,
    infelizmente não tenho ele com uso de interface gráfica. Mas se você entendeu o processo do chat, seria penas substituir as chamadas de modo console pelos objetos que você deseja usar na interface gráfica.

  20. #20 por Bruno Tacca em 07/12/2011 - 10:01

    Muito bom seu exemplo! Irei usar muito!
    Recomendo a todos esse trabalho!

    Parabéns!

  21. #21 por MBallem em 07/12/2011 - 10:55

    Valeu pelo apoio Bruno Tacca.
    Abraço!

  22. #22 por Anderson em 08/05/2012 - 19:53

    Estou com uma dúvida, tem como inicializar o servidor com um botão em uma classe separada?

  23. #23 por MBallem em 09/05/2012 - 16:52

    Olá Anderson! Tem sim. Nesse exemplo que postei eu coloquei a inicialização do servidor dentro do método main(). Você pode criar outro método e adicionar o conteúdo do método mai() nele. Em outra classe, você chama esse novo método no evento do clique do botão.

  24. #24 por Denise em 10/05/2012 - 23:06

    Muito bom. Me ajudou demais. Parabéns pelo site.

  25. #25 por MBallem em 12/05/2012 - 16:02

    Obrigado Denise, abraço.

  26. #26 por Wagner em 14/05/2012 - 11:20

    Marcio,

    Neste teu exemplo você teria como incrementar as funções de criar Sala, Listar Salas e Listar Usuários.
    Se tem, claro que tem como faz? Você tem como disponibilizar o código se tiver estas funções?

  27. #27 por MBallem em 14/05/2012 - 12:08

    Oi Wagner, deve ter um modo, eu nunca fiz isso. Mas uma maneira que poderia criar seria criar um porta para cada sala. Ou seja, você teria que iniciar vários servidores, cada um deles com uma porta específica.
    De outra maneira não consigo pensar em nada neste momento.

  28. #28 por Anderson em 24/05/2012 - 4:09

    Primeiro lugar parabens o seu chat esta otimo, mas eu tenho alguns pedidos…

    como ficaria o codigo se cada usuario pudesse ver uma lista de usuarios conectados no servidor, para que ele possa escolher com quem ele quer conversar…

    tambem queria saber como ficaria se cada usuario pudesse criar uma sala de chat

  29. #29 por MBallem em 24/05/2012 - 11:54

    Olá Anderson, não posso te responder isso porque não tenho nada implementado desta forma. Sobre a lista de usuários conectados, você teria que criar um método que de alguma forma enviasse aos usuários uma lista com todos os que estão conectados no servidor. Você pode criar uma mensagem que o usuário envie para o servidor, e quando o servidor receber essa mensagem, ele retorna uma mensagem que contenha o nome de todos usuários conectados.

    Sobre as salas, acredito que não seja o usuário que crie uma sala e sim o servidor que disponibilize as salas, então você já deveria ter as salas criadas, que poderiam ser, cada sala uma porta de acesso diferente. Para cada sala, você teria um servidor diferente rodando.

    Mas como eu disse, nunca fiz nada desse tipo, então pode ser que exista alguma outra forma de se fazer, diferente dessas ideias que citei.

  30. #30 por Anderson em 25/05/2012 - 13:19

    Na verdade eu tenho que fazer um chat onde tem os seguintes requisitos…

    CRIAÇÃO DE SALAS – uma sala é criada quando um usuario cliente solicita esta ação, informando o nome da sala a ser criada. Nao pode salas com mesmo nome.
    LISTAGEM DAS SALAS ABERTAS – A lista pode ser solicitada pro um cliente conectado ao serviço.
    ENTRADA NA SALA – O cliente deve informar o nome da sala que o usuario deseja entrar.
    SAIDA DA SALA – O cliente deve informar para o servidor a sua saida da sala.
    FECHAMANDO DA SALA – Somente o usuario criador da sala poderá fechar uma sala. Automaticamente todos os demais usuarios da sala deverao ser avisados e em seguida retirados da sala.
    ENVIAR MENSAGEM NA SALA – Uma vez dentro da sala, usuarios cliente podem enviar texto para a mesma, mas so podera usar uma sala por vez.
    RECEBER MENSAGEM NA SALA – Um usuario somente recebera mensagem se estiver dentro de uma determinada sala.
    LISTAR USUARIOS NA SALA – Qualquer usuario que se encontre dentro de uma sala devera ter acesso a lista de usuarios que se encontram nela. Ao sair ou entrar em uma sala, todos os demais usuarios que estiverem dentro da mesma deverao ser informados.

  31. #31 por MBallem em 25/05/2012 - 14:31

    Bem complexo Anderson. Vai te dar bastante trabalho. Talvez seja bom você procurar algum livro sobre o assunto para fazer uma pesquisa mais ampla. Sei que o Deitel (Java Como Programar) tem um capitulo sobre Sockets, mas deve ter alguns outros sobre esse assunto.

  32. #32 por Anderson em 25/05/2012 - 15:41

    entao vc pode me ajudar como ficaria o codigo para listar os usuarios conectados?

  33. #33 por MBallem em 25/05/2012 - 16:00

    Anderson, isso vai depender de como você vai armazenar os usuários conectados. Você já implementou isso?
    Esse seu projeto é complexo, como já te disse antes, então você precisa antes mesmo de sair codificando, colocar no papel qual seria a melhor forma de projetar cada parte do projeto, para depois faze-las trabalharem juntas. Tem que pensar muito bem em cada etapa para depois de ter 60% pronto, não precisar modificar tudo para colocar os outros 40% restantes.

  34. #34 por Anderson em 25/05/2012 - 19:22

    Eu ja fiz o diagrama de estado com UML e ja planejei tudo. Inclusive estou utilizando boa parte do seu codigo no meu projeto com sucesso.
    O que eu queria era no seu servidor o codigo para listar os usuarios desse chat, toda vez que qualquer usuario pedir…

  35. #35 por MBallem em 25/05/2012 - 21:14

    Anderson, no código que postei tem uma lista que armazena o nome de todos os usuários do chat. Crie um método no servidor que retorne uma String com todos esses nomes. Crie também um parâmetro, que quando o usuário envia-lo como mensagem, o servidor então retorne uma mensagem com essa lista.
    Algo parecido com o que fiz quando o usuário quer conversar reservadamente com alguém, ele digita a mensagem + dois pontos + o nome do usuário que ele quer conversar. Faça algo do tipo, envia um carácter ou uma palavra qualquer e teste no servidor através de um IF, se receber essa palavra como mensagem, então chama o método que retorna a lista.

  36. #36 por Anderson Andrade em 26/05/2012 - 15:25

    obrigado pela ajuda cara eu axo que entendi, seria alguma coisa tipo o que envia mensagem para todos so que dessa vez eu vou enviar o nome de cada cliente da lista…

    outra duvida q eu tenho eh como funciona essa classe Vector? Pelo que entendi seria um vetor de clientes?

  37. #37 por MBallem em 27/05/2012 - 15:17

    Isso mesmo Anderson, seria um Vetor de Clientes. Nele são armazenados os clientes conectados ao servidor.

  38. #38 por Marcio Duran em 01/06/2012 - 15:32

    Como faria pra implementar essa situação, adicionar 5 usuários na sala do Chat e depois alocar o 6 usuário em uma sala vazia,no seu exemplo ? Abaixo a tentativa excede e não promove esse controle.

    Obrigado !!!!

    public synchronized boolean armazena(String newName) throws Exception {

    if(LISTA_DE_NOMES.size()==5){
    throw new Exception(“Esta sala já esta cheia”);

    }else if(LISTA_DE_NOMES.contains(newName)){
    throw new Exception(“Este usuario já esta na sala.”);

    }else{
    //adiciona na lista
    LISTA_DE_NOMES.add(newName);
    return true;
    }
    }

  39. #39 por MBallem em 01/06/2012 - 15:54

    Olá Marcio Duran, questão de organizar melhor a lógica de seus IF’s. Tipo algo assim:

    if(LISTA_DE_NOMES.size()==5){
    throw new Exception(“Esta sala já esta cheia”);
    } else if (LISTA_DE_NOMES.size() < 5) {
    if(LISTA_DE_NOMES.contains(newName)){
    throw new Exception(“Este usuario já esta na sala.”);
    }else{
    //adiciona na lista
    LISTA_DE_NOMES.add(newName);
    return true;
    }
    } else {
    //quando maior que 5 inserie na nova sala
    }

  40. #40 por Marcio Duran em 01/06/2012 - 16:39

    Gostaria de lhe enviar um arquivo.zip contendo um Chat que tem um Template Swing mais eleborado, pra adição de usuários, aqui não tem como anexar então, em que email posso lhe enviar ?

    “A Rotina que você enviou, ainda faz ele passar a lista de 5 usuários, não causa Exception !!!”

  41. #41 por MBallem em 01/06/2012 - 21:00

    M. Duran, tem uma coisa, se você usar “throw new Exception” no IF,
    o método irá deixar de ser executado.
    Use um println() para mostrar a mensagem, ou um try/catch/finally.
    A lógica como te passei funciona sim, basta fazer um teste de mesa
    que você verá isso. Se não está funcionando deve ser algum outro
    problema no seu projeto.
    Veja:
    //se a lista tiver tamanho igual a 5
    //mostra a mensagem
    if(LISTA_DE_NOMES.size()==5){
     println(“Esta sala já esta cheia”);
    }
    //Senão se o tamanho for menor que 5
    //entra no else if.
    //Dai dentro do else if teremos um novo if e else
    //que testa se o nome já existe na lista ou não
    else if (LISTA_DE_NOMES.size() < 5) {
     if(LISTA_DE_NOMES.contains(newName)){
      println("Este usuario já esta na sala.");
     }else{
    //adiciona na lista
      LISTA_DE_NOMES.add(newName);
      return true;
    }
    }
    //Mas se o tamanho da lista for maior que 5
    //executa seu método de nova sala.
    else {
    //quando maior que 5 inserie na nova sala
    }

    Se eu aceitar receber seu .zip, vou ter que aceitar
    o de muita gente, que está ao que parece, no mesmo
    projeto que o seu. E o tempo não permite isso.
    Vai até o forum http://www.guj.com.br e abre um tópico lá
    sobre as dúvidas que você tem nesse seu projeto.

  42. #42 por Héldon José Oliveira Albuquerque em 18/06/2012 - 22:04

    gostaria de saber, se tem como deixar outro servidor, em espera, assim, quando o primeiro servidor cair, eu tenho outro disponível no mesmo instante, sem precisar realizar todas as conexões novamente dos cliente. Tem como?

  43. #43 por MBallem em 18/06/2012 - 22:41

    Oi Héldon, nesse caso teria que ter outro servidor rodando em outra porta. E nos clientes você poderia colocar um try/catch, caso a conexão seja perdida, cai no catch e dai você faz a conexão com o novo servidor.
    De outra forma não sei se tem como.

  44. #44 por Marcio Duran em 19/06/2012 - 0:56

    Quando o servidor cair, o cliente poderia assumir o estado de servidor e não ocorreria o Try/Cath , não existiria a perda da conexão, o servidor nada mais é que um host onde o cliente também esta, o codigo poderia scannear outra maquina que esta recebendo a conexão e receber o ip dela, como no emule você esta abaixando um arquivo e ele se conecta a varias maquinas diferentes pra ganhar conexão.

  45. #45 por Héldon José Oliveira Albuquerque em 19/06/2012 - 9:27

    No caso do exemplo acima, quais modificações deveria tomar, ainda não conseguir ter a ideia de segurar os clientes que jáestão conectados..

  46. #46 por Alberto Paschoal de Freitas em 27/06/2012 - 7:50

    Me passa o seu codigo fonte das interface graficas, se puder…

  47. #47 por MBallem em 27/06/2012 - 11:32

    Alberto, esse código não tem interface gráfica, é no modo console mesmo.

  48. #48 por gilmar em 30/10/2012 - 22:07

    Olá, gostei muito do post, mas estou com uma duvida.

    Como posso fazer para enviar a lista de clientes para todos quando um novo cliente se conectar, e não só para o ultimo.

  49. #49 por MBallem em 31/10/2012 - 0:09

    Olá gilmar, não é tão difícil assim, já que você já tem uma lista que armazena o PrintStream de cada cliente conectado.

    Basta fazer um novo método de envio, onde você deverá fazer um for na lista MAP_CLIENTES e adicionar no método println(), para cada cliente existente ano MAP, a variavel LISTA_DE_NOMES.

    E então chame esse método dentro do “else” do método run().

  50. #50 por gilmar em 31/10/2012 - 10:03

    Estou tentando, mas não estou conseguindo, seria algo assim?

    public void envio(PrintStream saida){
    for(int i=0; i<MAP_CLIENTES.size(); i++){
    saida.println("Conectados: " + LISTA_DE_NOMES.toString());
    }
    }

    Seria esse o parâmetro do método?

  51. #51 por MBallem em 31/10/2012 - 11:06

    Mais ou menos, gilmar. Você deve usar o PrintStream do MAP e não esse que você passou por parâmetro. O Printstream do parâmetro é de um único cliente, mas no MAP você tem o de todos.
    Algo assim:

    for (Map.Entry cliente : MAP_CLIENTES.entrySet()) {
    PrintStream chat = cliente.getValue();
    chat .println(“Conectados: ” + LISTA_DE_NOMES);
    }

  52. #52 por gilmar em 31/10/2012 - 11:38

    Muito Obrigado MBallem, funcionou perfeitamente, mas tem um pequeno detalhe, ja que o servidor nao aceita usuarios com o mesmo nome, então não vejo a necessidade de mostrar para cada usuario seu proprio nome. Teria como fazer isso com esse metodo ou terei que fazer um outro metodo?

  53. #53 por MBallem em 31/10/2012 - 12:09

    Nesse caso gilmar, você pode testar no loop se o nome presente na posição atual do loop é igual ao nome de quem se conectou. Passe para o método de envio o nome do cliente como parametro, e dai pode fazer um IF para realizar o teste. A chave do MAP é o nome do cliente conectado.

  54. #54 por gilmar em 31/10/2012 - 20:14

    Seria algo assim?

    for (Map.Entry cliente : MAP_CLIENTES.entrySet()){
    if (!MAP_CLIENTES.entrySet().equals(Name)) {
    PrintStream chat = chat = (PrintStream) cliente.getValue();
    chat.println(“Conectados: ” + LISTA_DE_NOMES);
    }
    }

    Agora não está funcionando corretamente, esse IF estaria correto? Sendo que o “Name” seria o nome do cliente.

  55. #55 por MBallem em 31/10/2012 - 20:32

    Tenta assim gilmar:

    for (Map.Entry cliente : MAP_CLIENTES.entrySet()){
    if (!cliente.getKey().equals(name) {
    PrintStream chat = chat = (PrintStream) cliente.getValue();
    chat.println(“Conectados: ” + LISTA_DE_NOMES);
    }
    }

    O nome dos conectados estão armazenados como chave do MAP, então é só testar pela chave o nome que você passou por parâmetro.

  56. #56 por gilmar em 31/10/2012 - 20:55

    MBallem muito obrigado pela ajuda, mas ele ainda continua mostrando o nome do cliente para ele mesmo. Será que não há outra maneira de fazer isso?

  57. #57 por MBallem em 31/10/2012 - 21:15

    É claro, tem que fazer um loop também na LISTA_DE_NOMES. Porque a lista contém o nome de todos, e especificamente um deles você não vai enviar.
    Faça um teste condicional para isso dentro desse novo loop, e os nomes que podem ser enviados armazene em uma variavel ou em uma nova lista local, para então depois do loop em LISTA_DE_NOMES acabar, você enviar pelo método chat.println(“Conectados ” + “nova lista ou variavel”)

  58. #58 por gilmar em 31/10/2012 - 21:18

    Vou tentar implementar, qualquer dúvida eu pergunto aqui. Muito obrigado pela atenção.

  59. #59 por Fred Ferraz em 06/11/2012 - 19:52

    Amigo, como eu faço para testar esse codigo, implementando ele e testando o chat? Obrigado.

  60. #60 por MBallem em 06/11/2012 - 21:18

    Fred, você 1° roda a classe do servidor, depois disso, pode rodar quantos clientes quiser. Tanto a classe do servidor como a do cliente tem um método main, então é só executa-las, mas sempre em primeiro lugar o servidor.

  61. #61 por Fred Ferraz em 06/11/2012 - 22:35

    Entendi, posso implementar no netbeans? tem algum outro lugar qe me indica? Obrigado.

  62. #62 por MBallem em 07/11/2012 - 22:30

    Boa noite Fred, pode sim. Pode usar qualquer ide, o mesmo rodar “na mão” pela linha de comando.

  63. #63 por alex em 08/11/2012 - 23:14

    vlw ai, muito bom .

  64. #64 por MBallem em 09/11/2012 - 0:51

    Legal que tenha gostado alex.
    Abraços!

  65. #65 por wendel castro em 13/11/2012 - 15:31

    Qual o método que eu posso usar para retornar se a minha conexão caiu, pois no meu caso a minha aplicação envia um arquivo em uma rede local via Socket, e não estou tratando a perda de conexão. Fiz testes da seguinte forma: Rodei meu Server no meu Notbook, depois meu Client em um servidor, quando estava transmitindo o arquivo, eu tirei o cabo de rede, e ele parou de transmitir(Lógico), porém quando eu coloco o cabo, ele espera o tempo de reconectar e continua o envio, porém se a minha internet não voltar, minha aplicação não me retorna nada… Como faço esse controle?

    Obrigado!

  66. #66 por MBallem em 13/11/2012 - 15:57

    Olá wendel. Acho que você teria que implementar um método do tipo “keep alive”, ou seja, a cada 5 segundos, 30 segundos, 1 minuto, ou o tempo que você achar necessário, esse método envia um pequena mensagem para o servidor e se o servidor estiver ativo, responde a esse envio. No momento que você não tiver uma resposta, ou é poque o servidor não está rodando ou a rede caiu.
    Você teria que implementar um thread que seria esse “keep alive” para ela ficar rodando em paralelo de tempos em tempos no cliente, e também pode ser feito do lado servidor se for o caso.

  67. #67 por xavi em 02/12/2012 - 8:34

    Hola a todos, bien busque infinitamente un tipo de chat que necessito para a provar una assignatura de la carrera.. entonces el chat debe ser en java i igual que lo que pediste tu ANDERSON. me gustaria que me pasarasel codigo del cliente i del servidor para tenerlo te dejo mi email para comunicarnos chevi_cat@hotmail.com gracias! i encantado

  68. #68 por MBallem em 02/12/2012 - 12:28

    Olá Xavi. O código é exatamente esse que está publicado no post. Basta você copiar as classes cliente e servidor. Primeiro execute a classe servidor e depois a classe cliente quantas vezes desejar.

  69. #69 por Pedro Lacerda em 02/12/2012 - 21:32

    Oi, como eu faço pra dois pcs diferentes se comunicarem ?, testei botando os ip de cada aqui nada rede mas não da certo

  70. #70 por MBallem em 02/12/2012 - 22:19

    Olá Pedro. Você precisa colocar o servidor em Pc e o cliente em outro Pc com o Ip do Pc do servidor.Mas os 2 Pcs precisam estar na mesma rede. Você pode testar se os pcs estão se enxergando na rede, através do comando ping no console do Dos.
    Abra o console do Pc 1 e coloque o ip do Pc 2 no ping. Por exemplo:
    pc 1 ip : 10.1.1.1
    pc 2 ip : 10.1.1.2

    pc 1 > ping 10.1.1.2
    e
    pc 2 > ping 10.1.1.1

  71. #71 por Ivo em 08/12/2012 - 15:24

    O código que pôs no megaupload sobre enviar mensagens a clientes em particular poderia por noutro sitio para poder fazer o download ? e já agora há alguma maneira de o servidor poder eliminar utilizadores ?

  72. #72 por MBallem em 08/12/2012 - 15:50

    Olá Ivo, você pode fazer o download no final do tutorial. Sobre o servidor poder eliminar os clientes, vai depender do que você precisa implementar. É apenas trabalho de lógica para fazer isso.

  73. #73 por Ivo em 08/12/2012 - 18:48

    Ho que parvoíce, sim o código do servidor modificado é aquele que permite mandar mensagens, eu queria era saber se por exemplo, houvesse um gestor do servidor que pudesse eliminar clientes do chat.

  74. #74 por MBallem em 08/12/2012 - 19:56

    Para eleminar clientes do Chat, você teria que ter um método no servidor que fosse capaz de pegar a thread do cliente que seria excluído e elemina-la. Poderia fazer isso passando um valor null para esta thread.

  75. #75 por Ivo em 09/12/2012 - 18:05

    como é que um utilizador sai do chat? e mais uma coisinha, o primeiro utilizador a entrar não sabe os que entram, apenas os que entram sabem os que já la estão.

  76. #76 por Ivo em 09/12/2012 - 18:06

    já percebi, ao mandar uma mensagem em branco sai do chat, mas mesmo assim os outros utilizadores não sabem que ele saiu…

  77. #77 por MBallem em 09/12/2012 - 18:57

    Olá Ivo. Sim, se você sair do chat, os outros rebem um mensagem que você saiu do chat. E o 1° não pode saber quem está conectado no chat se ele é o 1° a se conectar, justamente porque se ele é o 1°, ainda não tem ninguém conectado.

  78. #78 por Maria em 11/12/2012 - 15:46

    Muito bom mesmo, mas no cliente
    Socket socket = new Socket(“127.0.0.1”, 5555);
    é passado o IP da maquina pra conexão?
    como seria se tivesse de a advinhar?

  79. #79 por MBallem em 11/12/2012 - 17:21

    Olá Maria. O cliente precisa saber qual o ip do servidor. Não tem como ele “adivinhar”. A não ser, que você tenha um lista de ips, onde um deles é valido, dai você pode criar um método que fique testando ip por ip, mas caso contrário, não teria como saber.

  80. #80 por Ivo em 15/12/2012 - 13:18

    Só um esclarecimento, o que é mesmo um thread e o que faz ?

  81. #81 por MBallem em 15/12/2012 - 13:28

    Olá Ivo, thread é a forma como um aplicação executa mais de uma atividade ao mesmo tempo. É através de thread que temos a possibilidade de ter o chat para multi usuários. Se não usassemos thread, não haveria a possibilidade de ter mais de um usuário acessando o Servidor.
    De uma lida http://www.devmedia.com.br/utilizando-threads-parte-1/4459 vai te ajudar a entender thread.

  82. #82 por Alessandro Narciso em 01/02/2013 - 10:15

    Olá Marcio tudo bem?
    Cara muito interessante esse chat, me tirou muitas duvidas sobre o sistema que estou desenvolvendo para transferencia de arquivos envio e retorno de mensagens cliente/servidor e principalmente o servidor saber quando o cliente fecha o sistema.
    A minha grande dúvida eh como o servidor saber se, por exemplo, caiu a rede do cliente ou caiu a energia ou se ele desligou o pc sem fechar o programa antes.

  83. #83 por MBallem em 01/02/2013 - 12:01

    Olá Alessandro! Quando a conexão for interrompida, o servidor vai receber uma exceção to tipo: IOException: java.net.SocketException: Connection reset

    Basta você tratar essa exceção. Por exemplo, no tutorial tem uma lista que contém os clientes conectados, quando a exceção for lançada, você pode tirar da lista o cliente que perdeu a conexão.

    Seguindo o tutorial postado, na classe ServidorSocket, a exceção que será lançada está na linha 76.

  84. #84 por Alessandro Narciso em 01/02/2013 - 16:02

    Olá Marcio, entao…eu montei e testei os seus códigos e caem pefeitamente na exceção quando eu derrubo o cliente porém quando eu interrompo a rede ou desligo o micro do cliente sem fechar o programa o server nao cai na exceção.

  85. #85 por MBallem em 01/02/2013 - 17:02

    Alessandro, então você vai precisar implementar um método “keep alive”. Seria uma thread no servidor, que de tempos em tempos (definido por você), acessa os clientes mandando uma mensagem qualquer para eles. Você pode implementar no cliente um método especifico para receber essa mensagem e como retorno enviar para o servidor um “ativo”. Se o servidor receber ativo, o cliente ta on, se não receber está off.

  86. #86 por MARIO em 04/03/2013 - 12:14

    Olá Marcio
    Tenho um sistema em JAVA, que roda com JSP – Servlets. Tenho uma tabela USUARIOS. Gostaria de disponibilizar um button onde ao clica-lo, escolhido um dos usuários, teriamos um CHAT entre um-um usuario. Executei, via Eclipse em localhot, sua aplicacação Servidor, executei varios Clientes e a aplicação funcionou perfeitamente. Gostaria de adaptar sua apliacação a minha porém me deparei com uma dúvida: como encaixar suas classes SERVIDOR e CLIENTE dentro de minhas SERVLETS, sendo necessário retirar as public static void main(String args[]) {. Segue minha SERVLET :

    public class ServidorDeChat extends HttpServlet {

    private static final long serialVersionUID = -8864430825549256221L;

    public void process(HttpServletRequest req, HttpServletResponse res) throws Exception {

    // Aqui executo o que a SERVLET deve fazer !!!//
    }

    public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOExceptio {
    PrintWriter out = res.getWriter();
    try {
    process(req, res);
    } catch (Exception e) {
    out.println(“*** Erro ServLogon ***” + e.toString());
    System.out.println(“***@ Erro(doGet) ” + e.toString());
    out.flush();
    out.close();
    }
    }

    public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException {
    doGet(req, res);
    }
    }

  87. #87 por MBallem em 04/03/2013 - 14:20

    Olá Mario! Chat desse tipo em Servlet é bem mais complicado de fazer. Mas, tem agora o que chamam de WebSockets, ainda não testei para ser sincero, mas parece ser muito mais simples. Da uma olhada nesse tutorial: http://www.devmedia.com.br/introducao-a-websockets-com-tomcat-7/26932
    Espero que ajude.

  88. #88 por Diego em 26/04/2013 - 4:06

    Olá marcio, socorro como resolvo?

    GRAVE: null
    java.io.EOFException
    at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2576)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1295)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:349)
    at clientechat.frame.InterfaceCliente$ListenerSocket.run(InterfaceCliente.java:52)
    at java.lang.Thread.run(Thread.java:680)

  89. #89 por girasper em 26/04/2013 - 4:11

    Mano e como faz para que um cliente envie um arquivo para o servidor e o servidor envie o arquivo para o seu respectivo cliente.

  90. #90 por MBallem em 26/04/2013 - 11:24

    Olá girasper. Você não envia o arquivo físico, e sim o stream de bytes dele. Você vai precisar criar um método que transforme o arquivo em um stream de bytes, enviar o stream e o cliente que receber esse stream vai precisar ter um método que converta o stream em um arquivo novamente.

  91. #91 por MBallem em 26/04/2013 - 11:26

    Olá Diego, pelo erro postado ficou muito difícil saber o que está acontecendo.

  1. Chat JMS com ActiveMQ « Programando com Java
  2. Chat multi usuários com Socket e Interface Swing | Programando com Java
  3. Envio de Arquivos com Socket | Programando com Java
  4. soundtrack
%d blogueiros gostam disto: