Les modèles d'application réseau comprennent principalement :
www (World Wide Web) est un système de navigation d'informations basé sur le modèle client/serveur, basé sur le langage HTML et le protocole HTTP, et peut fournir divers services Internet. Les informations réseau sont placées à différents endroits sur l'hôte et le serveur www utilise des liens hypertextes pour relier diverses informations. Le client www (navigateur) se charge d'établir le contact avec le serveur, d'envoyer des requêtes au serveur, de traiter l'hypermédia HTML, de fournir une interface utilisateur graphique (GUI), d'afficher des informations, etc.
En mode de fonctionnement client/serveur, côté serveur, soyez prêt à accepter les communications de plusieurs ordinateurs clients. À cette fin, en plus d'utiliser des adresses IP pour identifier les ordinateurs sur Internet, des numéros de port sont également introduits pour identifier les threads qui servent des services en arrière-plan côté serveur. La combinaison du numéro de port et de l’adresse IP est appelée une prise réseau.
Dans l'implémentation du mode C/S en langage Java, les sockets sont divisées en deux catégories :
La machine Serveur fournit des services à la machine Client via des ports (adresses d'E/S de bus) ; la machine Serveur fournit plusieurs services différents en même temps sur ses différents ports. Le client accède à un certain port du serveur et demande au serveur de le servir via ce port. Réglementations : les numéros de port 0 à 1023 sont réservés à un usage exclusif du système. Par exemple, le protocole HTTP est sur le port 80 et le protocole telnet est sur le port 23. Les ports 1024~65535 sont utilisés par les applications.
Lorsque le programme client et le programme serveur doivent communiquer, la classe Socket peut être utilisée pour établir une connexion socket. Considérez une connexion socket comme un appel téléphonique : initialement, le programme client établit l'appel et le programme serveur écoute une fois l'appel terminé, chaque partie peut parler à tout moment ;
Il existe deux manières facultatives d'établir la communication entre les deux parties : le socket de streaming et le socket de datagramme :
Le socket de streaming établit un canal de communication entre le programme client et le programme serveur. Chaque socket peut effectuer des opérations de lecture et d'écriture. À chaque extrémité, le processus de session de communication avec l’autre partie est :
Établissez une connexion de socket, obtenez des flux d'entrée/sortie, lisez/écrivez des données et fermez le socket (démolissez la connexion) une fois la communication terminée.
À l'aide du constructeur de socket, un objet socket peut être établi côté client sur le serveur :
Socket (String host, int port) : host est l'adresse IP du serveur, port est le numéro de port, ceux-ci sont convenus à l'avance.
Par exemple, codez :
try{ Socket mySocket = new Socket("http://www.weixueyuan.net" ,1860 }catch(IOException e){}
Ensuite, utilisez la méthode getInputStream() pour obtenir le flux d'entrée, utilisez ce flux d'entrée pour lire les informations mises par le serveur dans la « ligne » ; utilisez la méthode getOutputStream() pour obtenir le flux de sortie, et utilisez ce flux de sortie pour écrire des informations sur la "ligne".
À l'aide du constructeur ServerSocket, vous pouvez créer un objet socket serveur sur le serveur qui accepte les sockets client :
ServerSocket(int port) : spécifiez le numéro de port et créez un objet ServerSocket. Le numéro de port doit être le même que le numéro de port appelé par le client. Pour ce faire, utilisez la forme de code suivante :
essayez{ ServerSocket serverSocket = new ServerSocket(1860); }catch(IOException e){}
Le programme côté serveur écoute sur le port spécifié. Lors de la réception d'une demande de service du programme client, il crée un objet socket pour communiquer avec le programme client correspondant au port. Par exemple, après avoir exécuté le code ci-dessus pour créer un objet socket serveur et avoir établi l'objet serverSocket, il peut utiliser la méthode accept() pour obtenir l'objet Socket et recevoir les informations du programme client depuis le socket mySocket. Comme indiqué dans le code suivant :
try{ Socket sc = serverSocket.accept();//ac est un objet Socket}catch(IOException e){}
Pour révoquer le service, vous pouvez fermer l'objet Socket sc :
sc.close();
[Exemple] Application client en mode C/S. Il s'agit d'un exemple simple de communication Socket en streaming côté client. Le code illustre comment écrire le programme côté client. Dans l'exemple, le programme client envoie une requête au port 4441 de l'hôte du serveur. Une fois la connexion établie, il termine la lecture et l'écriture sur le serveur.
importer java.io.*;importer java.net.*;public class Client{ public static void main(String args[]){ String s = null;Socket mySocket; in = null;DataOutputStream out = null; = new Socket("localhost",4441); in = new DataInputStream(mySocket.getInputStream()); DataOutputStream(mySocket.getOutputStream()); out.writeUTF("bon serveur !"); while(true){ s = in.readUTF(); if(s==null) else System.out.println(s); ); } mySocket.close(); }catch(IOException e){ System.out.println("impossible de se connecter"); } }}
[Exemple] Application côté serveur correspondant à l'application côté client. Le programme écoute sur le port 4441. Lorsqu'une requête client est détectée, une chaîne contenant "Client, bonjour, je suis le serveur" est générée et envoyée au client.
importer java.io.*;importer java.net.*;public class Server{ public static void main(String args[]){ ServerSocket server = null; Socket you = null;String s = null; in = null; try{ server = new ServerSocket(4441); }catch(IOException e1){ system.out.println("ERREUR :" +e1); } try{ you = server.accept(); in = new DataInputStream(you.getInputStream()); out = new DataOutputStream(you.getOutputStream()); ); if(s!=null) break; } out.writeUTF("Bonjour client, je suis le serveur"); e){System.out.println("ERREUR :"+e);} }}
Afin de tirer pleinement parti de la capacité de fonctionnement parallèle de l'ordinateur, le travail de connexion du socket peut être complété par un seul thread. Lorsque le client demande au serveur de fournir des services, ou lorsque le serveur reçoit une demande de service d'un client, il démarre un thread dédié à la communication d'informations, crée un flux d'entrée et de sortie dans ce thread et termine l'échange d'informations entre le client et le serveur.
[Exemple] Une applet client qui place le travail de connexion de socket sur un thread. L'interface comporte un bouton d'envoi de message, une zone de texte et une zone de texte. L'application client établit d'abord une connexion socket avec le serveur. Utilisez le flux d'entrée de données pour lire à plusieurs reprises les informations mises dans la ligne par le serveur et afficher les informations reçues dans la zone de texte. Si l'information récupérée est "End", la connexion socket est fermée et le programme se termine. L'utilisateur peut également saisir des informations dans la zone de texte et appuyer sur le bouton d'envoi d'informations. Le programme client utilisera le flux de sortie de données pour envoyer le contenu de la zone de texte au serveur.
importer java.net.*;importer java.io.*;importer java.awt.*;importer javax.swing.*;importer java.awt.event.*;importer java.applet.*;classe publique Le client étend les implémentations d'applet Runnable,ActionListener{ Bouton JButton ; JTextField textF ; JTextArea textA ; Fil de discussion ; DataOutputStream out ; public void init(){ setBackground(new Color(120,153,137)); setLayout(new BorderLayout()); new JButton("Envoyer des informations"); 20,30); setSize(450,350); JPanel p = nouveau JPanel(); p.add(textF); p.add(button); add(textA,"Center"); add(p,"South"); bouton.addActionListener(this); new Socket(this.getCodeBase().getHost(),4441); in = new DataInputStream(socket.getInputStream()); DataOutputStream(socket.getOutputStream()); }catch(IOException e){} if(thread==null){ thread = new Thread(this); public void run(){ String s = null; while(true){ try{ s = in.readUTF( }catch(IOException e){} if(s.equals("End")){ try{ socket.close();break; }catch(IOException e){} }else texA.append(s + "/n" } } public void actionPerformed( ActionEvent e){ if(e.getSource()==button){ String s = textF.getText(); if(s! = null){ try{ out.writeUTF(s); }catch(IOException e1){} } else{ try{ out.writeUTF("Veuillez parler" } catch(IOException e1){} } } }}
[Exemple] Le programme utilise le terminal 4441 pour établir une connexion socket avec le client. Une fois que le serveur a reçu la demande du client, il crée un thread avec le socket du client et le démarre. S'il n'y a aucune application client, continuez à surveiller les applications client. Le thread établit le flux de données d'entrée et le flux de données de sortie en fonction du socket du client. Le fil utilise pour lire les informations que le client met dans la ligne. Si l'information reçue est "Fin", le serveur répond "Fin" puis ferme la connexion socket ; sinon il répond : "Je suis le serveur que tu m'as dit", et l'information reçue par le serveur.
importer java.net.*;importer java.io.*;importer java.awt.*;importer javax.swing.*;importer java.awt.event.*;importer java.applet.*;classe publique Le client étend les implémentations d'applet Runnable,ActionListener{ Bouton JButton ; JTextField textF ; JTextArea textA ; Fil de discussion ; DataOutputStream out ; public void init(){ setBackground(new Color(120,153,137)); setLayout(new BorderLayout()); new JButton("Envoyer des informations"); 20,30); setSize(450,350); JPanel p = nouveau JPanel(); p.add(textF); p.add(button); add(textA,"Center"); add(p,"South"); bouton.addActionListener(this); new Socket(this.getCodeBase().getHost(),4441); in = new DataInputStream(socket.getInputStream()); DataOutputStream(socket.getOutputStream()); }catch(IOException e){} if(thread==null){ thread = new Thread(this); public void run(){ String s = null; while(true){ try{ s = in.readUTF( }catch(IOException e){} if(s.equals("End")){ try{ socket.close();break; }catch(IOException e){} }else texA.append(s + "/n" } } public void actionPerformed( ActionEvent e){ if(e.getSource()==button){ String s = textF.getText(); if(s! = null){ try{ out.writeUTF(s); }catch(IOException e1){} } else{ try{ out.writeUTF("Veuillez parler"); }catch(IOException e1){} } } }}