Javase Advanced Network Programming

Vers le Haut 2022-01-15 02:50:07 阅读数:226

javase advanced network programming

JavaSESenior Programmation réseau

Objectifs pédagogiques

  • Capable de distinguerUDPEtTCPCaractéristiques du Protocole

    • UDP Pas de connexion,Basé sur des paquets,Envoie - le et laisse tomber,Bonne performance,Perte possible de données.
    • TCPConnecté,Sur la base des canaux de communication,Transmission fiable.
  • Capable de direTCPDeux noms de classe communs en vertu du Protocole

    • ClientSocket
    • ServeurServerSocket
  • Capable d'écrireTCPProgramme de transfert de données de chaîne en vertu du Protocole

    • Voir Code!
  • Être capable de comprendreTCPCas de téléchargement de fichiers en vertu de l'accord

    • Voir Code!
  • Être capable de comprendreTCPEn vertu de l'AccordBSCAS

    • Voir Code!
  • Capable de direNIOLes avantages de.

    • BIO:Communication synchrone bloquée,Le thread doit être couplé au client,Il n'y a pas de données à mourir!Plus la concurrence est élevée,Plus vite on meurt!!

    • NIO:Synchronisation non bloquante:Il suffit de démarrer un thread pour recevoir d'innombrables clients,Ouvrir un autre thread pour sonder tous les clients

      ​ Y a - t - il des données,Il y a des données pour ouvrir un thread pour le traiter.Idéal pour les connexions multiples mais courtes.

      ​ Bonne performance!!

Chapitre I Démarrage de la programmation réseau

1.1Structure logicielle

  • C/SStructure :Nom completClient/ServerStructure,Se réfère à la structure du client et du serveur.Les procédures courantes sontQQ、Xunlei et d'autres logiciels.

[Impossible de transférer l'image de la chaîne externe,Il peut y avoir un mécanisme antivol à la station source,Il est recommandé de sauvegarder l'image et de la télécharger directement(img-hwxJPAnM-1641480118454)(img/01_CSArchitecture.png)]

  • B/SStructure :Nom completBrowser/ServerStructure,Se réfère à la structure du navigateur et du serveur.Les navigateurs les plus courants sont google、Firefox, etc..

[Impossible de transférer l'image de la chaîne externe,Il peut y avoir un mécanisme antivol à la station source,Il est recommandé de sauvegarder l'image et de la télécharger directement(img-tTFREHtI-1641480118455)(img/02_BSArchitecture.png)]

Les deux architectures ont des avantages,Mais quelle que soit l'architecture,Sans le soutien du réseau.Programmation réseau,C'est un accord.,Programme de communication entre deux ordinateurs.

1.2 Protocole de communication réseau

  • **Protocole de communication réseau:**Les protocoles de communication sont des règles que les ordinateurs doivent respecter,Uniquement en respectant ces règles,Pour communiquer entre les ordinateurs.C'est comme si les voitures circulant sur la route devaient respecter les règles de circulation,Format de transmission des données dans le Protocole、Taux de transmission、, sont définies uniformément,Les deux parties à la communication doivent se conformer simultanément à,Achèvement de l'échange de données.

  • TCP/IPAccord: Protocole de contrôle de la transmission/Protocole d'interconnexion Internet( Transmission Control Protocol/Internet Protocol),- Oui.InternetBasic、Accord le plus large.Il définit comment un ordinateur se connecte à Internet,Et comment les données sont transmises entre elles.Il contient en interne une série de protocoles pour le traitement des communications de données,Et adopté4Modèle hiérarchique des couches,Chaque couche appelle le Protocole fourni par la couche suivante pour répondre à ses besoins.

[Impossible de transférer l'image de la chaîne externe,Il peut y avoir un mécanisme antivol à la station source,Il est recommandé de sauvegarder l'image et de la télécharger directement(img-PZn2rL2l-1641480118456)(img/03_Protocole de communication.png)]

Couche d'application:

HTTP: Protocole de transfert hypertexte, Transfert de page web

FTP:Transfert de fichiers

SMTP: Transfert de courrier de base

Couche de transmission:

**TCP:**Protocole de contrôle de la transmission (Transmission Control Protocol) Protocole de transfert de données sécurisé orienté connexion

UDP:Protocole de datagramme utilisateur(User Datagram Protocol) Protocole de transfert de données non sécurisé sans connexion

**Couche réseau:**Obtenez cette machineIP, Et l'autre machine IPEt le numéro de port

**Couche de liaison de données:**Au niveau du matériel

1.3 Classification du Protocole

Le Protocole de communication est encore plus complexe,java.net Classes et interfaces contenues dans le paquet,Ils fournissent des détails de communication de bas niveau.Nous pouvons utiliser ces classes et interfaces directement,Pour se concentrer sur le développement de programmes web,Sans tenir compte des détails de la communication.

java.net Deux protocoles réseau communs sont pris en charge dans le paquet:

  • TCP:Protocole de contrôle de la transmission (Transmission Control Protocol).TCPL'accord estFace à la connexionProtocole de communication pour,C'est - à - dire avant le transfert des données,Établir une connexion logique entre l'émetteur et le récepteur,Et puis transmettre les données,Il assure un transfert de données fiable et sans erreur entre deux ordinateurs.
    • Trois poignées de main:TCPDans l'Accord,Au stade de la préparation de l'envoi des données,Trois interactions client - serveur,Pour assurer une connexion fiable.
      • Première poignée de main,Le client envoie une demande de connexion au serveur,Attendez la confirmation du serveur. Serveur, vous êtes mort? ?
      • Deuxième poignée de main,Le serveur renvoie une réponse au client,Aviser le client qu'une demande de connexion a été reçue. Je vis !!
      • Troisième poignée de main,Le client envoie à nouveau un accusé de réception au serveur,Confirmer la connexion.L'ensemble du processus d'interaction est illustré ci - dessous.Je le vois.!!

[Impossible de transférer l'image de la chaîne externe,Il peut y avoir un mécanisme antivol à la station source,Il est recommandé de sauvegarder l'image et de la télécharger directement(img-HQOJxtqu-1641480118457)(img/04_TCPProtocole trois poignées de main.png)]

​ Trois poignées de main complètes,Après connexion,Le client et le serveur sont prêts pour le transfert de données.En raison de cette caractéristique orientée connexion,TCPLe Protocole garantit la sécurité de la transmission des données,Il est donc très largement utilisé,Par exemple, télécharger un fichier、Parcourir les pages Web, etc..

  • UDP:Protocole de datagramme utilisateur(User Datagram Protocol).UDPL'accord est unFace sans connexionAccord.Lors du transfert de données,Aucune connexion n'est nécessaire,Que le Service de contrepartie soit lancé ou non,Mettre les données directement、La source et la destination des données sont encapsulées dans un paquet,Envoyer directement.La taille de chaque paquet est limitée à64kÀ l'intérieur.C'est un protocole peu fiable.,Parce qu'il n'y a pas de connexion,Donc la transmission est rapide,Mais il est facile de perdre des données.En application quotidienne,Par exemple, vidéoconférence、QQChat, etc..

TCPEtUDPLa différence entre

1.TCP:Protocole de contrôle de la transmission (Transmission Control Protocol) Protocole de transfert de données sécurisé orienté connexion

UDP:Protocole de datagramme utilisateur(User Datagram Protocol) Protocole de transfert de données non sécurisé sans connexion

2.TCPLe Protocole garantit la sécurité de la transmission des données, Vitesse de transmission relativement faible

UDP Protocole c'est un protocole non fiable ,Parce qu'il n'y a pas de connexion,Donc la transmission est rapide,Mais il est facile de perdre des données.

3.TCPUtiliser le scénario:Téléchargement de fichiers、Télécharger、 Messagerie, etc.

UDPUtiliser le scénario:Chat vocal、Chat vidéo, etc

1.4 Trois éléments de la programmation réseau

Accord

  • **Accord:**Règles à respecter pour la communication sur les réseaux informatiques,C'est déjà fait.,Plus de détails..

IPAdresse

  • IPAdresse:Adresse du Protocole Internet(Internet Protocol Address),Communément appeléIP.IPL'adresse est utilisée pour numéroter de façon unique les appareils informatiques d'un réseau.Si on mettait“PC”Comparer“Un téléphone”Et si,Alors“IPAdresse”C'est l'équivalent“Numéro de téléphone”.

