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?
(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 .
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.
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.
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
.
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?
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.
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
:
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.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.
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 listen
ing. 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.
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 ...
Jetez un œil à http://Java.Sun.com/docs/books/tutorial/networking/sockets/
Socket
est pour le côté client et ServerSocket
est pour le côté serveur.
Parce qu'il lit ce qui vous a été envoyé par le serveur.