[RESOLVIDO] Mais um chat em Java

7 respostas
P

Boa noite pessoal,

Estou pelejando para fazer um chat bem tosco para fins de estudo e estou com dificuldade de entender o que ocorre.

No geral eu tenho 3 classes: Servidor, Cliente, Principal(interface com usuário), e estou querendo fazer como se fosse no padrão MVC

O meu servidor e cliente estão se comunicam blz, mas acontece o seguinte.

Quando o servidor vai responder, o usuário que escreveu a mensagem não recebe a mesma, somente os demais usuários. Eu fiz tentando fazer uma adaptação de um tutorial do próprio GUJ. Só que neste tutorial a interface fica dentro do cliente.

Outra coisa que acontece é q quando eu clico no botão Enviar fica travado e só destrava quando o outro usuário clica no enviar, aí eu recebo a mensagem dele e ele recebe a minha.

Poderiam me ajudar?

Servidor:

package control;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Vector;

import javax.swing.JOptionPane;

public class Servidor extends Thread{
	// Controla as conexões por Threads
	private static Vector clientes;
	// Socket do cliente
	private Socket socket;
	// Nome do cliente
	private String nomeCliente;
	// Lista que armazena nome dos clientes
	private static List listaNomes = new ArrayList();
	
	// Construtor que recebe socket do cliente
	public Servidor(Socket socket){
		this.socket = socket;
	}
	
	
	public static void main(String args[]) {
		// Instancia o vetor de clientes conectados
		clientes = new Vector();

		try {
			ServerSocket serverSocket = new ServerSocket(80);

			//Socket socket = serverSocket.accept();
			
			for (;;) {
				Socket socket = serverSocket.accept();

				Thread tCliente = new Servidor(socket);
				
				tCliente.start();
				
			}
		} catch (Exception e) {
			System.out.println(e);
			System.out.println("Erro servidor");
		}
	}
	
	public void run(){
		
		try {
			DataInputStream in = new DataInputStream(socket
					.getInputStream());
			DataOutputStream out = new DataOutputStream(socket
					.getOutputStream());

			clientes.add(out);
			String msg = in.readUTF();

			while(msg != null){
			
				sentToAll(out, "fala: ", msg);
				
				msg = in.readUTF();
				
			}
			
			this.socket.close();
			
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	}


	private void sentToAll(DataOutputStream out, String acao, String msg){
		Enumeration e = clientes.elements();
		
		while(e.hasMoreElements()){
			DataOutputStream outTodos = (DataOutputStream) e.nextElement();
			
			if(outTodos != out){
				try {
					outTodos.writeUTF(this.nomeCliente + acao + msg);
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		}
		
	}
}

Cliente:

package control;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import javax.swing.JOptionPane;
import javax.swing.JTextArea;

public class Cliente {

	Socket client;
	public Cliente(){
		try {
			client = new Socket("192.168.0.101", 80);
		} catch (UnknownHostException e) {
			JOptionPane.showMessageDialog(null, "Excessão host exception");
			e.printStackTrace();
		} catch (IOException e) {
			JOptionPane.showMessageDialog(null, "Excessão IO exception");
			e.printStackTrace();
		}
	}
	
	
	public void enviaMSG(JTextArea txtArea, String msg){
        try {
        	
        	DataInputStream in = new DataInputStream(client.getInputStream());
        	DataOutputStream out = new DataOutputStream(client.getOutputStream());
            
        	out.writeUTF("Teste diz: " + msg);
            String s = in.readUTF();
           
            txtArea.append(s + "\n");
        	
        }catch (Exception e){
            System.out.println(e);
            JOptionPane.showMessageDialog(null, "Não foi possivel conectar com o servidor");
        }
    }
}

Evento do botão Enviar:

public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand().equals("Enviar")){
			
			String msg = "";
			msg = txtMensagem.getText();
			
			c.enviaMSG(txtaConversa, msg);
			
			txtMensagem.setText("");
		}
	}

Obrigado!

7 Respostas

Elizeu_Santos

apostila fj11

P

Não entendi a resposta

UMC

Elizeu_Santos:
apostila fj11

Uma apostila que você encontra no site da caelum na seção download

P

Baixei a apostila aqui e dei uma olhada. Até vi o modelo de chat lá, mas será que tem como me falar qual é o problema com o meu código.

Obrigado!

ViniGodoy

Ué, vc mesmo pede:

if(outTodos != out){

Esse if diz:

“Não envie para mim mesmo”.

Outra coisa. Seu código foi escrito para Java 1.1? Porque o Vector já deixou de ser usado desde o Java 1.2.

P

ViniGodoy:
Ué, vc mesmo pede:

if(outTodos != out){

Esse if diz:

“Não envie para mim mesmo”.

Outra coisa. Seu código foi escrito para Java 1.1? Porque o Vector já deixou de ser usado desde o Java 1.2.

Agora eu enxerguei! Valeu demais Vini.

A respeito do Vector é por q eu estava acompanhando um tutorial aqui do GUJ mesmo sobre chat. Depois vou tocar por outra estrutura.

Muito obrigado.

Até a próxima!!!

R

gosto deste assunto, vou tentar implementar o chat da apostila… fiz um jogo de poker uma época e estava querendo passar para dois jogadores poderem jogar on line…
iniciou-se um tópico, mas nao foi para frente…

tem algo no meu site, deste jogo para uma pessoa www.raghyjose.net, no link que fala em java, em programação java

o problema é que o endereço lá é para local, depois sempre da outro problema mas na hora eu vejo.

tem funcionado seu chat? vou tentar testar futuramente, pode mandar o post, com o código funcionando?

bem sobre estas bibliotecas mais antigas, gostaria de comentar, eu ja usei vector e gosto de usar, ou usaria se precisasse sei la… geralmente quando preciso um array comum serve. afinal o que é antigo não é inútil. por exemplo num java mais atual, o vector vai funcionar igual nao? talvez tenha algo mais avançado, mas nao chega a ser um erro usar… enfim… levanto a polemica…

acho que aqui é isso aí…

antes falavam mal do meu site, neste modelo… www.raghyjose.net/indexatual.php
andei reformando, to fazendo um outro www.raghyjose.net/indexraghy.php (problemas na sessao do php… por enquanto)

e tem alguns outros (modelos de raghyjose.net) no site, da para olhar… no link, outros modelos na pagina principal… valeu!

Criado 22 de abril de 2011
Ultima resposta 23 de abr. de 2011
Respostas 7
Participantes 5