**IPClassification des adresses ** [][][][] o o o o

  • IPv4:C'est un32Nombre binaire de bits(2^32),Généralement divisé en4Octets,Exprimé ena.b.c.d Forme,Par exemple192.168.65.100 .Parmi euxa、b、c、dTous.0~255Un entier décimal entre,Donc, au mieux, cela signifie42100 millions(4,294,967,296).

    La classification des réseaux prend de nombreuses formes , Les réseaux peuvent être classés en trois catégories en fonction de leur couverture géographique. ,Réseau local、Réseau métropolitain、Réseau étendu.

    Réseau local: Réseau local(LAN) Un réseau informatique constitué de plusieurs ordinateurs interconnectés dans une zone , Il couvre des centaines à des milliers de mètres . Un réseau local est souvent utilisé pour connecter des ordinateurs personnels dans les bureaux ou les usines d'une entreprise. , Pour partager les ressources ( Par exemple, le partage des ressources de l'imprimante ) Et l'échange d'informations . Généralement utilisé pour l'usage interne de l'entreprise .

    Réseau métropolitain: Réseau métropolitain(MAN), C'est un grand réseau local , Adopter une technologie similaire à celle du réseau local . La couverture du réseau métropolitain est légèrement plus étendue que celle du réseau local , Peut atteindre des dizaines de kilomètres , Son taux de transmission est également plus élevé que celui du réseau local . .Généralement utilisé entre les villes .

    Réseau étendu(Réseau public): Réseau étendu(WAN) Aussi appelé Réseau distant , C'est un vaste réseau géographique , Il relie des réseaux locaux ou des systèmes informatiques répartis dans différentes régions , Atteindre l'objectif du partage des ressources . Les réseaux étendus couvrent généralement des dizaines de milliers de kilomètres , En général, il est établi et entretenu par la société de communication .Par exemple, Les réseaux établis entre les pays sont des réseaux étendus . Généralement accessible n'importe où dans le monde .

  • IPv6:Grâce à l'essor d'Internet,IPLa demande d'adresses augmente,Mais les ressources d'adresse réseau sont limitées,De faireIPLa distribution est de plus en plus tendue.Il y a des données.,GlobalIPv4L'adresse est2011Année2Allocation mensuelle terminée.

    Pour agrandir l'espace d'adresse,À adopterIPv6Redéfinir l'espace d'adresse,Adoption128Longueur de l'adresse du BIT,Chaque16Groupe d'octets,Diviser en8Nombre hexadécimal de groupes,Exprimé enABCD:EF01:2345:6789:ABCD:EF01:2345:6789,.On dit qu'on peut créer une URL pour chaque grain de sable dans le monde,Cela résout le problème de l'insuffisance des ressources d'adresses réseau.

Commandes courantes

  • Voir la machineIPAdresse,Entrée dans la console:
ipconfig
  • Vérifier la connectivité du réseau,Entrée dans la console:
ping Espaces IPAdresse
ping 220.181.57.216 //IP
ping www.baidu.com //Nom de domaine

SpécialIPAdresse

  • LocalIPAdresse:127.0.0.1localhost . Non affecté par l'environnement , Ces deux - là existent à tout moment IP, Vous pouvez aller directement à la machine .

Numéro de port

Communication réseau,Essentiellement deux processus(Application)Communication de.Chaque ordinateur a beaucoup de processus,Alors, pendant la communication réseau,,Comment distinguer ces processus?

Si c'est le cas,IPAdressePeut identifier de façon unique les appareils du réseau,AlorsNuméro de portPour identifier de façon unique le processus dans l'appareil(Application)C'est.

  • **Numéro de port:Entier en deux octets,Sa plage de valeurs est065535**.Parmi eux,01023Les numéros de port entre sont utilisés pour un certain nombre de services et d'applications réseau bien connus,Les applications ordinaires nécessitent l'utilisation de1024Le numéro de port ci - dessus.Si le numéro de port est utilisé par un autre service ou une autre application,Les étapes de transmission, etc.

UtilisationAccord+IPAdresse+Numéro de port Combinaison ternaire,Pour identifier les processus dans le réseau,.La communication entre les processus peut alors utiliser cette identité pour interagir avec d'autres processus.

1.5 InetAddressCatégorie

1.5.1 Généralités

Un objet de cette classe représente un IPObjet d'adresse.

1.5.2 InetAddress Méthode d'adhésion à la classe

// Obtenir un hôte local IPObjet d'adresse
static InetAddress getLocalHost()
//SelonIP La chaîne d'adresse ou le nom d'hôte obtient la correspondance IPObjet d'adresse
static InetAddress getByName(String host)
//Obtenir le nom d'hôte 
String getHostName()
//ObtenirIPChaîne d'adresse
String getHostAddress()

1.5.3 CAS

public class InetAddressDemo01 {

public static void main(String[] args) throws Exception {

// Obtenir un hôte local IPObjet d'adresse
InetAddress inet01 = InetAddress.getLocalHost();
// ztsdeMacBook-Pro.local/192.168.3.20
// Nom d'hôte/ipChaîne d'adresse
System.out.println(inet01);
// SelonIP La chaîne d'adresse ou le nom d'hôte obtient la correspondance IPObjet d'adresse
// InetAddress inet02 = InetAddress.getByName("192.168.3.20");
InetAddress inet02 = InetAddress.getByName("baidu.com");
System.out.println(inet02);
// Obtenir le nom d'hôte
String hostName = inet01.getHostName();
System.out.println(hostName);
// ObtenirIPChaîne d'adresse
String hostAddress = inet01.getHostAddress();
System.out.println(hostName);
System.out.println(hostAddress);
}
}

Chapitre II UDPProcédures de communication

2.1 UDPAperçu du Protocole

​ UDPEst un Protocole de communication sans connexion,C'est - à - dire au moment de la transmission des données,Aucune connexion logique n'est établie entre l'expéditeur et le destinataire des données.En termes simples,.Quand un ordinateur envoie des données à un autre,L'expéditeur ne confirme pas l'existence du récepteur,Les données seront envoyées,De même, au moment de la réception des données,Il n'y a pas non plus de rétroaction à l'expéditeur quant à la réception des données.

En raison de l'utilisationUDPLe Protocole consomme peu de ressources,Communication efficace,Donc C'est souvent utilisé pour l'audio、La transmission de données vidéo et de données ordinaires, telles que les vidéoconférences, est utiliséeUDPAccord,Parce que dans ce cas, même si un ou deux paquets sont perdus occasionnellement,Et n'aura pas beaucoup d'impact sur les résultats de réception.

​ Mais en utilisantUDPLorsque le Protocole transmet des données,Parce queUDPNon - connectivité orientée vers,L'intégrité des données n'est pas garantie,Il n'est donc pas recommandé d'utiliserUDPAccord.

​ UDP Le processus de communication est illustré ci - dessous :

[Impossible de transférer l'image de la chaîne externe,Il peut y avoir un mécanisme antivol à la station source,Il est recommandé de sauvegarder l'image et de la télécharger directement(img-WfX0m8xs-1641480118457)(img/05_UDPProcessus de communication.png)]

UDPCaractéristiques du Protocole
* Pour les protocoles sans connexion
* L'expéditeur n'envoie que , Ne pas confirmer si l'autre partie peut recevoir .
* Transfert de données par paquets .
* Limite de taille des données envoyées 64KÀ l'intérieur
* Parce que face à aucune connexion ,Vite!,Mais pas fiable..
UDPScénarios d'utilisation du Protocole
* Messagerie instantanée
* Vidéo en ligne
* Voix sur Internet
UDP Deux catégories liées au Protocole
* DatagramPacket
* Objet du paquet
* Action: Pour encapsuler les données à envoyer ou à recevoir ,Par exemple,:Conteneur
* DatagramSocket
* Envoyer l'objet
* Action: Pour envoyer ou recevoir des paquets ,Par exemple,:Quai
DatagramPacketMéthode de construction de classe
* DatagramPacket(byte[] buf, int length, InetAddress address, int port)
* Créer un objet de paquet d'envoi
* buf:Contenu à envoyer,Tableau d'octets
* length: Longueur du contenu à envoyer ,En octets
* address:RécepteurIPObjet d'adresse
* port:Numéro de port du récepteur
* DatagramPacket(byte[] buf, int length)
* Créer un objet paquet pour le récepteur
* buf: Utilisé pour stocker le contenu reçu
* length:Longueur capable de recevoir du contenu
DatagramPacketMéthode commune de classe
* int getLength() Obtient le nombre réel d'octets reçus
DatagramSocketMéthode de construction de classe
* DatagramSocket() Créer unSocketObjet, Le système attribuera au hasard un numéro de port .
* DatagramSocket(int port) Créer un récepteurSocket Objet et numéro de port spécifié
DatagramSocket Méthode d'adhésion à la classe
* void send(DatagramPacket dp) Envoyer des paquets
* void receive(DatagramPacket p) Recevoir des paquets

2.2 UDPCas de communication

  • Besoins: Un programme de l'ordinateur de l'enseignant envoie des données , Un programme reçoit des données , Utilisation de l'enseignant natif ip.

2.2.1 UDP Mise en œuvre du Code de fin d'envoi

// UDP Mise en œuvre du Code de fin d'envoi 
public class UDPSender {

public static void main(String[] args)throws Exception{

// Définir une chaîne:Contenu à envoyer
String message = "- Oui.";
// Chaîne à octet Array
byte[] buf = message.getBytes();
// Créer un objet paquet
DatagramPacket dp = new DatagramPacket(buf,buf.length,
InetAddress.getLocalHost(),6666);
// Créer un objet d'envoi pour l'expéditeur 
DatagramSocket ds = new DatagramSocket(8888);
// Envoyer des paquets
ds.send(dp);
// Désactiver le numéro de port de sortie de l'objet d'envoi 
ds.close();
}
}

2.2.2 UDP Mise en œuvre du Code du récepteur

