Il est bien connu que la communication entre un serveur Web et un client utilise le protocole HTTP. HTTP est une norme pour les demandes et réponses du client et du serveur (TCP). Étant donné que le protocole HTTP est basé sur le protocole TCP, j'utiliserai Socket en Java pour compléter ce serveur Web simple. Pour des informations HTTP plus détaillées, vous pouvez consulter les informations pertinentes pour en savoir plus.
Avant d'écrire le serveur, examinons les règles de communication entre le navigateur et le serveur.
Tout d'abord, nous utilisons SERVERSocket pour simuler un serveur, y accédant via le navigateur et visons le contenu demandé par le navigateur:
Importer java.io.bufferedwriter; import java.io.inputstream; import java.io.outputStreamwriter; import java.net.inetaddress; importer java.net.inetsocketaddress; import java.net.serversocket; import java.net.socket; importer Org.junit.test; / ** * http protoCol Test * @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @vor jianggujin * * / classe publique hqhttpprotocoltest {@test public void server () lève exception {serversocket serveSocket = new serversocket (80); Socket socket = serversocket.Accept (); InputStream stream = socket.getInputStream (); int r = -1; while ((r = stream.read ())! = -1) {System.out.print ((char) r); }}}Exécutez-le avec Junit et accédez à lui via le navigateur: http://127.0.0.1 , nous pouvons voir que la sortie du contenu de la demande du navigateur sur la console est la suivante:
Get / http / 1.1host: 127.0.0.1Connection: Keep-aliveAccept: text / html, application / xhtml + xml, application / xml; q = 0.9, image / webp, * / *; q = 0.8User-agent: mozilla / 5.0 (windows nt 5.1) Chrome / 31.0.1650.63 Safari / 537.36accept-codage: gzip, dégonfler, sdchaccept-language: zh-cn, zh; q = 0,8
Afin de mieux analyser le contenu de la demande, nous écrivons une page HTML pour soumettre des données et visualisons à nouveau le contenu de la demande:
<! Doctype html> <html> <éadf> <meta charset = "utf-8"> <tight> test </ title> </ head> <body> <form metheth = "post" action = "http://127.0.0.1?test=123"> <entrée type = "text" name = "name" /> <fut Type = "Soumider" /> </ Form> </ Body> </html>
Entrez Bob dans la zone d'entrée, cliquez sur le bouton pour soumettre et observez la sortie de la console:
POST /? Test = 123 HTTP / 1.1HOST: 127.0.0.1Connection: Keep-AliveContent-Length: 8Cache-Control: Max-Age = 0ACcept: Text / Html, Application / Xhtml + Xml, Application / Xml; Q = 0.9, image / webp, * / *; Q = 0.8origin: Nulluser-Aagent: Mozilla / 5.0; (Windows NT 5.1) Applewebkit / 537.36 (KHTML, comme Gecko) Chrome / 31.0.1650.63 Safari / 537.36 Content-Type: Application / X-WWW-FORM-URLENCODEDADACcept-Encoding: gzip, 0,8nme = sdchaccept-langagage: zh-cnn, zh;
Analysons le contenu de cette demande:
La première ligne: se compose de trois parties, séparées par des espaces au milieu, la première partie est la méthode de demande (get, post), la deuxième partie est le chemin de demande et les paramètres de requête, et la troisième partie est la version du protocole HTTP (HTTP / 1.1)
Ligne 2 à la ligne 10: Les informations d'en-tête de la demande, le nom et la valeur de l'en-tête de demande sont passés: séparez la onzième ligne: ligne vide 12e ligne: contenu du formulaire soumis, nous pouvons obtenir la conclusion suivante: Le premier comportement des informations de demande est la méthode de la demande, le chemin de la demande, les paramètres de requête et la version du protocole HTTP. Après la rupture de la ligne / r / n, les informations d'en-tête de demande sont immédiatement suivies de la rupture de la ligne / r / n, les informations d'en-tête de demande sont suivies d'une ligne vierge une fois les informations d'en-tête de demande terminées et les données de demande sont immédiatement suivies d'une ligne vide. Il convient de noter que cela n'est simulé que. Quant aux soumissions de fichiers complexes, etc., elle n'est pas discutée ici, et le format de contenu de la demande est légèrement différent.
À ce stade, nous avons déjà connu le contenu demandé par le client. Jetons un coup d'œil au format des données de réponse du serveur après avoir reçu la demande. Nous créons un nouveau projet Web pour tester et modifier le contenu de la page HTML comme suit:
<! Doctype html> <html> <éad- head> <meta charset = "utf-8"> <tight> test </title> </ head> <body> Ceci est la page de test. </body> </html>
Démarrez le serveur, puis écrivez le code de test client pour obtenir les données de retour du serveur:
Importer java.io.bufferedwriter; import java.io.inputstream; import java.io.outputStreamwriter; import java.net.serversocket; import java.net.socket; import org.junit.test; / ** * HTTP ProtoCol test * * @author jiangujin * * / Classe publique HTTP HQHTTTPPRROCRROT server () lève l'exception {serversocket serversocket = new serversocket (80); Socket socket = serversocket.Accept (); InputStream stream = socket.getInputStream (); // BufferedInputStream inputStream = new BufferedInputStream (Stream); int r = -1; while ((r = stream.read ())! = -1) {System.out.print ((char) r); }} @Test public void client () lève une exception {socket socket = new socket ("127.0.0.1", 80); BufferedWriter Writer = new BufferedWriter (new OutputStreamWriter (socket.getOutputStream ())); writer.write ("get /servlet/test.html http / 1.1 / r / n"); writer.write ("hôte: 127.0.0.1/r/n"); writer.write ("Connexion: Keep-alive / r / n"); writer.write ("accepter: text / html, application / xhtml + xml, application / xml; q = 0,9, image / webp, * / *; q = 0,8 / r / n"); writer.write ("User-Agent: Mozilla / 5.0 (Windows NT 5.1) Applewebkit / 537.36 (KHTML, comme Gecko) Chrome / 31.0.1650.63 Safari / 537.36 / R / N"); writer.write ("Accept-Encoding: gzip, dégonfler, sdch / r / n"); writer.write ("Accept-Language: Zh-Cn, Zh; Q = 0,8 / R / N"); writer.write ("/ r / n"); écrivain.flush (); InputStream stream = socket.getInputStream (); int r = -1; while ((r = stream.read ())! = -1) {System.out.print ((char) r); }}}L'exécution du programme pour obtenir le serveur renvoie le contenu suivant:
HTTP / 1.1 200 OKSERVER: Apache-Coyote / 1.1ACcept-Ranges: ByteSetag: W / "129-1456125361109" Last-Modified: lun, 22 février 2016 07:16:01 GMTContent-Type: Text / Htmlcontent Length: 129date: Mon, 22 Feb 2016 08:08:32220 Gmt <! Doctype html> <html> <éad- head> <meta charset = "utf-8"> <ititle> test </title> </ head> <pody> Ceci est la page de test. </ Body> </html>
De même, analysons ce message de retour:
La première ligne se compose de trois parties, séparées par des espaces au milieu, la première partie est la version du protocole HTTP (HTTP / 1.1), la deuxième partie est le code d'état de réponse, et la troisième partie est la description de l'état de la réponse de la deuxième ligne à la septième ligne: la neuvième ligne de réponse est transmise entre le nom de la réponse et la valeur de la première ligne: nous pouvons obtenir la deuxième ligne: la deuxième ligne: le contenu suivante: Nous pouvons obtenir la deuxième ligne: la suivante: la première ligne: le contenu de la première ligne: dans la suite: la suite: la suivante ligne: la suite: la suivante: la première ligne: la suite: la suivante: la première ligne: NE AUTRE LIGNE. Conclusion: La première chose est la version du protocole HTTP Informations de demande, le code d'état de la réponse, et la description de l'état de la réponse, et les informations d'en-tête de réponse sont suivies de la rupture de la ligne / R / N, et les informations d'en-tête de réponse sont transmises par la rupture de la ligne / R / n, et les informations de réponse de la réponse sont suivis par les données de réponse. Il convient de noter qu'en plus de cette réponse, il existe en fait d'autres méthodes correspondantes, telles que Chunk, qui n'est pas discutée ici, et vous pouvez vérifier les informations pertinentes.
Jusqu'à présent, nous avons analysé le format de contenu de la demande du client et le format de contenu correspondant du serveur. Cet article se termine ici. J'espère que cela sera utile à l'apprentissage de tous.