style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Sockets en java

Hola Comuniad buen día !!!

Tengo una duda con respecto a los sockets.

En este caso tengo mi Cliente y Servidor. Mi servidor escucha por un puerto definido, y mi cliente puede conectarse cuando lo desee...

Mi duda es:

Cuando mi cliente se conecta por primera vez, tengo entendido que mi Servidor le asigna un puerto para atenderlo, mientras que el Servidor sigue esperando clientes potenciales...por medio de este código:

class ConectarServidor extends Thread{
               
                public void run(){
               
                                try {

                                        socketServidor=new ServerSocket(puerto);
                                        System.out.println("Esperando clientes");
                                       
                                } catch (IOException e1) {
                                        // TODO Auto-generated catch block
                                        e1.printStackTrace();
                                }
                       
                                //El servidor está en espera de alguna conexión.
                                while(true){
                               
                                try {
                                        socket=socketServidor.accept();
                                                                               
                                        System.out.println("Conectado con un cliente ");
                                       
                                        pedirDatos();                                  
                                } catch (IOException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                               
                                recibirDatos();
                        }      
       
                }

        }

Lo que quiero saber, es si mi cliente estará conectado en el mismo socket todo el tiempo ???. Y si ese mismo cliente se desconecta y vuelve a conectarse, estará en otro socket diferente que la primera vez????.

Lo que pasa es que en esta aplicación cuando recibo a un cliente, me imprime en consola "conectado con un cliente". Pero cada vez que recibo un paquete de datos, me imprime el mensaje....como si se tratara de otro cliente...Yo interpreto esto como si se vuelve a conectar....O algo estoy haciendo mal????

Alguien puede explicarme esto....se lo agradeceré....

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

accept()

El método accept(), COMO BIEN DICE LA DOCUMENTACION, bloquea el hilo que lo invoca hasta que se reciba una conexión en el puerto donde escucha el ServerSocket, y entonces te devuelve un Socket. Si tienes un servidor que va a recibir varias conexiones, sobre todo si esperas conexiones simultáneas, entonces debes tener un hilo con un ciclo donde solamente aceptas las conexiones que llegas, y por cada Socket que recibes del método accept(), debes crear un objeto que reciba ese Socket como parámetro (este objeto es quien va a procesar la conexión). Ese objeto debe implementar la interfaz Runnable, porque entonces tienes dos opciones: Una es crear un Thread con ese Runnable como objetivo y echarlo a andar, para que la conexión se procese en un hilo separado; la otra es encolar ese Runnable a un ThreadPool para su ejecución posterior. En ambos casos vas a procesar la conexión aparte.

Ya te había mencionado que en mi blog tengo info al respecto, de hecho el primer ejemplo de código es con el patrón hilo-por-conexión y al final menciono el uso de un ThreadPool. Hoy en día ya no es tan recomendable usar java.nio porque los CPU's ya están muy optimizados para multithreading y usar varios Threads con java.io da mejor performance que el switcheo de contexto que hace java.nio.

Tengo otro artículo que puede servirte también, un poco más orientado al diseño del server, enfocado a seguridad.

Imagen de jtepetate

Que bien...

Que buen aporte el de tu blog...no me lo habías mencionado, pero está muy bien explicado. Se te agradece ezamudio.

Eso haré, trabajaré con hilos diferentes para enviar y recibir información. Claro que si !!!

Oye, ya que conoces esto muy bien, quisiera ver si puedes ayudarme con esto:
Hablando de mi aplicación que estoy desarrollando, recuerdas ??
Desde VB 5 recibo un flujo de bytes...

//ejemplo, si desde VB me envian estos valores:   {1,20,128,68,32,34,3,90,213,153}
//una ves que los recibo, los almaceno en un arreglo de bytes, así:

byte []buffer=new byte[10];
DataInputStream entrada= new DataInputStream(socket.getInputStream());
entrada.read(buffer);

Que en java, en realidad estos valores que son mayores de 127, se convertiran en bytes con signo. O sea 1,20,-128, etc.
Si yo los quisiera recibir como cadena, en vez de bytes....haria algo así, cierto???

BufferedReader entrada= new BufferedReader(new InputStreamReader(socket.getInputStream()));
String mensaje=entrada.readLine();
                       
System.out.println(mensaje); //esto me dará como salida una cadena.

pero si yo vuelvo esa cadena a un arreglo de bytes, veo que cambia su valor, es decir ya no me va a quedar asi:

{1,20,128,68,32,34,3,90,213,153}. sino algo como esto {1,20,-88,68,32,etc...}. a qué se debe esto?????

GRACIAS...

Imagen de ezamudio

bytes

En Java el tipo byte va de -128 a 127. Las cadenas son arreglos de caracteres (tipo char) pero también se pueden ver como arreglos de bytes, aunque de una misma cadena puedes obtener distintos arreglos de bytes según la codificación configurada en la JVM o que le indiques al método getBytes() (hay una variante a la que indicas el encoding o charset que quieres).

Y para que los recibas como cadena, ya te había escrito en el otro post que pusiste (no sé por qué estás poniendo tanto post del mismo tema) que puedes crear el Reader indicando la codificación que necesitas:

new InputStreamReader(socket.getInputStream(), "UTF8"); //o ISO-8859-1 o lo que sea

Imagen de jtepetate

Gracias ezamudio

Bien amigo, muchas gracias !!!

De verdad que fue de mucha ayuda tus aportaciones. Te lo agradezco infinitamente. Voy a seguir investigando, si tengo alguna duda entonces acudiré a ustedes, los expertos.

Buen día.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">