/** UDP Implémentation du Code terminal de réception du Protocole */
public class UDPReceive {

public static void main(String[] args)throws Exception{

// Créer un objet de réceptionDatagramSocket
DatagramSocket ds = new DatagramSocket(6666);
// Créer un tableau d'octets pour stocker le contenu reçu 
byte[] buf = new byte[1024];
// Créer un objet paquet
DatagramPacket dp = new DatagramPacket(buf,buf.length);
// Recevoir des paquets
ds.receive(dp);
// Obtient le nombre réel d'octets reçus 
int len = dp.getLength();
System.out.println("len = " + len);
// Convertir le contenu d'un tableau d'octets en sortie de chaîne 
System.out.println(new String(buf,0,len));
// Obtenir l'expéditeur ipAdresse
String sendIp = dp.getAddress().getHostAddress();
// Obtenir le numéro de port de l'expéditeur 
int port = dp.getPort();
System.out.println(sendIp);
System.out.println(port);
// FermerSocketObjet
ds.close();
}
}

Chapitre III TCPProcédures de communication

3.1 TCPAperçu du Protocole

  • TCPLe Protocole est un Protocole de communication orienté connexion, C'est - à - dire qu'une connexion logique est établie entre le client et le serveur avant le transfert des données. ,Et puis transmettre les données.Il assure un transfert de données fiable et sans erreur entre deux ordinateurs.
  • TCP Le processus de communication est illustré ci - dessous :

[Impossible de transférer l'image de la chaîne externe,Il peut y avoir un mécanisme antivol à la station source,Il est recommandé de sauvegarder l'image et de la télécharger directement(img-GSaR6TSI-1641480118460)(img/06_TCPProcessus de communication.png)]

TCP ==> Transfer Control Protocol ==> Protocole de contrôle de la transmission
TCPCaractéristiques du Protocole
* Protocole orienté connexion
* Les données ne peuvent être envoyées activement au serveur que par le client , Une fois que le serveur a reçu les données , Peut répondre aux données du client .
* Connexion par trois poignées de main, Connexion réussie pour former un canal de transmission de données .
* Déconnecter par quatre vagues
* Basé surIO Flux de données
* Il n'y a pas de limite à la taille des données transférées
* Parce que le Protocole orienté connexion ,Lent., Mais c'est un protocole fiable .
TCPScénarios d'utilisation du Protocole
* Téléchargement et téléchargement de fichiers
* Envoi et réception du courrier
* Connexion à distance
TCP Classes liées au Protocole
* Socket
* Un objet de cette classe représente un programme client .
* ServerSocket
* Un objet de cette classe représente un programme côté serveur .
SocketMéthode de construction de classe
* Socket(String host, int port)
* Selonip Chaîne d'adresse et numéro de port créer un client SocketObjet
* Notes: Il suffit d'exécuter la méthode , Le programme serveur spécifié est immédiatement connecté ,Si la connexion échoue,Une exception est lancée.
Si la connexion est réussie, Trois poignées de main .
SocketMéthode commune de classe
* OutputStream getOutputStream(); Obtenir l'objet de flux de sortie Byte
* InputStream getInputStream(); Obtenir l'objet Byte Input Stream

3.2 TCPCas de communication

3.2.1 Le client envoie des données au serveur

/* TCP Étapes de mise en oeuvre du code client * Créer un clientSocket Objet et spécifiez l'adresse du serveur et le numéro de port * AppelezSocketObjetgetOutputStream Méthode pour obtenir l'objet Byte output stream * Appeler l'objet de flux de sortie Byte write Méthode de sortie des données vers le serveur * AppelezSocketObjetgetInputStream Méthode pour obtenir l'objet Byte Input Stream * Appeler l'objet Byte Input Streamread Méthode de lecture des données retournées du côté serveur * FermerSocket Objet déconnecté . */
// TCPMise en œuvre du code client
public class TCPClient {

public static void main(String[] args) throws Exception{

// Contenu à envoyer
String content = "BonjourTCPCôté serveur,- Oui.";
// CréationSocketObjet
Socket socket = new Socket("192.168.73.99",9999);
// System.out.println(socket);
// Obtenir l'objet de flux de sortie Byte
OutputStream out = socket.getOutputStream();
// Exporter les données vers le serveur 
out.write(content.getBytes());
// Obtenir l'objet Byte Input Stream 
InputStream in = socket.getInputStream();
// Créer un tableau d'octets: Pour stocker les données lues sur le serveur 
byte[] buf = new byte[1024];
// Lire les données retournées du côté serveur
int len = in.read(buf);
System.out.println("len = " + len);
System.out.println(".Contenu retourné du côté serveur = " + new String(buf,0,len));
// FermersocketObjet
socket.close();
}
}

3.2.2 Le serveur écrit les données au client

/** TCP Mise en œuvre du Code côté serveur ServerSocketMéthode de construction de classe * ServerSocket(int port) Activer le serveur en fonction du numéro de port spécifié . ServerSocketMéthode commune de classe * Socket accept() Attendre que le client se connecte et obtenir le SocketObjet TCP Étapes de mise en oeuvre du Code côté serveur * CréationServerSocket Objet et numéro de port spécifié ( C'est l'équivalent d'un serveur allumé ) * AppelezServerSocketObjetaccept Méthode attendre que le client se connecte et obtenir la correspondance SocketObjet * AppelezSocketObjetgetInputStream Méthode pour obtenir l'objet Byte Input Stream * Appeler l'objet Byte Input Streamread Méthode de lecture des données envoyées par le client * AppelezSocketObjetgetOutputStream Méthode pour obtenir l'objet Byte output stream * Appeler l'objet de flux de sortie Byte write Méthode de sortie des données vers le client * FermerSocketEtServerSocketObjet */
public class TCPServer {

public static void main(String[] args)throws Exception{

// Créer un serveurocketObjet
ServerSocket serverSocket = new ServerSocket(9999);
// Attendre que le client se connecte et obtenir le SocketObjet
Socket socket = serverSocket.accept();
// Obtenir l'objet Byte Input Stream 
InputStream in = socket.getInputStream();
// Créer un tableau d'octets: Utilisé pour stocker les données lues au client 
byte[] buf = new byte[1024];
// Lire les données envoyées par le client 
int len = in.read(buf);
System.out.println("len = " + len);
System.out.println("Données envoyées par le client = " + new String(buf,0,len));
// Obtenir l'objet de flux de sortie Byte
OutputStream out = socket.getOutputStream();
// Sortie des données vers le client 
out.write(" Rendez - vous avec votre sœur. ".getBytes());
// Fermersocket
socket.close();
// Désactiver le serveur(Dans le développement réel, Les serveurs ne s'éteignent généralement pas )
serverSocket.close();
}
}

Chapitre IV Dossier complet

4.1 Cas de téléchargement de fichiers

Diagramme d'analyse de téléchargement de fichiers

  1. 【Client】Flux d'entrée,Lire les données du fichier du disque dur dans le programme.

  2. 【Client】Flux de sortie,Écrivez les données du fichier au serveur.

  3. 【Serveur】Flux d'entrée,Lire les données du fichier au serveur.

  4. 【Serveur】Flux de sortie,Écrire les données du fichier sur le disque dur du serveur.

  5. 【Serveur】Obtenir le flux de sortie,Mettre à jour les données.

  6. 【Client】Obtenir le flux d'entrée,Analyser les données de mise à jour.

[Impossible de transférer l'image de la chaîne externe,Il peut y avoir un mécanisme antivol à la station source,Il est recommandé de sauvegarder l'image et de la télécharger directement(img-W30i9ehQ-1641480118461)(img/07_Diagramme de téléchargement de fichiers.png)]

Réalisation du cas

Implémentation côté serveur:

public class FileUpload_Server {

public static void main(String[] args) throws IOException {

System.out.println("Serveur Démarrage..... ");
// 1. Créer un serveurServerSocket
ServerSocket serverSocket = new ServerSocket(6666);
// 2. Réception circulaire,Établir une connexion
while (true) {

Socket accept = serverSocket.accept();
/* 3. socketObjet à traiter par sous - thread,Lire et écrire RunnableDans l'interface,Un seulrunMéthodes,UtiliserlambdaFormatage simplifié des expressions */
new Thread(() -> {

try (
//3.1 Obtenir l'objet de flux d'entrée
BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
//3.2 Créer un objet de flux de sortie, Enregistrer localement .
FileOutputStream fis = new FileOutputStream(System.currentTimeMillis() + ".jpg");
BufferedOutputStream bos = new BufferedOutputStream(fis);
) {

// 3.3 Lire et écrire des données
byte[] b = new byte[1024 * 8];
int len;
while ((len = bis.read(b)) != -1) {

bos.write(b, 0, len);
}
// 4.=======Mise à jour du message===========================
System.out.println("back ........");
OutputStream out = accept.getOutputStream();
out.write("Téléchargement réussi".getBytes());
out.close();
//================================
//5. Fermer Ressources
bos.close();
bis.close();
accept.close();
System.out.println("Téléchargement de fichiers enregistré");
} catch (IOException e) {

e.printStackTrace();
}
}).start();
}
}
}

Mise en œuvre du client:

