Une simple implémentation de serveur Web Java, relativement simple, basée sur java.net.socket et java.net.serversocket;
1. Étapes d'exécution du programme
1. Créez un objet SERVERSOCKET;
2. Appelez la méthode Accept de l'objet Serversocket et attendez la connexion. Si la connexion est réussie, un objet Socket sera retourné, sinon il sera bloqué et attendu;
3. Obtenez les flux d'octets InputStream et OutputStream à partir de l'objet Socket, et ces deux flux correspondent respectivement à la demande de demande et à la réponse de réponse;
4. Traitez la demande: Lisez les informations de flux d'octets InputStream, convertissez-la en un formulaire de chaîne et analysez-la. L'analyse ici est relativement simple, et il n'obtient que les informations URI (identifiant de ressources uniformes);
5. Réponse de traitement: en fonction des informations URI analysées, recherchez le fichier de ressources de ressources demandé dans le répertoire Web_root, lisez le fichier de ressources et écrivez-le dans le flux de byte OutputStream;
6. Fermez l'objet de socket;
7. Passez à l'étape 2 et continuez à attendre la demande de connexion;
2. Implémentation du code
Implémentation du serveur:
package ex01.pyrmont; import java.net.socket; import java.net.serversocket; import java.net.inetaddress; import java.io.inputStream; import java.io.outputstream; D'autres fichiers sont stockés. Le web_root ici est le répertoire webroot dans le répertoire de travail * / public static final String web_root = System.getProperty ("user.dir") + file.separator + "webroot"; // Close Service Commande de service privé statique final string shutdown_command = "/ shutdown"; public static void main (String [] args) {httpServer server = new httpServer (); // attendez la demande de connexion Server.Await (); } public void Await () {Serversocket Serversocket = null; int port = 8080; try {// server socket objet SERVERSOCKET = new serversocket (port, 1, inetAddress.getByName ("127.0.0.1")); } catch (ioException e) {e.printStackTrace (); System.exit (1); } // boucle pour attendre une demande tandis que (true) {socket socket = null; InputStream input = null; OutputStream output = null; essayez {// en attente de la connexion, une fois la connexion réussie, renvoyez un socket objet socket = serversocket.accept (); input = socket.getInputStream (); output = socket.getOutputStream (); // Créer un objet de demande et une demande d'analyse de demande = nouvelle demande (entrée); request.parse (); // Vérifiez s'il s'agit d'une commande de service fermée if (request.geturi (). Equals (shutdown_command)) {break; } // Créer la réponse de l'objet Response = nouvelle réponse (sortie); Response.SetRequest (demande); Response.SendStaticResource (); // Fermer Socket Object Socket.Close (); } catch (exception e) {e.printStackTrace (); continuer; }}}}Classe de demande:
package ex01.pyrmont; import java.io.inputStream; import java.io.ioException; public class demande {private inputStream input; URI de chaîne privée; Demande publique (InputStream Input) {this.input = input; } // Lisez les informations de la demande de l'inputStream et obtenez la valeur URI de la demande publique void parse () {stringBuffer request = new StringBuffer (2048); int i; octet [] tampon = nouveau octet [2048]; essayez {i = input.read (tampon); } catch (ioException e) {e.printStackTrace (); i = -1; } pour (int j = 0; j <i; j ++) {request.append (((char) buffer [j]); } System.out.print (request.toString ()); uri = paseuri (request.toString ()); } / ** * * Le formulaire de requestString est le suivant: * get /index.html http / 1.1 * hôte: localhost: 8080 * Connexion: keep-alive * cache-control: max-age = 0 * ... * Le but de cette fonction est pour obtenir /index.html string * / private String Parceuri (String requestString) {int index1, index2; index1 = requestString.Indexof (''); if (index1! = -1) {index2 = requestString.Indexof ('', index1 + 1); if (index2> index1) return requestString.substring (index1 + 1, index2); } return null; } public String getUri () {return uri; }} Classe de réponse:
Package Ex01.pyrmont; Importer java.io.outputStream; Importer java.io.ioException; Importer java.io.fileInputStream; Importer java.io.file; / * Http Response = Status-Line * ((General-Header | Response-Header | Entity-Header) Crlf-COD-COD-COD-COD-COD-CODE [Message-Body] Status-Line = HETTP- Version Crlf-COD-COD-COD-CODE [Message-Body] Statut-Line = HETTP-Version Crlf-COD-COD-COD-CODE [Message-Body] Statut-Line = HETTP- Version Crlf-COD-COD-COD-CODE-CODU Response de la phrase de raisons-phrase * / classe publique {private static final int buffer_size = 1024; Demande de demande; OutputStream output; Réponse publique (OutputStream Output) {this.Output = output; } public void setRequest (request request) {this.request = request; } public void SendStaticResource () lève ioException {byte [] bytes = new Byte [buffer_size]; FileInputStream fis = null; Essayez {// Écrivez le fichier Web dans le fichier de flux de byte de sortie de sortie = new File (httpServer.web_root, request.geturi ()); if (file.exists ()) {fis = new FileInputStream (file); int ch = fis.read (octets, 0, tampon_size); while (ch! = -1) {output.write (octets, 0, ch); ch = fis.read (octets, 0, buffer_size); }} else {// Fichier non trouvé String errorMessage = "HTTP / 1.1 404 Fichier non trouvé / r / n" + "Content-Type: Text / html / r / n" + "Content-Length: 23 / r / n" + "/ r / n" + "<h1> fichier non trouvé </ h1>"; output.write (errorMessage.getBytes ()); }} catch (exception e) {// lancé si vous ne pouvez pas instancier un fichier objet System.out.println (e.toString ()); } enfin {if (fis! = null) fis.close (); }}} 3. Test de résultats
Accédez aux fichiers de ressources existants (notez qu'ils sont stockés dans le dossier webroot dans le répertoire du projet):
Accéder aux fichiers de ressources inexistants:
Fermez le serveur:
Référence: "Analyse approfondie de Tomcat"
@author un codeur de vent
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.