Chat multi-cliente

Iniciado por 4BatPremier, 25 Febrero 2014, 06:50 AM

0 Miembros y 1 Visitante están viendo este tema.

4BatPremier

Antes que nada saludos y gracias de antemano.

Tengo un problema al hacer un chat multi-cliente, cuando ejecuto el servidor y un cliente de la aplicacion todo funciona perfecto el problema viene cuando ejecuto el segundo cliente y envio un mensaje por el chat. Al enviar un mensaje desde el segundo cliente el JTextArea que es donde estan las conversaciones se agrega el mensaje dos veces y el JTextArea del primer cliente no se actualiza y deja de poner enviar mensajes.

Aqui les subire las clases de donde creo que ocurre el problema.


Código (java) [Seleccionar]

package com.gestion.garage.servidor;

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

import javax.swing.DefaultListModel;
import javax.swing.event.ListDataEvent;
import javax.swing.event.ListDataListener;

public class HiloDeCliente implements Runnable,ListDataListener{
private DefaultListModel<String> conversacion;
private static DataOutputStream dataSalida;
private static DataInputStream dataEntrada;
private Socket socket;

public HiloDeCliente(DefaultListModel<String> conversacion, Socket socket){
this.conversacion = conversacion;
this.socket = socket;
try{
dataSalida = new DataOutputStream(socket.getOutputStream());
dataEntrada = new DataInputStream(socket.getInputStream());
conversacion.addListDataListener(HiloDeCliente.this);
}
catch(Exception e){
e.printStackTrace();
}
}

public static void cerrarFlujos() throws IOException{
dataSalida.close();
dataEntrada.close();
}
// No hace nada
public void contentsChanged(ListDataEvent arg0) {}

public void intervalAdded(ListDataEvent e) {
String texto = (String) conversacion.getElementAt(e.getIndex0());
try{
dataSalida.writeUTF(texto);
}
catch(Exception ex){
ex.printStackTrace();
}
}
//No hace nada
public void intervalRemoved(ListDataEvent arg0) {
}

public void run() {
try{
while(true){
String texto = dataEntrada.readUTF();
synchronized(conversacion){
conversacion.addElement(texto);
System.out.println("Hay "+conversacion.getSize()+" elementos");
}
}
}catch(Exception e){
e.printStackTrace();

}
}
}



Código (java) [Seleccionar]

package com.gestion.garage.InterfazGrafica;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;

public class ControlCliente implements Runnable,ActionListener{

private DataOutputStream dataSalida;
private DataInputStream dataEntrada;
private VentanaAdministrador panel;

public ControlCliente(Socket socket,VentanaAdministrador panel){
this.panel = panel;
try{
dataEntrada = new DataInputStream(socket.getInputStream());
dataSalida = new DataOutputStream(socket.getOutputStream());
panel.addActionListener(this);
Thread hilo = new Thread(this);
hilo.start();
}
catch(Exception ex){
ex.printStackTrace();
}
}

public void actionPerformed(ActionEvent arg0) {
try
        {
            dataSalida.writeUTF(panel.getTexto());
        } catch (Exception excepcion)
        {
            excepcion.printStackTrace();
        }

}

public void run() {
try
        {
            while (true)
            {
                String texto = dataEntrada.readUTF();
                panel.addTexto(texto);
                panel.addTexto("\n");
            }
        } catch (Exception e)
        {
            e.printStackTrace();
        }
}

}



Código (java) [Seleccionar]

package com.gestion.garage.InterfazGrafica;

import java.awt.Font;