public class FileUpload_Client {

public static void main(String[] args) throws IOException {

// 1.Créer un objet de flux
// 1.1 Créer un flux d'entrée,Lire le fichier local
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("test.jpg"));
// 1.2 Créer un flux de sortie,Écrire au serveur
Socket socket = new Socket("localhost", 6666);
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
//2.Écrivez les données.
byte[] b = new byte[1024 * 8];
int len ;
while (( len = bis.read(b))!=-1) {

bos.write(b, 0, len);
}
// Fermer le flux de sortie,Aviser le serveur,Écrivez les données.
socket.shutdownOutput();
System.out.println("Envoi du fichier terminé");
// 3. =====Analyser la mise à jour============
InputStream in = socket.getInputStream();
byte[] back = new byte[20];
in.read(back);
System.out.println(new String(back));
in.close();
// ============================
// 4.Libérer des ressources
socket.close();
bis.close();
}
}

4.2 SimulationB\SServeur

Serveur de site d'émulation,Utilisez votre navigateur pour accéder à vos propres serveurs écrits,Voir les effets de la page Web.

Analyse de cas

  1. Préparation des données de la page,webDossiers.
  2. Nous simulons le côté serveur,ServerSocketPort d'écoute de classe,Accès par navigateur,Voir les effets de la page Web

Réalisation du cas

Le principe de fonctionnement du navigateur est que la rencontre d'une image ouvre un thread pour un accès séparé,Par conséquent, la technologie de filetage est ajoutée du côté du serveur.

public class ServerDemo {

public static void main(String[] args) throws IOException {

ServerSocket server = new ServerSocket(8888);
while(true){

Socket socket = server.accept();
new Thread(new Web(socket)).start();
}
}
}
class Web implements Runnable{

private Socket socket;
public Web(Socket socket){

this.socket=socket;
}
public void run() {

try{

//Flux de conversion,Lire la première ligne de la requête du navigateur
BufferedReader readWb = new
BufferedReader(new InputStreamReader(socket.getInputStream()));
String requst = readWb.readLine();
//Chemin vers la ressource demandée
String[] strArr = requst.split(" ");
System.out.println(Arrays.toString(strArr));
String path = strArr[1].substring(1);
System.out.println(path);
FileInputStream fis = new FileInputStream(path);
System.out.println(fis);
byte[] bytes= new byte[1024];
int len = 0 ;
//Vers le Navigateur Mettre à jour les données
OutputStream out = socket.getOutputStream();
out.write("HTTP/1.1 200 OK\r\n".getBytes());
out.write("Content-Type:text/html\r\n".getBytes());
out.write("\r\n".getBytes());
while((len = fis.read(bytes))!=-1){

out.write(bytes,0,len);
}
fis.close();
out.close();
readWb.close();
socket.close();
}catch(Exception ex){

}
}
}

Effets d'accès:

[Impossible de transférer l'image de la chaîne externe,Il peut y avoir un mécanisme antivol à la station source,Il est recommandé de sauvegarder l'image et de la télécharger directement(img-Rz4Z2oPz-1641480118465)(img/08_BS Diagramme de cas du serveur .png)]

Illustration:

[Impossible de transférer l'image de la chaîne externe,Il peut y avoir un mécanisme antivol à la station source,Il est recommandé de sauvegarder l'image et de la télécharger directement(img-0QiYUDBA-1641480118468)(img/09_BS Diagramme de communication .png)]

Chapitre V NIO

Pendant que nous étudionsJavaDeNIOAvant de couler, Nous devons tous comprendre quelques mots clés

  • SynchroniserAvecAsynchrone(synchronous/asynchronous):Synchroniser Est un mécanisme de fonctionnement fiable et ordonné , Quand on synchronise , La tâche suivante est d'attendre que l'appel courant revienne , Pour passer à l'étape suivante ;EtAsynchroneC'est le contraire., D'autres tâches n'ont pas besoin d'attendre que l'appel courant revienne , Dépend généralement des événements 、 Mécanismes tels que les rappels pour établir des relations séquentielles entre les tâches .
  • BlocageAvecNon - blocage:En coursBlocageFonctionnement, Le thread actuel sera bloqué ,Impossible d'accomplir d'autres tâches,Continuer seulement lorsque les conditions sont prêtes,Par exemple,ServerSocket Nouvelle connexion établie , Ou lecture des données 、 Écrire terminé ;EtNon - blocage Je m'en fous. IO L'opération est - elle terminée? ,Retour direct, L'opération correspondante se poursuit en arrière - plan

5.1 I/OModèle

Concept:I/OUne simple compréhension du modèle,C'est le type de canal utilisé pour envoyer et recevoir des données,Le rendement de la communication procédurale est largement déterminé.

5.1.1 JavaSoutien3Modèle de programmation réseau/IOMode

1)、Java BIO:Synchronisation et blocage(Type de blocage traditionnel),Le mode d'implémentation du serveur est une connexion à un thread,C'est - à - dire lorsque le client a une demande de connexion, Le serveur doit démarrer un thread pour le traitement ,Si cette connexion ne fait rien, elle entraînera des frais généraux inutiles

2)、Java NIO:Synchronisation non bloquante,Le mode d'implémentation du serveur traite plusieurs requêtes pour un seul thread(Connexion), C'est - à - dire que les demandes de connexion envoyées par le client sont enregistrées auprès du multiplexeur (SelectorSélecteur)Allez.,MultiplexeurVote Connecté à I/OLa demande est traitée.

3)、Java AIO(NIO.2):Asynchrone non bloquante,AIOIntroduction du concept de canaux asynchrones,AdoptéProactorMode,Programmation simplifiée,Demande valide pour démarrer le thread,Il est caractérisé par le fait que le système d'exploitation est terminé avant d'aviser le serveur de démarrer le thread pour le traitement,Généralement applicable aux applications avec un grand nombre de connexions et une longue durée de connexion.JDK1.7C'est arrivé, Pas encore largement utilisé .

5.1.2 Analyse de scénarios applicable

1)、BIO Les modalités s'appliquent: Un petit nombre de connexions et un schéma fixe,BIOCette approche exige beaucoup de ressources du serveur,La concurrence est limitée à l'application,JDK1.4La seule option avant,Bien queBIO La méthode n'est pas adaptée pour gérer une concurrence excessive et élevée ,Mais la procédure est simple et facile à comprendre.

2)、NIO Les modalités s'appliquent: Il y a beaucoup de connexions et les connexions sont courtes(Fonctionnement léger)Architecture de,Comme un serveur de chat、Système de rideaux、Communication entre serveurs, etc.La programmation est compliquée,JDK1.4Soutien initial.

3)、AIO Les modalités s'appliquent: Le nombre de connexions est élevé et la connexion est longue (Opérations répétées)Architecture de,Comme le serveur d'albums,Appel completOS(Système d'exploitation)Participer à des opérations simultanées.La programmation est compliquée,JDK1.7Soutien initial.

5.2 Java BIOGénéralités

5.2.1 Java BIOIntroduction générale

1)、Java BIO C'est traditionnel.java ioProgrammation,Ses classes et interfaces associées sontjava.ioSous le sac..

2)、BIO(Blocking I/O):Blocage synchrone,Le mode d'implémentation du serveur est une connexion à un thread, C'est - à - dire que lorsque le client a une demande de connexion, le serveur doit démarrer un thread pour le traitement ,Si cette connexion ne fait rien, elle entraînera des frais généraux inutiles,Peut passer Amélioration du mécanisme de mise en commun des fils , Ce mécanisme de pool de Threads est principalement utilisé pour implémenter des serveurs de connexion Multi - clients , Mais ça ne réduit pas le nombre de fils ,Même avec un pool de Threads, Il y aura encore beaucoup de tâches bloquées dans la file d'attente .

3)、BIO Les modalités s'appliquent: Un petit nombre de connexions et un schéma fixe,BIOCette approche exige beaucoup de ressources du serveur,La concurrence est limitée à l'application,JDK1.4La seule option avant,Bien queBIO La méthode n'est pas adaptée pour gérer une concurrence excessive et élevée ,Mais la procédure est simple et facile à comprendre.

5.2.2 Java BIOProcessus de programmation

1)、Démarrage côté serveurServerSocket

2)、Démarrage du clientSocketCommuniquer avec le serveur, Par défaut, le serveur doit établir un thread pour communiquer avec chaque client

3)、Après la demande du client,Vérifiez d'abord si le serveur a une réponse thread,Sinon, il attendra.,Ou refusé

4)、 Si le serveur répond ,Le thread client attendra la fin de la demande,Continuez.

5.2.3 Java BIOExemples d'application

Besoins:

1)、UtiliserBIOLe modèle écrit un côté serveur,Écouter6666Port,Lorsqu'il y a une connexion client, Démarrer un thread pour communiquer avec .

2)、Nécessite l'utilisation d'un mécanisme de pool de Threads pour améliorer,Plusieurs clients peuvent être connectés.

3)、Le serveur peut recevoir les données envoyées par le client(Peut également être utilisételnetComment, Vous n'avez pas besoin d'écrire un autre client )

