web-dev-qa-db-fra.com

Quelle est la différence entre Socket et ServerSocket?

Si Socket représente le côté client et ServerSocket représente le côté serveur, pourquoi Socket.read lit les données côté serveur? Je suis vraiment confus, pouvez-vous me le préciser?

33
sevugarajan

(Je poste cette réponse parce que je pense toujours qu'il est important de faire la bonne logique.)

Je vous suggère de jeter un œil à l'exemple suivant.

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

Certes, lors de la communication TCP/IP, toutes les informations nécessaires peuvent être fournies par la classe Socket seule dans le seul but de la communication. Peu importe que ce soit côté serveur ou côté client.

Comme vous pouvez le voir sur le lien ci-dessus, côté serveur utilisez le code suivant pour acquérir sa propre instance Socket. Autrement dit, un autre socket est créé sur le même port local du serveur et la paire de ports client .

enter image description here

Ensuite, le serveur utilise cette instance Socket pour parler au client.

Et pour compléter l'image, l'extrait de code ci-dessous montre clien l'instance Socket de t.

enter image description here

Donc, si Socket peut déjà tout faire, pourquoi avons-nous encore besoin de ServerSocket?

Cela est dû au paradigme de travail de la communication via le protocole TCP/IP.

Lorsque 2 programmes parlent sur TCP/IP, généralement un passivement écoute/attend un <IP:port> Et l'autre activement se connecte à il.

Ainsi vous pouvez voir, à ce même starting phase De la communication, les 2 côtés ont des comportements très différents. Donc, 2 classes différentes sont utilisées pour refléter cette différence.

  • La classe Socket encapsule le comportement du côté actif. (alias le client)
  • ServerSocket classe encapsule le comportement du côté passif (alias le serveur)

Une fois que le ServerSocket a accompli sa tâche d'écoute et detected une connexion entrante, il le accept() et crée une nouvelle instance de Socket pour faciliter la communication.

De même, dans le package Java.nio, Vous trouverez les classes ServerSocketChannel et SocketChannel. Et pourtant, ils se comportent comme ceci:

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

Donc, dans une certaine mesure, je suis d'accord avec @JohnK comme il l'a souligné dans le commentaire, it's more or less just a 6-letter difference.

27
smwikipedia

pourquoi socket.read lit les données du côté serveur

Parce qu'il lit les données envoyé par le serveur via le résea, il ne lit pas directement le système de fichiers du serveur ou les ressources (db, ram ou quelque chose comme ça), il lit les données déjà traitées par le ServerSocket.

Considérez le Socket comme votre navigateur Web et le ServerSocket comme le serveur Web distant.

Lorsque vous demandez une image, une page, etc., le serveur Web (The ServerSocket) écrit les octets au client, à son tour, le client doit les lire (pour savoir ce que le serveur Web a envoyé correctement?) Et les traiter en les affichant à la fin utilisateur.

La même chose s'est produite avec ServerSocket/Socket mais à un niveau inférieur. Le socket lit les informations du ServerSocket.

Est-ce que ça fait du sens?

9
OscarRyz

Java.net.ServerSocket

Cette classe implémente les sockets serveur. Un socket serveur attend que les demandes arrivent sur le réseau. Il effectue une opération basée sur cette demande, puis renvoie éventuellement un résultat au demandeur.

Java.net.Socket

Cette classe implémente les sockets client (également appelées "sockets"). Un socket est un point de terminaison pour la communication entre deux machines.

8
Marc Juchli

Tout d'abord, clarifions à quoi ressemble IS Socket: dans un cas courant, Socket est une concaténation d'IP et de port via :, par exemple: 127.0.0.1:8080.

Vous avez donc décidé de créer une application client-serveur en utilisant Socket. Il n'y a rien de trop compliqué. Voici une brève explication sur la connexion entre client et server:

  1. Tout d'abord, clarifions ce fait, que nos client ont leur propre Socket et connaissent server l'adresse IP et le port. Pour server, seuls ServerSocket et un port sont fournis. Dans les deux cas, le port est le même numéro entre 0 et 65535.
  2. Nous avons donc décidé de connecter notre client à notre server:

    • client crée son objet Socket clientSocket Avec l'IP et le port connus de notre server.

    • server a reçu une demande de connexion entrante avec sa méthode ServerSocket.accept(), qui génère un nouvel objet Socket newClientSocket (Toujours du côté server (!)).

    • D'autres échanges de données passent par des objets clientSocket et newClientSocket (pas entre clientSocket et ServerSocket).

Ici est une image presque parfaite pour comprendre le processus de connexion de base (gardez à l'esprit que cet objet Socket sur Client sur cette image - mêmes objets).

Après avoir créé cette structure simple, vous devez ouvrir deux flux des deux côtés Client.clientSocket Et Server.newClientSocket Pour lire et écrire des informations.

7
SuppieRK

ServerSocket est créé pour bind vers un port et listen pour un connect depuis un client. Ainsi, un serveur attend simplement une conversation et n'en démarre pas.

ClientSocket est créé sur connect sur un serveur listening. Le client établit la connexion.

Exemple: Considérez un centre d'appels entrants comme un exemple. Ces services sont des serveurs. Ils n'initient pas d'appel mais attendent qu'un appel arrive des clients. Une fois les appels entrés, ils peuvent engager une conversation bidirectionnelle.

1
pgcool

ServerSocket est à nouveau un socket avec des fonctionnalités supplémentaires du point de terminaison du serveur. Les fonctionnalités du serveur incluent l'écoute du port et l'acceptation d'une connexion entrante etc ...

1
ArunDhaJ
1
Carnell

Socket est pour le côté client et ServerSocket est pour le côté serveur.

0
Sunil Kumar Sahoo

Parce qu'il lit ce qui vous a été envoyé par le serveur.

0
Noon Silk