Foro de elhacker.net

Programación => Java => Mensaje iniciado por: undercode2 en 5 Mayo 2011, 02:39 am



Título: Problema enviando Strings por sockets en una multiconexion por Thread
Publicado por: undercode2 en 5 Mayo 2011, 02:39 am
Hola que tal, miren esto es asi, es un programa que se conectan varios usuarios y tanto yo como ellos tenemos que tener la capacidad de enviarnos cadenas de texto (charlar)

Ahora bien, nesesito user Thread porque se pueden llegar a conectar muchos, y se me complica para enviar los datos porque el metodo enviarDatos que esta dentro de la clase User que es cuando ya establesco una conexion con el usuario, es el que envia las cadenas, pero yo el boton enviar lo apreto y obtengo el string en el cliente (donde esta la interfaz), y no se como hacer para poder usar el metodo ese siendo que puede llegar a haber muchos users.....pero en un primer momento no se como hacer ni para uno solo:

Les dejo un pedazo de codigo para que no se pierdan


Código
  1. class User extends Thread{
  2.  
  3.    private Socket socket = null;
  4.    private Cliente cliente = null;
  5.    private int id = 0;
  6.    private ObjectOutputStream salida;
  7.    private ObjectInputStream entrada;
  8.    private String mensaje="";
  9.  
  10.    public User(Cliente cliente,Socket socket,int id){
  11.        this.cliente = cliente;
  12.        this.socket = socket;
  13.        this.id = id;
  14.    }
  15.  
  16.  
  17.    @Override
  18.    public synchronized void run(){
  19.        try {
  20.            obtenerFlujos();
  21.        }
  22.        catch (EOFException excepcionEOF) {
  23.            System.err.println("Se desconecto alguien");
  24.        }
  25.        catch (Exception err) {}
  26.        finally {
  27.            cerrarConexion();//todo
  28.        }  
  29.    }
  30.  
  31.    private void obtenerFlujos() throws IOException{
  32.        salida = new ObjectOutputStream(socket.getOutputStream());
  33.        salida.flush();
  34.        entrada = new ObjectInputStream(socket.getInputStream());
  35.        System.out.println("Se conecto alguien");
  36.    }
  37.  
  38.    public void enviarDatos( String mensaje ) {
  39.        try {
  40.            salida.writeObject(mensaje);
  41.            salida.flush();
  42.            System.out.println("Se envio: "+ mensaje);
  43.        }
  44.        catch (IOException e) {
  45.            System.err.println("Error al escribir objeto");
  46.        }
  47.    }
  48.  
  49.  
  50. }
  51.  
  52.  
  53.  
  54. class socket extends ServerSocket implements Runnable{
  55.  
  56.    private Socket socket = null;
  57.    private Cliente cliente = null;
  58.  
  59.    public socket(int port, int backlog,Cliente cliente) throws IOException {
  60.        super(port, backlog);
  61.        this.cliente = cliente;
  62.    }
  63.  
  64.  
  65.    @Override
  66.    public synchronized void run() {
  67.        int n=0;
  68.        while(true){
  69.            try {
  70.                this.socket = accept();
  71.                User user = new User(cliente,socket,n);
  72.                user.start();
  73.            }catch(IOException e){}
  74.        }
  75.    }
  76. }
  77.  
  78.  
  79. public class Cliente extends JFrame implements ActionListener {
  80.  
  81.    private socket socket = null;
  82.  
  83.    @Override
  84.    public void actionPerformed(ActionEvent e) {
  85.        Object evt = e.getSource();
  86.        if(evt==buttonInit) {
  87.            try {
  88.                    socket = new socket(Integer.parseInt(textFieldPort.getText()),100,this);
  89.                    new Thread(socket).start();
  90.                }
  91.            }catch(IOException err){}
  92.        }
  93.        if(evt==botonComando){
  94.            user.enviarDatos(comando.getText());   //Aca no se como hacer para enviar un string a la otra persona.......
  95.        }
  96.  
  97.    }
  98.  
  99.    public Cliente(){
  100.        CrearInterfaz();
  101.        getContentPane().add(panel,BorderLayout.NORTH);
  102.        getContentPane().add(scrollPane,BorderLayout.CENTER);
  103.    }
  104.  
  105.    public static void main(String[] args){
  106.        new Cliente();
  107.    }
  108.  
  109.    private JTextField comando = null;
  110.    private JButton botonComando = null;
  111.    private JPanel panel = null;
  112.    private JScrollPane scrollPane = null;
  113.  
  114.    private void CrearInterfaz(){
  115.        this.comando = new JTextField(40);
  116.        this.botonComando = new JButton("Enviar");
  117.        this.panel.add(comando);
  118.        this.panel.add(botonComando);
  119.        this.botonComando.addActionListener(this);
  120.    }
  121.  
  122. }
  123.  

Haber si a alguien se le ocurre algo


Título: Re: Problema enviando Strings por sockets en una multiconexion por Thread
Publicado por: Leyer en 5 Mayo 2011, 03:21 am
Usa un ThreadGroup :P

:http://www.java2s.com/Tutorial/Java/0160__Thread/0090__ThreadGroup.htm
:http://artemisa.unicauca.edu.co/~dparedes/java/threads/threadgroup.html
 
Y en tu clase socket creas un metodo get que retorne el grupo de hilos y obtienes los hilos usuarios de la siguiente manera te quedaria algo asi.

Código
  1. Thread users[] = new Thread[socket.getThreadGroup.activeCount()];
  2.    socket.getThreadGroup.enumerate(users);
  3.    for (Thread thread:users) {
  4.      ((User)thread).enviarDatos("");
  5.    }

Un saludo.