//1.Qu'est - ce queTelnet?
PourTelnetReconnaissance,Différentes personnes ont des points de vue différents,Tu peux mettreTelnet Comme un Protocole de communication , Mais pour les intrus ,Telnet Juste un outil pour se connecter à distance . Une fois l'intrus établi avec l'hôte distant TelnetConnexion, Les intrus peuvent utiliser le logiciel sur l'hôte cible 、Ressources matérielles, La machine locale de l'intrus n'est qu'un terminal avec un clavier et un moniteur. .
TelnetL'accord estTCP/IPUn membre de la famille du Protocole,- Oui.InternetProtocole standard et principales méthodes de connexion à distance.Il permet à l'utilisateur d'effectuer le travail de l'hôte distant sur l'ordinateur local.Utilisation sur l'ordinateur de l'utilisateur finaltelnetProcédure,Connectez - vous au serveur avec.L'utilisateur final peuttelnetSaisissez les commandes dans le programme,Ces commandes fonctionnent sur le serveur,.C'est comme entrer directement sur la console du serveur.Peut contrôler le serveur localement.Pour commencertelnetSession,Vous devez saisir un nom d'utilisateur et un mot de passe pour vous connecter au serveur.TelnetEst la télécommande couramment utiliséeWebMéthode du serveur.
//2.Comment fairetelnet Les ordres?
1、Cliquez sur Démarrer → Exécution → EntréeCMD,Retour à la voiture.
2、 En sortant DOSDans l'interface,Entréetelnet Commande du port d'essai : telnet IP Port Ou telnet Nom de domaine Port,Retour à la voiture.
Si le port est fermé ou ne peut pas être connecté,Afficher les liens qui ne peuvent pas être ouverts à l'hôte,Le lien a échoué;Avec le port ouvert,Lien réussi,Entrez.telnetPage(Tout noir.),Prouver que le port est disponible.
//3.Telnet Commandes fréquemment utilisées par les clients ?
open : Utiliser openhostname Peut être construit sur l'hôte Telnet Connexion.
close : Utilisez les commandes close Les commandes peuvent fermer les Telnet Connexion.
display : Utiliser display Les commandes peuvent être vues Telnet Paramètres actuels du client .
send : Utiliser send Les commandes peuvent être adressées à Telnet Serveur envoyer la commande.
//windowsModifications du systèmecmdFenêtreutf-8Format de codage Entrée directe“chcp 65001”,Touche Entrée(EnterClé)Mise en œuvre, Le Code de fenêtre est déjà UTF-8C'est codé..

5.2.4 Java BIOAnalyse des problèmes

1)、Par demande(Client) Vous devez créer des fils séparés ,Données avec le client correspondant Read,Traitement des affaires,Données Write .

2)、Lorsque le nombre de concurrents est élevé,Un grand nombre de Threads doivent être créés pour gérer les connexions,Utilisation importante des ressources du système.

3)、Après connexion,Si le thread actuel n'a pas de données lisibles temporairement,Le fil est bloqué dans Read Fonctionnement,Cause thread Resource Waste

5.3 Java NIOGénéralités

5.3.1 Java NIO Introduction générale

1)、Java NIO Nom complet java non-blocking IO,Oui. JDK Nouvelles offres API.De JDK1.4 C'est parti.,Java Une série d'améliorations sont proposées/Nouvelles caractéristiques de la sortie,Sont collectivement appelés NIO(C'est - à - dire: New IO),- Oui.Synchronisation non bloquanteDe.

2)、NIO Les classes pertinentes sont placées dans java.nio Sac et sous - sac,Et à l'origine java.io Beaucoup de classes dans le paquet sont réécrites.

3)、NIO Il y a trois parties principales:Channel(Accès),Buffer(Tampon), Selector(Sélecteur)

4)、NIO- Oui. Face au tampon ,OuBloc orientéProgrammé.Les données sont lues dans un tampon qu'il traitera plus tard,Déplacez - vous d'avant en arrière dans le tampon si nécessaire,Cela augmente la flexibilité du traitement,Il peut être utilisé pour fournir un réseau non - bloquant à haute extensibilité.

5)、Java NIOMode non bloquant pour,Faire en sorte qu'un thread envoie une requête ou lit des données d'un canal,Mais il ne peut obtenir que les données actuellement disponibles,Si aucune donnée n'est actuellement disponible,Je n'aurai rien,Au lieu de garder le fil bloqué,Donc jusqu'à ce que les données deviennent lisibles,Le thread peut continuer à faire d'autres choses. Il en va de même pour l'écriture non bloquante,Un thread demande d'écrire des données sur un canal,Mais il n'est pas nécessaire d'attendre qu'il soit entièrement écrit,Ce fil peut faire autre chose en même temps.

6)、Compréhension populaire:NIOEst capable de gérer plusieurs opérations avec un seul thread.Supposons qu'il y ait10000Une demande,Selon la situation réelle,Peut être attribué50Ou100Threads to handle.Contrairement aux blocages précédentsIOComme ça.,Doit être distribué10000- Oui..

7)、HTTP2.0La technologie du multiplexage est utilisée,Faire la même connexion et traiter plusieurs demandes simultanément,Et le nombre de demandes concurrentes est plus élevé queHTTP1.1Plusieurs ordres de grandeur.

5.3.2 NIO Et BIO Comparaison

1)、BIO Traitement des données en flux,Et NIO Traitement des données par blocs,Bloc I/O Débit spécifique d'efficacité de I/O Beaucoup plus haut

2)、BIO C'est bloqué,NIO C'est non - bloquant

3)、BIOOpération basée sur le flux d'octets et de caractères,Et NIO Basé sur Channel(Accès)Et Buffer(Tampon)Exécution des opérations,Les données sont toujours lues du canal au tampon,Ou écrire dans le Canal à partir du tampon.Selector(Sélecteur)Événements pour écouter plusieurs canaux(Par exemple,:Demande de connexion,Arrivée des données, etc),Ainsi, l'utilisation d'un seul thread permet d'écouter plusieurs canaux clients .

5.3.3 NIO Schéma des trois principes de base

Une description graphiqueNIO De Selector 、 Channel Et Buffer La relation entre

[Impossible de transférer l'image de la chaîne externe,Il peut y avoir un mécanisme antivol à la station source,Il est recommandé de sauvegarder l'image et de la télécharger directement(img-iF5JzbSM-1641480118469)(img/1607540001099.png)]

Selector 、 Channel Et Buffer Diagramme pour(Version simple)
Description du diagramme:
1)、Chaquechannel Il y en aura un.Buffer

2)、Selector Correspond à un thread, Un fil correspond à plusieurschannel(Connexion)

3)、Le graphique reflète troischannel Inscrivez - vous à Leselector

4)、Où le programme passe - t - il?channel Il y a eu un incident., Event Est un concept important

5)、Selector Selon les différents événements,Basculer sur chaque canal

6)、Buffer C'est un bloc de mémoire. , Au rez - de - chaussée, il y a un tableau

7)、Les données sont lues et écrites parBuffer, Ceci etBIO , BIO Flux d'entrée,Ou un flux de sortie, Pas dans les deux sens.,MaisNIODeBuffer Peut lire ou écrire, Besoin flip Changement de méthode

8)、channel Dans les deux sens., Vous pouvez retourner à l'état du système d'exploitation sous - jacent, Par exemple,Linux , Les canaux du système d'exploitation au rez - de - chaussée sont bidirectionnels.

5.3.4 BufferTampon

Tampon(Buffer):Le tampon est essentiellement unBlocs de mémoire qui peuvent lire et écrire des données,Peut être compris comme un objet conteneur(Avec tableau),Cet objet fournit un ensemble de méthodes,Les blocs de mémoire peuvent être utilisés plus facilement,L'objet tampon a des mécanismes intégrés,Capacité de suivre et d'enregistrer les changements d'état du tampon.Channel Fournir à partir du fichier、Accès au réseau pour la lecture des données,Mais les données lues ou écrites doivent passer par Buffer.

Comme le montre la figure:

[Impossible de transférer l'image de la chaîne externe,Il peut y avoir un mécanisme antivol à la station source,Il est recommandé de sauvegarder l'image et de la télécharger directement(img-6DXiIHIv-1641480118470)(img/1607540218232.png)]

5.3.4.1 Buffer Classes et sous - classes

  1. In NIO Moyenne,Buffer C'est un parent de haut niveau,C'est une classe abstraite, Diagramme hiérarchique de la classe:

[Impossible de transférer l'image de la chaîne externe,Il peut y avoir un mécanisme antivol à la station source,Il est recommandé de sauvegarder l'image et de la télécharger directement(img-AVxatfmT-1641480118470)(img/1607540292734.png)]

FréquentBuffer Liste des sous - classes
ByteBuffer,Stocker les octets de données dans un tampon
ShortBuffer,Stocker les données de chaîne dans un tampon
CharBuffer,Stocker les données de caractère dans un tampon
IntBuffer,Stocker des données entières dans un tampon
LongBuffer,Stockage de données entières longues dans un tampon
DoubleBuffer,Stocker les décimales dans le tampon
FloatBuffer,Stocker les décimales dans le tampon
  1. BufferLa classe définit quatre attributs que tous les tampons ont pour fournir des informations sur les éléments de données qu'ils contiennent:
