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 deSocket
encapsula el comportamiento del lado activo. (también conocido como el cliente) -
ServerSocket
claseServerSocket
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
:
- Antes que nada, aclaremos el hecho de que nuestro
client
tiene su propioSocket
y conoce la dirección IP y el puerto delserver
. Para elserver
, se proporcionan soloServerSocket
y puerto. En ambos casos, el puerto es el mismo número entre 0 y 65535. Entonces, decidimos conectar nuestro
client
a nuestroserver
:client
crea su objetoSocket clientSocket
con IP y puerto conocidos de nuestroserver
.server
recibió una solicitud de conexión entrante con su métodoServerSocket.accept()
, que genera un nuevo objetoSocket newClientSocket
(aún en el lado delserver
(!)).El intercambio adicional de datos se realiza a través de los objetos
clientSocket
ynewClientSocket
(no entreclientSocket
yServerSocket
).
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.
Eche un vistazo a http://java.sun.com/docs/books/tutorial/networking/sockets/
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.