java sockets serversocket

java - ¿Cuál es la diferencia entre Socket y ServerSocket?



java serversocket (9)

por qué socket.read lee los datos del lado del servidor

Como está leyendo los datos enviados por el servidor a través de la red , no está leyendo directamente el sistema de archivos del servidor ni los recursos (db, ram o algo por el estilo), está leyendo los datos que ya fueron procesados ​​por ServerSocket.

Piense en Socket como su navegador web y ServerSocket como servidor web remoto.

Cuando solicita una imagen, página, etc., el servidor web (The ServerSocket) escribe los bytes en el cliente, a su vez el cliente tiene que leerlos (para saber qué envió el servidor web ¿no?) Y procesarlos mostrándolos al final usuario.

Lo mismo sucedió con ServerSocket / Socket pero en un nivel inferior. El socket lee información de ServerSocket.

¿Tiene sentido?

Si Socket representa el lado del cliente y ServerSocket representa el lado del servidor, ¿ Socket.read qué Socket.read lee los datos del lado del servidor? Estoy realmente confundido, ¿me puedes aclararlo?


(Publico esta respuesta porque siempre siento que es importante hacer la lógica correcta).

Te sugiero que eches un vistazo a la siguiente muestra.

http://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html

Es cierto que, al llevar a cabo la comunicación TCP / IP, toda la información necesaria puede ser proporcionada por la clase Socket solo con el único propósito de la comunicación. No importa si está del lado del servidor o del lado del cliente.

Como puede ver en el enlace de arriba, el lado del servidor usa el siguiente código para adquirir su propia instancia de Socket . Es decir, se crea otro socket en otro puerto.

Luego, el servidor usa esta instancia de Socket para hablar con el cliente.

Y para completar la imagen, debajo del fragmento de código se muestra la instancia del Socket del Socket .

Entonces, si Socket puede hacerlo todo, ¿por qué todavía necesitamos ServerSocket ?

Esto se debe al paradigma de trabajo de la comunicación a través del protocolo TCP / IP.

Cuando dos programas hablan sobre TCP / IP, generalmente uno escuchará / esperará de forma pasiva en un <IP:port> y el otro se conectará activamente a él.

Entonces pueden ver, en esta misma starting phase de la comunicación, los 2 lados tienen comportamientos muy diferentes. Entonces, se usan 2 clases diferentes para reflejar esta diferencia.

  • Socket clase de Socket encapsula el comportamiento del lado activo. (también conocido como el cliente)
  • ServerSocket clase ServerSocket encapsula el comportamiento del lado pasivo (también conocido como el servidor)

Una vez que ServerSocket realizó su tarea de escucha y detected una conexión entrante, la accept() y creará una nueva instancia de Socket para facilitar la comunicación.

De forma java.nio , en el paquete java.nio , encontrará las clases ServerSocketChannel y SocketChannel . Y aún así, se comportan así:

ServerSocketChannel -------------> SocketChannel accept()

Entonces, hasta cierto punto, estoy de acuerdo con @JohnK, como señaló en el comentario, it''s more or less just a 6-letter difference .


Antes que nada, aclaremos cómo es el Socket IS: en un caso común, Socket es una concatenación de IP y puerto a través de : por ejemplo: 127.0.0.1:8080 .

Entonces, decidió hacer una aplicación cliente-servidor usando Socket . No hay nada demasiado complicado. Aquí hay una breve explicación sobre cómo hacer la conexión entre el client y el server :

  1. Antes que nada, aclaremos el hecho de que nuestro client tiene su propio Socket y conoce la dirección IP y el puerto del server . Para el server , se proporcionan solo ServerSocket y puerto. En ambos casos, el puerto es el mismo número entre 0 y 65535.
  2. Entonces, decidimos conectar nuestro client a nuestro server :

    • client crea su objeto Socket clientSocket con IP y puerto conocidos de nuestro server .

    • server recibió una solicitud de conexión entrante con su método ServerSocket.accept() , que genera un nuevo objeto Socket newClientSocket (aún en el lado del server (!)).

    • El intercambio adicional de datos se realiza a través de los objetos clientSocket y newClientSocket (no entre clientSocket y ServerSocket ).

Here hay una imagen casi perfecta para comprender el proceso de conexión básico (tenga en cuenta que el objeto Socket en el Client en esta imagen - mismos objetos).

Una vez que haya creado esta estructura simple, debe abrir dos Client.clientSocket en ambos lados, Client.clientSocket y Server.newClientSocket , para leer y escribir información.



Porque está leyendo lo que te ha enviado el servidor.


ServerSocket es nuevamente un Socket con funciones adicionales de punto final del servidor. Las características del servidor incluyen escuchar el puerto y aceptar una conexión entrante, etc.


ServerSocket se crea para bind a un puerto y listen para una connect de un cliente. Entonces, un servidor solo espera una conversación y no inicia una.

ClientSocket está creado para connect a un servidor de listen . El cliente inicia la conexión.

Ejemplo: piense en un centro de llamadas entrante como ejemplo. Estos servicios son servidores. No inician una llamada, sino que aguardan la llamada de los clientes. Una vez que las llamadas entran, pueden participar en una conversación bidireccional.


Socket es para el lado del cliente y ServerSocket es para el lado del servidor.


java.net.ServerSocket

Esta clase implementa los sockets del servidor. Un socket de servidor espera a que las solicitudes entren a través de la red. Realiza alguna operación basada en esa solicitud, y luego posiblemente devuelve un resultado al solicitante.

java.net.Socket

Esta clase implementa sockets de cliente (también llamados solo "sockets"). Un socket es un punto final para la comunicación entre dos máquinas.