// Invariants: mark <= position <= limit <= capacity
private int mark = -1;
private int position = 0;
private int limit;
private int capacity;
Propriétés Description
capacity Capacité,C'est - à - dire la quantité maximale de données qui peut être contenue;Est défini lors de la création du tampon et ne peut pas être modifié
limit Indique la fin actuelle du tampon,Impossible de lire et d'écrire la position du tampon au - delà de la limite.Et les limites peuvent être modifiées
position Emplacement,Index de l'élément suivant à lire ou à écrire,Chaque fois que les données du tampon sont lues et écrites, la valeur de changement est modifiée,Pour la prochaine lecture et l'écriture
mark Marquage
  1. BufferListe des méthodes pertinentes
public abstract class Buffer {

//JDK1.4Heure,Introductionapi
public final int capacity( )//Renvoie la capacité de ce tampon
public final int position( )//Renvoie l'emplacement de ce tampon
public final Buffer position (int newPositio)//Définir l'emplacement de ce tampon
public final int limit( )//Renvoie les limites de ce tampon
public final Buffer limit (int newLimit)//Définir les limites de ce tampon
public final Buffer mark( )//Définissez le marqueur à l'emplacement de ce tampon
public final Buffer reset( )//Réinitialiser la position de ce tampon à la position précédemment marquée
public final Buffer clear( )//Effacer ce tampon, Restaurer les étiquettes individuelles à leur état initial,Mais les données ne sont pas vraiment effacées, Les actions suivantes seront écrasées
public final Buffer flip( )//Inverser ce tampon
public final Buffer rewind( )//Rediriger ce tampon
public final int remaining( )//Renvoie le nombre d'éléments entre la position actuelle et la limite
public final boolean hasRemaining( )//Indique s'il y a des éléments entre l'emplacement actuel et les limites
public abstract boolean isReadOnly( );//Indique si ce tampon est en lecture seule
//JDK1.6Introduit àapi
public abstract boolean hasArray();//Indique si ce tampon a un tableau d'implémentation sous - jacent accessible
public abstract Object array();//Renvoie le tableau d'implémentation sous - jacent pour ce tampon
public abstract int arrayOffset();//Renvoie l'offset du premier élément tampon dans le tableau d'implémentation sous - jacent de ce tampon
public abstract boolean isDirect();//Indique si ce tampon est un tampon direct
}

5.3.4.2 ByteBuffer

Comme vous pouvez le voir plus haut, pour Java .Types de données de base dans(booleanException),Il y en a un Buffer Type correspondant,La nature la plus courante estByteBuffer Catégorie(Données binaires)

Les principales méthodes de cette catégorie sont les suivantes::

public abstract class ByteBuffer {

//Création de tamponsapi
public static ByteBuffer allocateDirect(int capacity)//Créer un tampon direct
public static ByteBuffer allocate(int capacity)//Définir la capacité initiale du tampon
public static ByteBuffer wrap(byte[] array)//Mettre un tableau dans un tampon pour l'utiliser
//Position d'initialisation de la constructionoffsetEt la limite supérieurelengthTampon pour
public static ByteBuffer wrap(byte[] array,int offset, int length)
//Corrélation d'accès au cacheAPI
public abstract byte get( );//De la position actuellepositionAllez.get,getAprès,positionVa automatiquement+1
public abstract byte get (int index);//De la position absolueget
public abstract ByteBuffer put (byte b);//Ajouter à partir de l'emplacement actuel,putAprès,positionVa automatiquement+1
public abstract ByteBuffer put (int index, byte b);//En position absolueput
}

[Impossible de transférer l'image de la chaîne externe,Il peut y avoir un mécanisme antivol à la station source,Il est recommandé de sauvegarder l'image et de la télécharger directement(img-puB4Uy3Z-1641480118471)(img/1607540465387.png)]

5.3.5 Channel Accès

5.3.5.1 Introduction générale

1)、NIOLe canal de,Mais certaines différences sont les suivantes::

Les canaux peuvent être lus et écrits simultanément,Et le flux ne peut lire ou écrire que

Les canaux permettent une lecture et une écriture asynchrones des données

Le canal peut lire les données à partir du tampon,Vous pouvez également écrire des données dans le tampon:

[Impossible de transférer l'image de la chaîne externe,Il peut y avoir un mécanisme antivol à la station source,Il est recommandé de sauvegarder l'image et de la télécharger directement(img-5q9rQgYm-1641480118472)(img/1607540536057.png)]

2)、BIO Dans stream Est unidirectionnel,Par exemple FileInputStream L'objet ne peut effectuer que des opérations de lecture de données,Et NIO Canal dans(Channel)Dans les deux sens.,Opération lisible,Vous pouvez également écrire.

3)、ChannelInNIOEst une interfacepublic interface Channel extends Closeable{}

4)、Fréquent Channel Oui.:FileChannel、DatagramChannel、ServerSocketChannel Et SocketChannel.【ServerSocketChanne Similaire ServerSocket , SocketChannel Similaire Socket】

5)、FileChannel Lecture et écriture des données pour les fichiers,DatagramChannel Pour UDP Lire et écrire les données de,ServerSocketChannel Et SocketChannel Pour TCP Lire et écrire les données de.

[Impossible de transférer l'image de la chaîne externe,Il peut y avoir un mécanisme antivol à la station source,Il est recommandé de sauvegarder l'image et de la télécharger directement(img-JzdYuoBU-1641480118475)(img/1607540588060.png)]

5.3.5.2 FileChannel Catégorie

FileChannelIl est principalement utilisé pour IO Fonctionnement,Les méthodes courantes sont les suivantes:

public int read(ByteBuffer dst) ,Lire les données du canal et les mettre dans le tampon
public int write(ByteBuffer src) ,Écrire les données du tampon dans le canal
public long transferFrom(ReadableByteChannel src, long position, long count),Copier les données du canal cible vers le canal courant
public long transferTo(long position, long count, WritableByteChannel target),Copier les données du canal courant vers le canal cible

5.3.5.3 CAS

Besoins1:Fichier local write Data,Utiliser leByteBuffer(Tampon) Et FileChannel(Accès), Oui. “hello world” Écrit àabc.txt Moyenne, Créer si le fichier n'existe pas .

Besoins2:Fichier local lire les données,Utiliser leByteBuffer(Tampon) Et FileChannel(Accès), Oui. abc.txt Lire les données dans le programme,Et est affiché sur l'écran de la console,Supposons que le fichier existe déjà.

Besoins3:Utilisez unBufferCompléter la lecture du fichier,Utiliser FileChannel(Accès) Et Méthodes read , write,Copie complète du fichier,Copier un fichier texteabc.txt , Mettez - le sous le point.

Besoins4:Copier le fichiertransferFrom Méthodes,Utiliser FileChannel(Accès) Et Méthodes transferFrom ,Copie complète du fichier,Copier une image.

5.3.5.4 À propos deBuffer Et ChannelNotes et détails

1)、ByteBuffer Prise en charge de la dactylographieput Et get, put Quel type de données est placé,getVous devriez utiliser le type de données approprié pour extraire,Sinon, il pourrait y avoir BufferUnderflowException Anomalie.

import java.nio.ByteBuffer;
public class NioByteBufferPutGet {

public static void main(String[] args) {

ByteBuffer byteBuffer= ByteBuffer.allocate(64);
byteBuffer.putInt(123);
byteBuffer.putLong(23444444);
byteBuffer.putChar('Grand');
byteBuffer.putShort((short)20);
byteBuffer.flip();
System.out.println();
System.out.println(byteBuffer.getInt());
System.out.println(byteBuffer.getLong());
System.out.println(byteBuffer.getChar());// Modifier comme suit: getInt() Une exception est lancée
System.out.println(byteBuffer.getShort());
}
}

2)、Peut transformer unBuffer Lire seulementBuffer

import java.nio.ByteBuffer;
/** * Lire seulementbuffer, Comme son nom l'indique, il ne peut être utilisé que pour lire ,Très utile, Que personne d'autre ne puisse modifier ,Lire seulement * Lire seulementbufferAu rez - de - chaussée,:HeapByteBufferR,Et ordinairebufferAu rez - de - chaussée,:HeapByteBuffer * Si vous allez à l'intérieur put Les données lancent une exception , Regardez le code source et vous verrez ,Le sien.put La méthode est de lancer l'exception directement . * C'est bon.debug Un instant. */
public class ReadOnlyBuffer {

public static void main(String[] args) {

ByteBuffer byteBuffer = ByteBuffer.allocate(10);
for (int i=0;i<10;i++){

byteBuffer.put((byte) i);
}
byteBuffer.flip();
ByteBuffer onlyReadBuffer=byteBuffer.asReadOnlyBuffer();
System.out.println(onlyReadBuffer.getClass());
while (onlyReadBuffer.hasRemaining()){

System.out.println(onlyReadBuffer.get());
}
onlyReadBuffer.put((byte) 10);// ReadOnlyBufferException Ouvrez cette phrase ,Une exception est lancée
}
}

3)、NIO Sont également disponibles MappedByteBuffer, Vous pouvez garder les fichiers directement en mémoire(Mémoire hors du tas)Modifier dans, Et comment se synchroniser avec le fichier parNIO Pour finir.

