[RESOLVIDO] Mais um chat em Java

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!

apostila fj11

Não entendi a resposta

[quote=Elizeu_Santos]apostila fj11
[/quote]

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

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!

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.

[quote=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.[/quote]

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!!!

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!