public class Login extends JFrame {
private JTextField txtUsuario;
private JPasswordField txtPassword;
private Socket socket;
private VentanaAdministrador panel;
public Login(){
setTitle("Login");
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
setSize(354,308);
getContentPane().setLayout(null);

addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
int eleccion = JOptionPane.showConfirmDialog(null,"¿Desea cerrar esta ventana?");
if(eleccion==0){
try {
HiloDeCliente.cerrarFlujos();
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
txtUsuario = new JTextField();
txtUsuario.setBounds(98, 55, 143, 20);
getContentPane().add(txtUsuario);
txtUsuario.setColumns(10);

txtPassword = new JPasswordField();
txtPassword.setBounds(98, 132, 143, 20);
getContentPane().add(txtPassword);

JLabel lblUsuario = new JLabel("Usuario");
lblUsuario.setFont(new Font("Cambria Math", Font.BOLD, 15));
lblUsuario.setBounds(137, 27, 66, 14);
getContentPane().add(lblUsuario);

JLabel lblPassword = new JLabel("Password");
lblPassword.setFont(new Font("Cambria Math", Font.BOLD, 15));
lblPassword.setBounds(131, 105, 82, 14);
getContentPane().add(lblPassword);

JButton btnIniciar = new JButton("Iniciar");
btnIniciar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
System.out.println(ConexionMySql.getInstancia().verificarUsuario(txtUsuario.getText()));
if(ConexionMySql.getInstancia().verificarUsuario(txtUsuario.getText())){
try {
new ControlCliente(new Socket("localhost",5557),new VentanaAdministrador(ConexionMySql.getInstancia().obtenerNombre(txtUsuario.getText())));
} catch (IOException e) {
e.printStackTrace();
}
Login.this.dispose();
}
else{
JOptionPane.showMessageDialog(null, "No hay ningun usuario registrado con estos datos");
}
}
});
btnIniciar.setBounds(124, 181, 89, 23);
getContentPane().add(btnIniciar);

JLabel lblRegistrarse = new JLabel("Registrarse");
lblRegistrarse.addMouseListener(new MouseAdapter() {

public void mouseClicked(MouseEvent arg0) {
new VentanaRegistro();
Login.this.dispose();
}
});
lblRegistrarse.setFont(new Font("Cambria Math", Font.BOLD, 15));
lblRegistrarse.setBounds(225, 238, 89, 20);
getContentPane().add(lblRegistrarse);
setVisible(true);
}
}



Código (java) [Seleccionar]
package com.gestion.garage.servidor;

import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.DefaultListModel;

public class ServidorChat {

private DefaultListModel<String> conversacion = new DefaultListModel<String>();
public static void main(String[] args){
new ServidorChat();
}

public ServidorChat(){
try{
ServerSocket socketServidor = new ServerSocket(5557);
while(true){
Socket cliente = socketServidor.accept();
Runnable nuevoCliente = new HiloDeCliente(conversacion,cliente);
Thread hilo = new Thread(nuevoCliente);
hilo.start();
}
}catch(Exception e){
e.printStackTrace();
}
}
}


Código (java) [Seleccionar]

package com.gestion.garage.InterfazGrafica;

import java.awt.Font;

public class VentanaAdministrador extends JFrame{
private DataOutputStream dataSalida;
private DataInputStream dataEntrada;
private Socket socket;
private static final int precio = 0;
private static JTextField txtMensaje;
private JComboBox cbRuedas;
private JComboBox cbTipoVehiculo;
private JComboBox cbModelo;
private JButton btnCalcular;
private JLabel lblPrecio;
private JTable tblVehiculos;
private JTextField txtPlaca;
private JTextField txtPropietario;
private JTextField txtMarca;
private JButton btnRegistrar;
private JButton btnEnviar;
private JTextArea txtChat;

public VentanaAdministrador(String nombreUsuario) throws IOException{
super("Garage - El Gomerito - ");
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
setSize(764,421);
getContentPane().setLayout(null);

addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
int eleccion = JOptionPane.showConfirmDialog(null,"¿Desea cerrar esta ventana?");
if(eleccion==0){
new Login();
VentanaAdministrador.this.dispose();
}
}
});

JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);
tabbedPane.setBounds(0, 0, 748, 394);
getContentPane().add(tabbedPane);

JPanel pnAlta = new JPanel();
tabbedPane.addTab("Registro", null, pnAlta, null);
pnAlta.setLayout(null);

