[JAVA] J'ai créé un serveur écologique avec scala

J'ai posté ce que j'ai fait pendant que j'étais disciple, je vais donc l'écrire ici aussi!

Qu'est-ce qu'un serveur d'écho?

En réponse à la requête http envoyée par le navigateur (client), le contenu de la requête est renvoyé tel qu'il est dans la réponse http! C'est le serveur d'écho.

(Renvoie généralement les fichiers html et les images ici)

Par conséquent, le but est d'afficher une chaîne de caractères telle que "GET / ~~" (instruction de requête ←) sur le navigateur.

Le contour est comme ça

  1. Importez les packages java utilisables (lien ci-dessous)
  2. Générez un socket serveur
  3. Écrivez le code dans l'instruction while afin que le socket serveur continue d'accepter
  4. Créez un flux d'entrée et lisez la requête http
  5. Créez un flux de sortie et renvoyez l'instruction de requête http
  6. Fermez la prise

Introduction au code d'implémentation

httpserver.


 import java.net.ServerSocket
 import java.net.Socket
 import java.io
 import java.io.InputStream
 import java.nio.charset.StandardCharsets
  
  object HTTPServer {
    def main(args: Array[String]): Unit = {
       println("Hello HTTP Server!Strat----->")
       //Créez un socket serveur et liez le numéro de port
       val serverSocket = new ServerSocket(8000)
       println("Serving HTTP on localhost port 8000 ...")
        while (true) {
          //Le socket du serveur continue d'accepter et d'attendre
          val socket = serverSocket.accept()

         //input--Lire la requête http
         val input = socket.getInputStream
         def readUntilEnd(is: InputStream, acc: List[Int] = Nil):String ={
           is.read :: acc match {
             case x if x.take(4) == List(10,13,10,13) => x.reverse.map(_.toChar).mkString //10,13 est un saut de ligne
             case x                                   => readUntilEnd(is, x)
           }
         }
   
         //output--Renvoyer la demande http
         val output = socket.getOutputStream
         val CRLF = "\r\n"
         val responseBody = readUntilEnd(input)
         val responseBodySize = responseBody.length
         val responseText = "HTTP/1.1 200 OK" + CRLF +
                            "Content-Length: " + responseBodySize + CRLF +
                            "Content-Type: text/plain" + CRLF +
                            CRLF +
                            responseBody
         output.write(responseText.getBytes(StandardCharsets.UTF_8))
   
         //Fermer la prise
         input.close()
          output.close()
        }
      serverSocket.close()
      }
    }
  }

Fondamentalement, si je pouvais trouver une méthode qui ferait ce que je voulais faire d'ici, je sentais qu'elle serait en voie d'achèvement. Et si vous comprenez le concept de cette communication, la signification de la prise et son fonctionnement, vous pouvez lire le code.

input À propos du flux d'entrée

text val input = socket.getInputStream

Lorsque vous créez un flux d'entrée avec, les informations (requête http) passent par le tunnel.

J'ai créé une méthode readUntilEnd qui la lit caractère par caractère et la renvoie finalement sous la forme d'une chaîne de caractères unique de type String.

text def readUntilEnd(is: InputStream, acc: List[Int] = Nil):String ={ is.read :: acc match { case x if x.take (4) == List (10,13,10,13) => x.reverse.map (_.toChar) .mkString // 10,13 est un saut de ligne case x => readUntilEnd(is, x) } }

Ce qui est fait dans la correspondance de modèle ici, c'est que si deux sauts de ligne sont envoyés à la fin de l'instruction de requête http, c'est une branche conditionnelle qui arrête la récupération.

Étant donné que chaque caractère entre dans la liste en tant que type Byte, à la fin, retournez-le (inverser) pour en faire un caractère et utilisez mkString pour le presser en une chaîne de caractères de la liste.

sortie À propos du flux de sortie

De même, créez un flux de sortie et transmettez les informations selon le modèle de réponse http. Vous n'êtes pas obligé d'avoir tous les en-têtes ici, juste ceux dont vous avez besoin.

Mettez les éléments nécessaires dans le corps de la réponse en variables une par une dans le type String, convertissez-les en type Byte à la fois avec responseText, et appliquez la méthode d'écriture au socket, et elle sera envoyée comme réponse http!

Fermez enfin la prise.

Cela semble assez puissant, mais le serveur http le fait.

Je pense encore une fois que tout n'est pas manipulé par magie en un instant. Lol

Recommended Posts

J'ai créé un serveur écologique avec scala
J'ai créé une application Android qui GET avec HTTP
J'ai créé le côté serveur du jeu de cartes en ligne ①
Fait le côté serveur du jeu de cartes en ligne ⑤
J'ai créé le côté serveur du jeu de cartes en ligne ③
Je veux pousser une application créée avec Rails 6 vers GitHub
J'ai fait un adaptateur pour la classe de communication avec Retrofit2 + Rx2
J'ai créé le côté serveur du jeu de cartes en ligne ⑥
J'ai créé le côté serveur du jeu de cartes en ligne ④
J'ai créé le côté serveur du jeu de cartes en ligne ②
J'ai fait une annotation en Java.
Exécuter des applications écrites en Java8 en Java6
Erreur stupide commise lors de l'exécution du serveur nginx dans Docker Compose
J'ai fait une mort risquée avec Ruby
J'ai créé une application Janken avec kotlin
J'ai créé une application Janken avec Android
J'ai créé StringUtils.isBlank
04. J'ai fait un frontal avec SpringBoot + Thymeleaf
J'ai fait de l'art de la mosaïque avec des images Pokemon
J'ai créé une application par moi-même! (Application de gestion de la lecture)
J'ai fait un blackjack avec Ruby (j'ai essayé d'utiliser minitest)
J'ai créé une application Android pour le service MiRm
J'ai créé un client API pour Nature Remo
J'ai créé un robot LINE avec Rails + heroku
J'ai touché Scala
J'ai fait un portfolio avec Ruby On Rails
Essayez d'exécuter une application créée avec Quarkus sur Heroku
Créez un serveur de fichiers HTTPS pour le développement avec ring-jetty-adapter
Comment puis-je remplir efficacement un tableau?
[Ruby] J'ai fait un robot avec de l'anémone et du nokogiri.
J'ai créé un serveur et un client Restful au printemps.
Quand je bcrypt avec node + docker, j'ai une erreur
J'ai créé un domaine api avec Spring Framework. Partie 1
J'ai touché Scala ~ [Classe] ~
J'ai essayé de créer un serveur API avec Go (Echo) x MySQL x Docker x Clean Architecture
J'ai touché Scala ~ [Objet] ~
J'ai touché Scala ~ [Trate] ~
J'ai créé un environnement de développement avec rails6 + docker + postgreSQL + Materialise.
Parquet-tools donne java.lang.ExceptionInInitializerError, donc je l'ai fait fonctionner avec java8
J'ai créé un plug-in qui exécute jextract avec des tâches Gradle
J'ai mis à jour mon propre blackjack réalisé avec Ruby pour mon portfolio
J'ai créé un MOD qui appelle instantanément un véhicule avec Minecraft
J'ai une exception InvalidUseOfMatchersException lors de l'utilisation de l'un dans le simulateur de JUnit
J'ai essayé de lier le chat avec le serveur de Minecraft avec l'API Discord
Je souhaite envoyer manuellement un e-mail d'autorisation avec Devise