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.
Cualquier duda acerca del codigo me avisan, espero sus respuestas
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