import java.io.FileNotFoundException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
/** * MappedByteBufferAction:Vous pouvez garder les fichiers directement en mémoire(Mémoire hors du tas)Modifier dans, Et le système d'exploitation n'a pas besoin d'une copie ,C'est un peu comme ça.DirectByteBuffer * En fait,DirectByteBufferC'est aussiMappedByteBuffer Sous - classe d'action . * * Attention!:Après l'exécution du Code,IDEA Les documents n'ont pas été modifiés à temps , Mais si on ouvre le fichier dehors , Il a vraiment changé . * //Clic droit show in ex... Après avoir ouvert le fichier */
public class MappedByteBufferTest {

public static void main(String[] args) throws Exception {

RandomAccessFile randomAccess = new RandomAccessFile("1.txt", "rw");
FileChannel fileChannel = randomAccess.getChannel();
//0-4 Le contenu du champ d'application peut être manipulé directement en mémoire [ Cinq octets de position ]
/** * Le premier paramètre est Mode, Le mode lecture - écriture que nous utilisons * No2Les paramètres sont: C'est la position de départ * No3Les paramètres sont: Est la taille cartographiée à la mémoire */
MappedByteBuffer mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_WRITE, 0, 5);
// Ici, nous opérons directement en mémoire , Vous pouvez modifier le fichier 
mappedByteBuffer.put(0, (byte) 'o');// Modifier la première position 
mappedByteBuffer.put(1, (byte) 'p');//Modifier le paragraphe2Position
//Modifier le paragraphe11Position, Jetez IndexOutOfBoundsException,Il faut 0,5 Modifier comme suit: 0,11 Au lieu de 0,10
//mappedByteBuffer.put(10, (byte) 'x');
randomAccess.close();
}
}

4)、Les opérations de lecture et d'écriture dont nous avons parlé plus tôt,Tout ça à travers unBuffer Terminé,NIO Il soutient également Par plusieursBuffer (C'est - à - dire: Buffer Tableau) Terminer la lecture et l'écriture,C'est - à - dire: Scattering Dispersion et Gathering Agrégation

Exemple d'exigence:
Utiliser FileChannel(Accès) Et Méthodes transferFrom ,Copie complète du fichier

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Arrays;
/** * Scattering: Après avoir écrit les données à bufferMi - temps,Peut être adoptébufferTableau,Écrivez à tour de rôle,Unbuffer Écrivez - en un. . * Gatering: Lire les données à bufferMi - temps,Peut être adoptébufferTableau,Lire dans l'ordre,Unbuffer C'est fait. Allez - y. . */
/** * Comment utiliser:Ouvre.cmd telnet locakhost 8899, Testez une fois , Redémarrez la connexion une fois [Pas assez8- Oui.,Je viens de8Caractères,Plus que8- Oui.] * La chaîne peut être saisie après la connexion */
public class ScatteringAndGatherIngTest {

public static void main(String[] args) throws IOException {

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
InetSocketAddress address = new InetSocketAddress(7000);
serverSocketChannel.socket().bind(address); // Lier lier lier le port à scoket , Et commence à écouter 
int messageLength = 5 + 3;
ByteBuffer[] byteBuffers = new ByteBuffer[2];
byteBuffers[0] = ByteBuffer.allocate(5);
byteBuffers[1] = ByteBuffer.allocate(3);
SocketChannel socketChannel = serverSocketChannel.accept();
while (true) {

int byteRead = 0;
// Accepter la chaîne écrite par le client 
while (byteRead < messageLength) {

long r = socketChannel.read(byteBuffers);
byteRead += r;
System.out.println("byteRead:" + byteRead);
// Impression en continu 
Arrays.asList(byteBuffers).stream().map(buffer -> "postiton:" + buffer.position() + ",limit:" + buffer.limit()).forEach(System.out::println);
}
//ToutbufferTousflip.
Arrays.asList(byteBuffers).forEach(buffer -> {
buffer.flip();});
// Lecture des données Echo au client 
long byteWrite = 0;
while (byteWrite < messageLength) {

long r = socketChannel.write(byteBuffers);
byteWrite += r;
}
//ToutbufferTousclear
Arrays.asList(byteBuffers).forEach(buffer -> {
buffer.clear();});
System.out.println("byteRead:" + byteRead + ",byteWrite:" + byteWrite + ",messageLength:" + messageLength);
}
}
}

5.3.6 Selector Sélecteur

5.3.6.1 Introduction générale

1)、Java De NIO,Avec non - blocage IO Comment.Peut utiliser un thread,Gérer plusieurs connexions client,Est utiliséSelector(Sélecteur).

2)、Selector Possibilité de détecter des événements sur plusieurs canaux enregistrés(Attention!:PlusieursChannelVous pouvez vous inscrire au mêmeSelector),Si un événement se produit,Obtenez les événements et gérez - les en conséquence pour chaque événement.Cela permet de gérer plusieurs canaux avec un seul thread,C'est - à - dire gérer plusieurs connexions et demandes.

3)、Seulement si Connexion/Accès Il y a vraiment des événements de lecture et d'écriture,Pour lire et écrire,Réduit considérablement les frais généraux du système,Et il n'est pas nécessaire de créer un thread pour chaque connexion,Pas besoin de maintenir plusieurs fils

4)、Évitez les frais généraux causés par le changement de contexte entre plusieurs Threads

[Impossible de transférer l'image de la chaîne externe,Il peut y avoir un mécanisme antivol à la station source,Il est recommandé de sauvegarder l'image et de la télécharger directement(img-7EbKu3Gt-1641480118481)(img/1607541373193.png)]

Re - description des caractéristiques :
1)、Netty De IO Thread NioEventLoop Agrégé Selector(Sélecteur,Aussi appelé multiplexeur),Peut traiter des centaines ou des milliers de connexions client simultanément.

2)、Quand un thread sort d'un client Socket Lorsque le canal lit et écrit les données,Si aucune donnée n'est disponible,Le thread peut effectuer d'autres tâches.

3)、Les fils ne sont généralement pas bloqués IO Le temps libre est utilisé pour exécuter sur d'autres canaux IO Fonctionnement,Ainsi, un seul thread peut gérer plusieurs canaux d'entrée et de sortie.

4)、Parce que les opérations de lecture et d'écriture ne sont pas bloquées,Cela peut être amélioré IO Efficacité de fonctionnement du fil,Évitez la fréquence I/O Le fil est suspendu en raison du blocage.

5)、Un I/O Les fils peuvent être traités simultanément N Connexions client et opérations de lecture et d'écriture,Cela résout fondamentalement le blocage synchrone traditionnel I/O Une connexion à un modèle de fil ,Performance de l'architecture、La flexibilité et la fiabilité sont grandement améliorées.

5.3.6.2 SelectorMéthodes liées à la classe

Selector La classe est une classe abstraite, Les méthodes et instructions communes sont les suivantes::

public abstract class Selector implements Closeable {

public static Selector open();//Obtenir un objet de sélection
public int select(long timeout);//Surveiller tous les canaux enregistrés,Quand il y a IO Lorsque l'opération peut être effectuée,Va correspondre à SelectionKey Joignez - vous à la collection interne et retournez à ,Le paramètre est utilisé pour définir le temps d'arrêt
public Set<SelectionKey> selectedKeys();//Obtenir tous les SelectionKey 
}

[Impossible de transférer l'image de la chaîne externe,Il peut y avoir un mécanisme antivol à la station source,Il est recommandé de sauvegarder l'image et de la télécharger directement(img-CkzO6fgQ-1641480118485)(img/1607541485953.png)]

Notes:

1)、NIODans ServerSocketChannelFonctionnalité similaireServerSocket,SocketChannelFonctionnalité similaireSocket

2)、selector Description de la méthode pertinente
selector.select()//Blocage
selector.select(1000);//Blocage1000MS,In1000Retour en millisecondes
selector.wakeup();//Réveillez - vous.selector
selector.selectNow();//Pas de blocage,Retour immédiat

5.3.6.3 NIO Non - blocage Schéma d'analyse de la programmation réseau

NIO Non - blocage Programmation réseau (Selector、SelectionKey、ServerScoketChannelEtSocketChannel) Diagramme de peignage des relations

[Impossible de transférer l'image de la chaîne externe,Il peut y avoir un mécanisme antivol à la station source,Il est recommandé de sauvegarder l'image et de la télécharger directement(img-5uolNoHO-1641480118486)(img/Photos1.png)]

Description du dessin :
1)、Quand le client est connecté,Va passerServerSocketChannel Je l'ai. SocketChannel

2)、Selector Pour écouter select Méthodes, Renvoie le nombre de canaux où l'événement s'est produit.

3)、Oui.socketChannelInscrivez - vous àSelectorAllez., register(Selector sel, int ops), UnselectorPlusieursSocketChannel

4)、Retour à un SelectionKey, Va et vaSelector Liens(Ensemble)

5)、Pour obtenir plus de détails SelectionKey (Il y a eu un incident)

6)、Par SelectionKey Obtenir à l'envers SocketChannel , Méthodes channel()

7)、Peut passer Je l'ai. channel , Terminer le traitement des affaires

5.3.6.4 NIO Non - blocage Démarrage rapide de la programmation réseau

Exigences relatives aux cas:
Écrivez un NIO Cas d'introduction,Permet une communication simple des données entre le serveur et le client(Non - blocage)
Objectif:Compris.NIOMécanisme de programmation du réseau non bloquant

