Chat em Java via Socket

7 respostas
alucardeck

sim, eu sei tem varios topicos disso no GUJ…
só tem um problema… nenhum q eu achei usa Swing…
fazer em console eu já consegui, funciona que é uma beleza, com varias pessoas na sala conversando simultaneamente…

estou usando Sockets e Threads (Listeners), não sei se é o melhor jeito de fazer.
mas entao surgiu um problema ao tentar passar as mensagens para um JTextArea no Swing.

no chat via console… usamos:

PrintWriter out = new PrintWriter(socket.getOutputStream(), true); out.println(msg);
ele usa o console do “alvo” no socket para enviar a mensagem… tudo bem…

mas como mudar esse “out” para uma area de texto no JTextArea do Client ?
não entendi a logica de como fazer a conexão alcançar os objetos do Client…

pois então eu poderia dar um “append(msg)” no texto dele e adicionaria a mensagem…
ou então um meio de enviar uma String via Socket… que o Client estaria esperando pela Listener, e ela seria adicionada no seu JTextArea…

alguma luz? :wink:

7 Respostas

S

O seu sitema funciona na internet ou só numa rede interna? Eu só consegui fazer em uma rede interna até agora: não sei com faz pra chega no pc desejado se o IP que ele pega é o interno(que nao serve de nada). Caso pegue o externo, vc ta mandando a msg pro router e ele nao redireciona pro pc. Se funciona na net vc me explica, ok?

Sugestão pro seu problema:
Faz uma verificação: "Se eu receber pelo socket na porta tal, seta o JTextArea.Text = JTextArea.Text+ feedline + carriage return ( pra pular linha e voltar a posição pro começo) + usuário que enviou + “:” + mensagem recebida.

Pra enviar faz assim: No evento de click de botão ou do enter, vc joga o conteudo da textarea de escrita no socket e envia ^^

Espero ter ajudado, e tomara que vc saiba fazer na net :twisted:

alucardeck

shamanpyro:
O seu sitema funciona na internet ou só numa rede interna? Eu só consegui fazer em uma rede interna até agora: não sei com faz pra chega no pc desejado se o IP que ele pega é o interno(que nao serve de nada). Caso pegue o externo, vc ta mandando a msg pro router e ele nao redireciona pro pc. Se funciona na net vc me explica, ok?

Sugestão pro seu problema:
Faz uma verificação: "Se eu receber pelo socket na porta tal, seta o JTextArea.Text = JTextArea.Text+ feedline + carriage return ( pra pular linha e voltar a posição pro começo) + usuário que enviou + “:” + mensagem recebida.

Pra enviar faz assim: No evento de click de botão ou do enter, vc joga o conteudo da textarea de escrita no socket e envia ^^

Espero ter ajudado, e tomara que vc saiba fazer na net :twisted:

na verdade ainda não testei na internet…
mas em rede interna funciona perfeitamente com varios PCs…

a minha duvida é… como enviar a String pelo socket?
pq usando o

PrintWriter out = new PrintWriter(socket.getOutputStream(), true); out.println(msg);
ele envia por Console…

eu teria q usar socket.METODO oq ? pra enviar um pacote de dados especificos?
e pra resgatar no outro Client usando q metodo ?

olhei a lista na documentação e nao encontrei… (classe Socket)

a logica q estou usando no chat é
a Classe Server cria o ServerSocket…
e então varios clientes rodam e criar o seu proprio Socket conectando no host:port do server…

então o Client escreve uma msg… e manda pro Servidor…
ai o Servidor verifica na lista de clients conectados e mandar pro “Console” de cada um deles (pelo Codigo q mostrei acima)…

só queria pode enviar um pacote de dados (string) fora do console… onde o Cliente trataria e colocaria no seu JTextArea

S
eu teria q usar socket.METODO oq ? pra enviar um pacote de dados especificos? e pra resgatar no outro Client usando q metodo ?
então, faz assim:
String Pacote = "oi gatinho, quer tc? qtus anos?" ;//  :twisted:

		   PrintStream StreamDeSaidaDeDados = new PrintStream(SocketCliente.getOutputStream()); //6
           		   StreamDeSaidaDeDados.println(Pacote);// 7
		   StreamDeSaidaDeDados.println(Pacote);// 8
então, não tem problema vc receber pelo console, contanto que redirecione a string pro txtArea.text ué. Vc recebe pelo console mas não joga na tela pelo console. 1. Recebe no console pelo Socket Server de cada client 2. NÂO FAÇA ISSO: system.out.println(mensagem); 3. Sim, faça isso: <recebeu pacote>, então txtArea1.Text = mensagem;
alucardeck

é… to vendo q vai ter q aparecer no console de qqer jeito…
não queira apenas por “vaidade” hahah…

mas ainda acho estranho… não encontrei um meio de enviar um pacote de dados por Socket…
e se fosse uma imagem por exemplo?
não ia ser por console q eu ia passar :wink:

bom, o programa funciona com texto agora pelo menos…

obrigado a ajuda…
qdo eu chegar em casa eu testo pra ver se funciona na net…

S

te adianto que desse método não vai funcionar. Eu estou tentando ( quase) o mesmo, acompanhe no tópico:
http://www.guj.com.br/posts/list/99915.java#538833

Obs: Se for imagem, vc transforma ela em Stream. O console só vai receber os dados, ele não precisa nescessariamente nem intender nem mostrar.
No caso da imagem, antes de converter vc poe um reader antes do tipo IMG+Stream da imagem. Do outro lado vc lê a stream, se tiver o cabeçalho img vc tira ele, converte pra stream e le como imagem :wink:

Link_pg

Olá!

Basicamente você pode pegar esse seu streaming e transformar em um DataInputStream… dai você usa o readUTF() se não me engano…

DataInputStream entrada = new DataInputStream(socket.getInputStream());
String s = entrada.readUTF();

Daí essa String tu usa onde quiser… setText() do label por exemplo…

Abraços

Link_pg

Na verdade esse DataInputStream é só um exemplo… da uma procurada na API de IO dos packages java.io e java.nio. Tem várias outras classes que podem te ajudar…

Criado 14 de agosto de 2008
Ultima resposta 14 de ago. de 2008
Respostas 7
Participantes 3