cbTipoVehiculo = new JComboBox();
cbTipoVehiculo.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if(cbTipoVehiculo.getSelectedIndex() == 0){
cbRuedas.setModel(new DefaultComboBoxModel(new String[]{"1","2","3","4"}));
cbModelo.setModel(new DefaultComboBoxModel(new String[]{"Carro","Jeepeta","Camioneta"}));
}
else{
cbRuedas.setModel(new DefaultComboBoxModel(new String[]{"1","2"}));
cbModelo.setModel(new DefaultComboBoxModel(new String[]{"Pasola","Jumbo","Motor"}));
}
}
});
cbTipoVehiculo.setModel(new DefaultComboBoxModel(new String[] {"Coche", "Moto"}));
cbTipoVehiculo.setBounds(202, 11, 107, 20);
pnAlta.add(cbTipoVehiculo);

JLabel lblTipoVehiculo = new JLabel("Tipo Vehiculo");
lblTipoVehiculo.setFont(new Font("Tahoma", Font.BOLD, 16));
lblTipoVehiculo.setBounds(10, 11, 122, 17);
pnAlta.add(lblTipoVehiculo);

JLabel lblRuedas = new JLabel("Ruedas");
lblRuedas.setFont(new Font("Tahoma", Font.BOLD, 16));
lblRuedas.setBounds(10, 60, 122, 14);
pnAlta.add(lblRuedas);

cbRuedas= new JComboBox();
cbRuedas.setBounds(202, 57, 107, 20);
pnAlta.add(cbRuedas);

cbModelo = new JComboBox();
cbModelo.setBounds(202, 107, 107, 20);
pnAlta.add(cbModelo);

JLabel lblModelo = new JLabel("Modelo");
lblModelo.setFont(new Font("Tahoma", Font.BOLD, 16));
lblModelo.setBounds(10, 107, 122, 20);
pnAlta.add(lblModelo);

lblPrecio = new JLabel("0.00");
lblPrecio.setFont(new Font("Tahoma", Font.BOLD | Font.ITALIC, 32));
lblPrecio.setBounds(202, 297, 92, 29);
pnAlta.add(lblPrecio);
btnRegistrar = new JButton("Registrar");
btnRegistrar.setEnabled(false);
btnRegistrar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if(txtMarca.getText().equals("") || txtPropietario.getText().equals("") || txtPlaca.getText().equals("")){
JOptionPane.showMessageDialog(null,"Debe llenar todos los campos antes de registrar");
}
else{
ModeloTabla.getInstancia().agregarVehiculo(new Vehiculo(txtMarca.getText(),txtPropietario.getText(),
Integer.parseInt((String)cbRuedas.getSelectedItem()),txtPlaca.getText()));
txtPropietario.setText("");
txtMarca.setText("");
txtPlaca.setText("");
}
}
});
btnRegistrar.setFont(new Font("Tahoma", Font.BOLD, 13));
btnRegistrar.setBounds(538, 305, 107, 29);
pnAlta.add(btnRegistrar);

btnCalcular = new JButton("Calcular");
btnCalcular.setFont(new Font("Tahoma", Font.BOLD, 13));
btnCalcular.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(cbTipoVehiculo.getSelectedIndex()==0 && cbRuedas.getSelectedIndex()==-1 && cbModelo.getSelectedIndex()==-1){
JOptionPane.showMessageDialog(null, "Debe seleccionar el tipo de vehiculo");
}
else{
btnRegistrar.setEnabled(true);
if(cbTipoVehiculo.getSelectedItem().equals("Coche")){
lblPrecio.setText(String.valueOf(400*Integer.parseInt((String)cbRuedas.getSelectedItem()))+"$");
}
else{
lblPrecio.setText(String.valueOf(400*Integer.parseInt((String)cbRuedas.getSelectedItem()))+"$");
}
}
}
});
btnCalcular.setBounds(38, 309, 89, 23);
pnAlta.add(btnCalcular);

txtPlaca = new JTextField();
txtPlaca.setBounds(202, 147, 107, 20);
pnAlta.add(txtPlaca);
txtPlaca.setColumns(10);

txtPropietario = new JTextField();
txtPropietario.setBounds(202, 199, 107, 20);
pnAlta.add(txtPropietario);
txtPropietario.setColumns(10);

JLabel lblPlaca = new JLabel("Placa");
lblPlaca.setFont(new Font("Tahoma", Font.BOLD, 16));
lblPlaca.setBounds(10, 153, 122, 14);
pnAlta.add(lblPlaca);

JLabel lblPropietario = new JLabel("Propietario");
lblPropietario.setFont(new Font("Tahoma", Font.BOLD, 16));
lblPropietario.setBounds(10, 200, 122, 14);
pnAlta.add(lblPropietario);

JLabel lblMarca = new JLabel("Marca");
lblMarca.setFont(new Font("Tahoma", Font.BOLD, 16));
lblMarca.setBounds(10, 251, 122, 14);
pnAlta.add(lblMarca);

txtMarca = new JTextField();
txtMarca.setBounds(202, 246, 107, 20);
pnAlta.add(txtMarca);
txtMarca.setColumns(10);

JLabel lblBienvenido = new JLabel("Bienvenido: ");
lblBienvenido.setFont(new Font("Tahoma", Font.BOLD, 16));
lblBienvenido.setBounds(378, 14, 116, 17);
pnAlta.add(lblBienvenido);

JLabel lblNombreUsuario = new JLabel(nombreUsuario);
lblNombreUsuario.setFont(new Font("Tahoma", Font.BOLD, 16));
lblNombreUsuario.setBounds(504, 11, 212, 20);
pnAlta.add(lblNombreUsuario);

JPanel pnChat = new JPanel();
tabbedPane.addTab("Chat", null, pnChat, null);
pnChat.setLayout(null);

JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(0, 0, 733, 294);
pnChat.add(scrollPane);

txtChat = new JTextArea();
scrollPane.setViewportView(txtChat);
txtChat.setEditable(false);

txtMensaje = new JTextField();
txtMensaje.setBounds(0, 298, 610, 27);
pnChat.add(txtMensaje);
txtMensaje.setColumns(10);

btnEnviar = new JButton("Enviar");
btnEnviar.setBounds(611, 298, 120, 27);
pnChat.add(btnEnviar);
JPanel pnGarage = new JPanel();
tabbedPane.addTab("Garage", null, pnGarage, null);
pnGarage.setLayout(null);

JButton btnDespachar = new JButton("Despachar");
btnDespachar.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
if(tblVehiculos.getSelectedRow()==-1){
JOptionPane.showMessageDialog(null, "Debe seleccionar una columna");
}
else{
ModeloTabla.getInstancia().borrarVehiculo(tblVehiculos.getSelectedRow());
}
}
});
btnDespachar.setFont(new Font("Tahoma", Font.BOLD, 16));
btnDespachar.setBounds(273, 309, 132, 29);
pnGarage.add(btnDespachar);

JScrollPane scrollPane_1 = new JScrollPane();
scrollPane_1.setBounds(10, 29, 708, 212);
pnGarage.add(scrollPane_1);

tblVehiculos = new JTable();
tblVehiculos.setModel(ModeloTabla.getInstancia());
scrollPane_1.setViewportView(tblVehiculos);
setVisible(true);
}
public void addActionListener(ActionListener accion){
txtMensaje.addActionListener(accion);
btnEnviar.addActionListener(accion);
}

public  void addTexto(String texto){
txtChat.append(texto);
}

public String getTexto(){
String texto = txtMensaje.getText();
txtMensaje.setText("");
return texto;
}

}


Código (java) [Seleccionar]

package com.gestion.garage.practicas;

import com.gestion.garage.InterfazGrafica.Login;

public class SistemaGarage {
public static void main(String[] args){
new Login();
}
}


Cualquier duda acerca del codigo me avisan, espero sus respuestas :)