elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  SocketServer y compañeros
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: SocketServer y compañeros  (Leído 2,236 veces)
ChicoTolerante

Desconectado Desconectado

Mensajes: 9


Ver Perfil
SocketServer y compañeros
« en: 24 Febrero 2013, 17:57 pm »

¡Hola buenas!
Agradecería un montón (y parte del otro) si me pudieran tender una mano con un problemilla de sockets. Estoy ideando un chat, pero ocurre que lo consigo abrir, consigue recibir UN mensaje, pero no controlo suficiente con los threads (si es que es ahí donde está la clave) como para mantener la comunicación abierta entre cliente y servidor y poder prolongar la conversación. Antaño me funcionó, pero ahora que lo estoy haciendo más "limpio", no recuerdo cómo...

El código que tengo es el siguiente:
Código
  1. import java.lang.*;
  2. import java.io.*;
  3. import java.net.*;
  4.  
  5. public class ServidorDelChat extends Thread
  6. {
  7. public static ServerSocket socketServidor;
  8. public static Socket socketConexion;
  9. public static DataOutputStream salidaServidor;
  10. public static BufferedReader entradaServidor;
  11. public static int puerto;
  12.  
  13. //Clase para hablar
  14.    public class HablarDesdeServidor extends Thread
  15.        {
  16.        //CONSTRUCTOR DE HILO para hablar
  17.        public void run()
  18.        {
  19.            try{
  20.                salidaServidor = new DataOutputStream(socketConexion.getOutputStream());
  21.                System.out.println("salidaServidor = new DataOutputStream(socket.getOutputStream());");
  22.                salidaServidor.writeUTF(InterfazDelChat.fieldMensaje.getText());
  23.            }catch(Exception exc) {
  24.                InterfazDelChat.areaChat.append("\nError al ENVIAR el mensaje.\n");}
  25.            }
  26.        }
  27.  
  28.    //Clase para escuchar
  29.    public class EscucharDesdeServidor extends Thread
  30.        {
  31.        //CONSTRUCTOR DE HILO para escuchar
  32.        public void run()
  33.            {
  34.            System.out.println("\nLa clase Thread.EscucharDesdeServidor SÍ FUNCIONA.");
  35.            System.out.println("Valor de ServerSocket socketServidor: " + socketServidor);
  36.                try{
  37.                    entradaServidor = new BufferedReader(new InputStreamReader(socketConexion.getInputStream())); //Coge el InputStream, lo pone en un lector y el resultado en un búffer.
  38.                    InterfazDelChat.areaChat.append("\nLa otra persona dice...\n" + entradaServidor.readLine() + "\n");
  39.                }catch(Exception exc){
  40.                    InterfazDelChat.areaChat.append("\nError al RECIBIR el mensaje.\n");}
  41.  
  42.            }
  43.        }
  44.  
  45.    //Clase para conectar
  46.    public class ConectarDesdeServidor extends Thread
  47.        {
  48.        //CONSTRUCTOR DE HILO para conectar
  49.        public void run()
  50.            {
  51.            System.out.println("La clase Thread.ConectarDesdeServidor SÍ FUNCIONA.");
  52.            try{
  53.                puerto = Integer.parseInt(InterfazDelChat.fieldPuerto.getText());
  54.                socketServidor = new ServerSocket(puerto, 2);
  55.  
  56.                socketConexion = new Socket();
  57.                System.out.println("Parámetro de ServerSocket(puerto): " + puerto);
  58.                System.out.println("Valor de ServerSocket socketServidor: " + socketServidor);
  59.                System.out.println("Valor de Socket socket: " + socketConexion);
  60.  
  61.                socketConexion = socketServidor.accept(); //Aquí espera a que alguien haga la petición. La petición se inicia en el envío del primer mensaje.
  62.  
  63.                InterfazDelChat.fieldDireccionLocal.setText("" + socketConexion.getLocalSocketAddress());
  64.                InterfazDelChat.fieldDireccionRemota.setText("" + socketConexion.getRemoteSocketAddress());
  65.  
  66.                System.out.println("Dirección socket local: " + socketConexion.getLocalSocketAddress());
  67.                System.out.println("Dirección socket remoto: " + socketConexion.getRemoteSocketAddress());
  68.                System.out.println("Valor de (socket = socketServidor.accept()): " + socketConexion);
  69.  
  70.  
  71.  
  72.                System.out.println("Ahora, se supone, estamos enlazados.");
  73.                InterfazDelChat.fieldAyuda.setText("Conectado.");
  74.            }catch(Exception exc) {
  75.                }
  76.            }
  77.        }
  78.  
  79.    //Clase para desconectar
  80.    public class DesconectarDesdeServidor extends Thread
  81.        {
  82.        //CONSTRUCTOR DE HILO para desconectar
  83.        public void run()
  84.            {
  85.            try{
  86.                socketConexion.close();
  87.                entradaServidor.close();
  88.                salidaServidor.close();
  89.            }catch(Exception exc) {
  90.                }
  91.            }
  92.        }
  93. //CONSTRUCTOR
  94. public ServidorDelChat()
  95.    {
  96.    System.out.println("El método constructor de ServidorDelChat() SÍ funciona.");
  97.        (new ConectarDesdeServidor()).run();
  98.        (new EscucharDesdeServidor()).run();    
  99.    }
  100.  
  101. }
  102.  
  103.  