5.3.7 SelectionKeyCatégorie

1)、SelectionKey,Représentation Selector Relation d'enregistrement avec le canal réseau, Quatre espèces au total:

int OP_ACCEPT:Il y a une nouvelle connexion réseau pour accept,La valeur est: 16
int OP_CONNECT:Une connexion représentative a été établie,La valeur est: 8
int OP_READ:Opération de lecture représentative,La valeur est: 1
int OP_WRITE:Représente une opération d'écriture,La valeur est: 4
//Dans le code source:
public static final int OP_READ = 1 << 0;
public static final int OP_WRITE = 1 << 2;
public static final int OP_CONNECT = 1 << 3;
public static final int OP_ACCEPT = 1 << 4;

2)、SelectionKeyMéthodes pertinentes

public abstract class SelectionKey {

public abstract Selector selector();//Obtenir ce qui est associé à Selector Objet
public abstract SelectableChannel channel();//Obtenir les canaux associés à
public final Object attachment();//Obtenir les données partagées associées à
public abstract SelectionKey interestOps(int ops);//Définir ou modifier les événements d'écoute
public final boolean isAcceptable();//Oui Nonaccept
public final boolean isReadable();//Peut - on lire
public final boolean isWritable();//Peut - on écrire
}

[Impossible de transférer l'image de la chaîne externe,Il peut y avoir un mécanisme antivol à la station source,Il est recommandé de sauvegarder l'image et de la télécharger directement(img-ZCphp7y0-1641480118494)(img/1607541861097.png)]

5.3.8 ServerSocketChannelCatégorie

1)、ServerSocketChannel Écouter les nouveaux clients du côté serveur Socket Connexion

2)、Les méthodes pertinentes sont les suivantes:

public abstract class ServerSocketChannel extends AbstractSelectableChannel implements NetworkChannel{

public static ServerSocketChannel open(),J'en ai un. ServerSocketChannel Accès
public final ServerSocketChannel bind(SocketAddress local),Définir le slogan côté serveur
public final SelectableChannel configureBlocking(boolean block),Régler le mode de blocage ou de non - blocage,Valeur false Indique un mode non bloquant
public SocketChannel accept(),Accepter une connexion,Renvoie l'objet canal qui représente cette Connexion
public final SelectionKey register(Selector sel, int ops),Enregistrer un sélecteur et définir les événements d'écoute
}

[Impossible de transférer l'image de la chaîne externe,Il peut y avoir un mécanisme antivol à la station source,Il est recommandé de sauvegarder l'image et de la télécharger directement(img-RsiFQ6mM-1641480118498)(img/1607541970861.png)]

5.3.9 SocketChannelCatégorie

1)、SocketChannel,Réseau IO Accès,Responsable de la lecture et de l'écriture.NIO Écrire les données du tampon dans le canal,Ou lire les données du canal dans le tampon.

2)、Les méthodes pertinentes sont les suivantes:

public abstract class SocketChannel extends AbstractSelectableChannel implements ByteChannel, ScatteringByteChannel, GatheringByteChannel, NetworkChannel{

public static SocketChannel open();//J'en ai un. SocketChannel Accès
public final SelectableChannel configureBlocking(boolean block);//Régler le mode de blocage ou de non - blocage,Valeur false Indique un mode non bloquant
public boolean connect(SocketAddress remote);//Connexion au serveur
public boolean finishConnect();//Si la connexion de la méthode ci - dessus échoue,La prochaine étape consiste à compléter l'opération de connexion par cette méthode
public int write(ByteBuffer src);//Écrivez les données dans le canal
public int read(ByteBuffer dst);//Lire les données du canal
public final SelectionKey register(Selector sel, int ops, Object att);//Enregistrer un sélecteur et définir les événements d'écoute,Le dernier paramètre peut définir les données partagées
public final void close();//Fermez le canal
}

[Impossible de transférer l'image de la chaîne externe,Il peut y avoir un mécanisme antivol à la station source,Il est recommandé de sauvegarder l'image et de la télécharger directement(img-XJNYrcUu-1641480118500)(img/1607542038319.png)]

5.4 Java AIO Pas de blocage asynchrone

1)、JDK 7 Introduit Asynchronous I/O,C'est - à - dire: AIO.En cours I/O En programmation,Couramment utilisé dans les deux modes:ReactorEt Proactor.Java De NIO C'est Reactor,Lorsqu'un événement est déclenché,Notification côté serveur,Traitement approprié

2)、AIO C'est - à - dire: NIO2.0,Appelé asynchrone non bloquante IO.AIO Introduction du concept de canaux asynchrones,Adopté Proactor Mode,Programmation simplifiée,Demande valide pour démarrer le thread,Il est caractérisé par le fait que le système d'exploitation est terminé avant d'aviser le serveur de démarrer le thread pour le traitement,Généralement applicable aux applications avec un grand nombre de connexions et une longue durée de connexion

3)、Pour l'instant AIO Pas encore largement utilisé,Netty Est également basé surNIO, Au lieu deAIO, Donc nous n'avons pas de détailsAIOC'est,Les étudiants intéressés peuvent consulter <<JavaModèle de programmation réseau de nouvelle générationAIOPrincipes etLinuxSystèmeAIOIntroduction>>

5.5 BIO、NIO、AIOTableau comparatif

BIO NIO AIO
IO Modèle Blocage synchrone Synchronisation non bloquante(Multiplexage) Asynchrone non bloquante
Difficultés de programmation Simple. Complexe Complexe
Fiabilité Mauvais D'accord. D'accord.
Débit Faible Élevé Élevé

Exemples
Blocage synchrone: Chez le coiffeur. , J'ai attendu que le coiffeur , Jusqu'à ce qu'on se coupe les cheveux .
Synchronisation non bloquante: Chez le coiffeur. , J'ai trouvé quelqu'un d'autre avec une coupe de cheveux devant , Dis - le au coiffeur. , Fais autre chose. , Viens voir si c'est ton tour .
Asynchrone non bloquante: Appelle le coiffeur. , Faites venir un coiffeur , Fais autre chose toi - même. , Le coiffeur est venu vous couper les cheveux

5.6 PrimitiveNIOProblèmes existants

1)、NIO Bibliothèque de classe et API Complexe,Problèmes d'utilisation:Besoin de maîtrise Selector、ServerSocketChannel、SocketChannel、ByteBuffer Attendez..

2)、D'autres compétences supplémentaires sont nécessaires:Familiarisez - vous avec Java Programmation multithreadée,Parce que NIO La programmation implique Reactor Mode,Vous devez être très familier avec le Multithreading et la programmation réseau,Pour écrire des NIO Procédure.

3)、La charge de travail et les difficultés de développement sont énormes:Par exemple, le client fait face à une déconnexion et à une reconnexion、Flashover réseau、Demi - paquet lire et écrire、Échec du cache、Gestion de la congestion du réseau et des flux anormaux, etc.

4)、JDK NIO De Bug:Par exemple, tristement célèbre Epoll Bug,Il peut causer Selector Sondage vide,En fin de compte, CPU 100%.Jusqu'à JDK 1.7 Version le problème persiste,N'a pas été fondamentalement résolu.

5.7 Netty Cadre et avantages

1)、Netty C'est par JBOSS Une offre Java Cadre Open Source.Netty Fournir asynchrone、Cadre d'application Web axé sur les événements,Pour développer rapidement des performances élevées、Réseau très fiable IO Procédure.

2)、Netty Peut vous aider rapidement、Développer une application réseau simple,C'est l'équivalent d'une simplification et d'une rationalisation NIO Le processus de développement de

3)、Netty Est actuellement le plus populaire NIO Cadre,Netty Dans le domaine de l'Internet、Big Data Distributed Computing Field、Industrie du jeu、L'industrie des communications, etc., a été largement utilisée,Bien connu Elasticsearch 、Dubbo Adopté à l'intérieur du cadre Netty.

NettyLes avantages de

Netty C'est exact. JDK Autoportante NIO De API Encapsulé,Résoudre les problèmes ci - dessus.
1)、Design élégant:Pour l'unification des différents types de transmission API Blocage et non - blocage Socket;Basé sur un modèle d'événement flexible et évolutif,Les préoccupations peuvent être clairement séparées;Modèle de fil hautement personnalisable - Un seul fil,Un ou plusieurs pools de threads.

2)、Facile à utiliser:Enregistré en détail Javadoc,Guide de l'utilisateur et exemples;Aucune autre dépendance,JDK 5(Netty 3.x)Ou 6(Netty 4.x)Ça suffit..

3)、Haute performance、Débit plus élevé:Moins de retard;Réduction de la consommation de ressources;Minimiser la réplication inutile de la mémoire.

4)、Sécurité:Complet SSL/TLS Et StartTLS Soutien.

5)、La communauté est active、Mise à jour continue:La communauté est active,Cycle d'itération de version court,Trouvé Bug Peut être réparé à temps,En même temps,Plus de nouvelles fonctionnalités seront ajoutées

版权声明:本文为[Vers le Haut]所创,转载请带上原文链接,感谢。 https://javamana.com/2022/01/202201080601055778.html