Pour les applications en temps réel ou les jeux en temps réel, le protocole HTTP ne peut souvent pas répondre à nos besoins. La prise est très pratique pour nous. Vous trouverez ci-dessous des notes pour cette étude. Il explique principalement les aspects du type d'exception, du principe d'interaction, du socket, de la berline SERVERS et du multithreading.
Type d'exception
Avant de comprendre le contenu de Socket, vous devez comprendre certains types d'exceptions impliqués. Les quatre types suivants sont tous hérités de IOException, donc de nombreuses iOException apparaissent directement après.
UnkownhostException: nom d'hôte ou erreur IP
ConnectException: le serveur refuse de se connecter, le serveur ne démarre pas (le nombre de files d'attente dépasse, la connexion est rejetée)
SockettimeoutException: délai de connexion
BindException: l'objet Socket ne peut pas être lié à l'adresse IP locale formulée ou à
Processus d'interaction
Je pense que l'image suivante a été expliquée en détail et clairement.
Douille
Constructeur
Socket () Socket (InetAddress Adresse, int port) lève UnknownHostException, ioExceptionSocket (INETADRESS ADRESS, INT PORT, INETADDRESS LOCALADDRESS, INT LOCALPORT) lance iOExceptionSocket (String Host, int port) Local Unknownhostexception, IOExceptionSetsocket)
À l'exception du premier sans paramètres, d'autres constructeurs essaieront d'établir une connexion au serveur. S'il échoue, une erreur IOException sera lancée. En cas de succès, l'objet Socket est renvoyé.
InetAddress est une classe utilisée pour enregistrer l'hôte. Son GethostByName statique (String MSG) peut renvoyer une instance, et sa méthode statique getLocalHost () peut également obtenir l'adresse IP de l'hôte actuel et renvoyer une instance. Les paramètres du constructeur Socket (String Host, int Port, InetAddress localAddress, int localport) sont l'IP cible, le port cible, l'IP local et le port local.
Méthode de socket
getinetAddress (); Adresse IP du serveur distant
getport (); Port du serveur distant
Adresse IP getLocalAddress () du client local
Port GetLocalport () Client local
getInputStream (); getInputStream ();
getOutStream (); Obtenir un flux de sortie
Il convient de noter que parmi ces méthodes, les plus importantes sont GetInputStream () et GetOutputStream ().
Statut de prise
isClosed (); // La connexion est-elle fermée? En cas de fermeture, retournez vrai; Sinon, retourne false
isConnect (); // retourne vrai si connecté; Sinon renvoie faux
isBound (); // Si le socket a été lié à un port local, retournez vrai; Sinon, retourne false
Si vous souhaitez confirmer si le statut du socket est en connexion, la déclaration suivante est un bon moyen de juger.
Boolean isConnection = socket.isconned () &&! socket.isclosed (); // juger s'il est actuellement en relation
Douille semi-fermée
Plusieurs fois, nous ne savons pas combien de temps il faut pour terminer dans le flux d'entrée obtenu. Voici quelques méthodes courantes:
Serversocket
Constructeur
Serversocket () lève ioExceptionSerVersocket (int port) lance ioExceptionSerVersock
Note:
1. Le port à écouter par le serveur de port; la longueur de file d'attente de la demande de connexion client du backlog; Le serveur BindAdaddr lie l'IP
2. Si le port est occupé ou n'a pas l'autorisation d'utiliser certains ports, une erreur BindException sera lancée. Par exemple, les ports de 1 à 1023 exigent qu'un administrateur ait une liaison d'autorisation.
3. Si le port est réglé sur 0, le système lui attribuera automatiquement un port;
4. BindAdddr est utilisé pour lier l'IP du serveur. Pourquoi y a-t-il un tel paramètre? Par exemple, certaines machines ont plusieurs cartes réseau.
5. Une fois que le SERVERSOCKET est lié au port d'écoute, il ne peut pas être modifié. SERVERSocket () peut définir d'autres paramètres avant de lier le port.
Exemple de berne de serveurs unique
public void Service () {while (true) {socket socket = null; try {socket = serversocket.accept (); // prenez une connexion à partir de la file d'attente de connexion, sinon, attendez System.out.println ("Adresse:" + socket.getinetAddress () + ":" + socket.getport ()); ... // recevoir et envoyer des données} catch (ioException e) {e.printStackTrace ();} enfin {try {if (socket! = Null) socket.close (); // après communication avec un client, fermeture} catch (ioException e) {e.printStackTrace ();}}}}Multithread Serversocket
Inutile de dire que les avantages du multi-threading sont multiples et que la plupart des scénarios sont multi-threading. Qu'il s'agisse de nos jeux en temps réel ou de notre IM, les besoins multiples-pas sont nécessaires. Parlons de la méthode de mise en œuvre ci-dessous:
Les méthodes qui implémentent le multi-threading héritent de la classe de threads ou implémentent l'interface Runnable. Bien sûr, les pools de threads peuvent également être utilisés, mais l'essence de la mise en œuvre est similaire.
Voici un exemple:
Le code suivant est le thread principal du serveur. Attribuez un thread de travailleur à chaque client:
public void Service () {while (true) {socket socket = null; essayez {socket = serversocket.accept (); // Le thread principal obtient le thread de connexion client workthread = nouveau thread (nouveau gestionnaire (socket)); // Créer du thread workthread.start (); // Démarrer le thread} catch (exception e) {e.printStackTrace (); }}}Bien sûr, l'accent est mis ici sur la façon de mettre en œuvre la classe de gestionnaire. Le gestionnaire doit implémenter l'interface Runnable:
Le gestionnaire de classe implémente Runnable {private socket socket; Public Handler (socket socket) {this.socket = socket; } public void run () {try {System.out.println ("Nouvelle connexion:" + socket.getinetAddress () + ":" + socket.getport ()); Thread.Sleep (10000); } catch (exception e) {e.printStackTrace ();} enfin {try {System.out.println ("Fermez la connexion:" + socket.getinetAddress () + ":" + socket.getport ()); if (socket! = null) socket.close (); } catch (ioException e) {e.printStackTrace (); }}}} Bien sûr, il existe d'autres moyens de multi-thread d'abord, tels que des pools de fil ou des pools de fil qui sont intégrés à JVM. Je ne l'expliquerai pas ici.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.