He probado introduciendo bucles en la clase para conectar y en la clase para hablar, pero no hay manera... no se me ocurre nada. Cualquier consejo será de gran ayuda.
¡Gracias, sois muy cracks! ;)


En línea

ChicoTolerante

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: SocketServer y compañeros
« Respuesta #1 en: 24 Febrero 2013, 18:10 pm »

Breve explicación para entender mejor el código:
1. Todos los "System.out.println(*);" en realidad sobran, lo que pasa que los utilizo para ir siguiendo el programa, por donde va pasando, e ir quedándome con ciertos valores para ir entendiéndolo mejor.
2. La idea general es crear 4 clases diferentes:
 - ConectarDesdeServidor: para conectar con el cliente.
 - HablarDesdeServidor: para hablar con el cliente.
 - EscucharDesdeServidor: para escuchar al cliente.
 - DesconectarDesdeServidor: para desconectar las conexiones, o por lo menos la del cliente.
3. Esto lo hago para poder usar con más libertad los Threads. Por eso cada una de estas clases cumple una función y todas derivan de la clase Thread de Java, para poder usarlas como hilos.
4. No sé bien bien cómo podría hacerlo para que haya una escucha y una posibilidad de hablar al mismo tiempo (eso sí, con "synchronized), pero de una manera CONTINUADA, y no sólo espontánea (ahora consigo que se envíe y se reciba un mensaje, pero nada más...)


En línea

ChicoTolerante

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: SocketServer y compañeros
« Respuesta #2 en: 24 Febrero 2013, 22:04 pm »

Reformularé la pregunta, porque creo que es leer código innecesariamente:

¿Cómo puedo hacer para abrir una conexión entre un socket servidor y otro cliente y dejarla abierta para que se puedan enviar mensajes entre sí?

Gracias, y perdón por no haber sido más conciso.
En línea

ChicoTolerante

Desconectado Desconectado

Mensajes: 9


Ver Perfil
Re: SocketServer y compañeros
« Respuesta #3 en: 27 Febrero 2013, 01:31 am »

Respuesta:
No hay ningún problema. Desde el momento en que acepta, un socket nuevo es creado para seguir escuchando a otros clientes, pero el primero se mantiene abierto en el puerto ServerSocket.getLocalPort(). Así que el problema debe ser otro... y ello debería ir en otro post. En concreto, es un problema de actualizar el JTextArea donde debería aparecer el mensaje nada más entrar la info del DataInputStream. Pero lo comento en otro post.

Gracias y disculpen!!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Compañeros ayudenme. « 1 2 »
GNU/Linux
portaro 14 7,619 Último mensaje 1 Junio 2010, 03:12 am
por portaro
Compañeros necesito ayuda
Ingeniería Inversa
suicidexcode 4 8,627 Último mensaje 27 Noviembre 2014, 12:14 pm
por .:UND3R:.
Buscando compañeros de practica en SDL 2 « 1 2 3 »
Programación C/C++
erest0r 27 11,204 Último mensaje 11 Marzo 2014, 16:14 pm
por vangodp
ayudenme con un juego xfa compañeros
Foro Libre
cristian_chuev 1 1,443 Último mensaje 2 Agosto 2016, 02:27 am
por MCKSys Argentina
Compañeros de grupo.
Foro Libre
dopr 0 1,351 Último mensaje 22 Agosto 2016, 14:44 pm
por dopr
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines