[JAVA] Ich habe einen Öko-Server mit Scala gemacht

Ich habe gepostet, was ich als Schüler gemacht habe, also werde ich es auch hier schreiben!

Was ist ein Echoserver?

Als Antwort auf die vom Browser (Client) gesendete http-Anfrage wird der Inhalt der Anfrage so zurückgegeben, wie er in der http-Antwort enthalten ist! Das ist der Echoserver.

(Gibt normalerweise HTML-Dateien und Bilder hier zurück.)

Ziel ist es daher, eine Zeichenkette wie "GET / ~~" (← Request-Anweisung) im Browser anzuzeigen.

Der Umriss ist so

  1. Importieren Sie verwendbare Java-Pakete (Link unten)
  2. Generieren Sie einen Server-Socket
  3. Schreiben Sie den Code in die while-Anweisung, damit der Server-Socket weiterhin akzeptiert
  4. Erstellen Sie einen Eingabestream und lesen Sie die http-Anforderung
  5. Erstellen Sie einen Ausgabestream und senden Sie die http-Anforderungsanweisung zurück
  6. Schließen Sie die Steckdose

Einführung in den Implementierungscode

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----->")
       //Erstellen Sie einen Server-Socket und binden Sie die Portnummer
       val serverSocket = new ServerSocket(8000)
       println("Serving HTTP on localhost port 8000 ...")
        while (true) {
          //Der Server-Socket akzeptiert und wartet weiterhin
          val socket = serverSocket.accept()

         //input--HTTP-Anfrage lesen
         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 ist ein Zeilenumbruch
             case x                                   => readUntilEnd(is, x)
           }
         }
   
         //output--Senden Sie die http-Anfrage zurück
         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))
   
         //Steckdose schließen
         input.close()
          output.close()
        }
      serverSocket.close()
      }
    }
  }

Wenn ich eine Methode finden könnte, die das tut, was ich von hier aus tun wollte, hätte ich das Gefühl, dass sie kurz vor dem Abschluss steht. Und wenn Sie das Konzept dieser Kommunikation, die Bedeutung des Sockets und dessen Funktionsweise verstehen, können Sie den Code lesen.

Eingabe Über den Eingabestream

text val input = socket.getInputStream

Wenn Sie einen Eingabestream mit erstellen, werden Informationen (http-Anforderung) durch den Tunnel gesendet.

Ich habe eine readUntilEnd-Methode erstellt, die sie zeichenweise liest und schließlich als einzelne Zeichenfolge vom Typ String zurückgibt.

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 ist ein Zeilenumbruch case x => readUntilEnd(is, x) } }

Bei der Musterübereinstimmung wird hier Folgendes ausgeführt: Wenn am Ende der http-Anforderungsanweisung zwei Zeilenumbrüche gesendet werden, handelt es sich um eine bedingte Verzweigung, die die Wiederherstellung stoppt.

Da jedes Zeichen als Byte-Typ in die Liste aufgenommen wird, drehen Sie es am Ende um (umgekehrt), um es zu einem Zeichen zu machen, und drücken Sie es mit mkString in eine Zeichenfolge aus der Liste.

Ausgabe Über den Ausgabestream

Erstellen Sie auf ähnliche Weise einen Ausgabestream und übergeben Sie die Informationen gemäß der http-Antwortvorlage. Sie müssen hier nicht alle Überschriften haben, sondern nur die, die Sie benötigen.

Fügen Sie alle erforderlichen Elemente im Antworttext nacheinander in Variablen vom Typ String ein, konvertieren Sie sie sofort mit responseText in den Typ Byte und wenden Sie die Schreibmethode auf den Socket an. Diese wird dann als http-Antwort gesendet!

Schließen Sie zum Schluss die Steckdose.

Es fühlt sich ziemlich mächtig an, aber der http-Server macht das.

Ich denke noch einmal, dass nicht alles sofort magisch manipuliert wird. Lol

Recommended Posts

Ich habe einen Öko-Server mit Scala gemacht
Ich habe eine Android-App erstellt, die mit HTTP abgerufen wird
Ich habe die Serverseite des Online-Kartenspiels gemacht made
Hat die Serverseite des Online-Kartenspiels gemacht ⑤
Ich habe die Serverseite des Online-Kartenspiels gemacht made
Ich möchte eine mit Rails 6 erstellte App an GitHub senden
Ich habe einen Adapter für den Kommunikationsunterricht mit Retrofit2 + Rx2 erstellt
Ich habe die Serverseite des Online-Kartenspiels gemacht made
Ich habe die Serverseite des Online-Kartenspiels gemacht made
Ich habe die Serverseite des Online-Kartenspiels gemacht made
Ich habe eine Anmerkung in Java gemacht.
Führen Sie in Java8 geschriebene Anwendungen in Java6 aus
Dummer Fehler beim Ausführen des Nginx-Servers in Docker Compose
Ich habe mit Ruby einen riskanten Würfel gemacht
Ich habe eine Janken App mit Kotlin gemacht
Ich habe eine Janken App mit Android gemacht
Ich habe StringUtils.isBlank gemacht
04. Ich habe mit SpringBoot + Thymeleaf ein Frontend gemacht
Ich habe Mosaikkunst mit Pokemon-Bildern gemacht
Ich habe selbst eine App gemacht! (Leseverwaltungs-App)
Ich habe mit Ruby einen Blackjack gemacht (ich habe versucht, Minitest zu verwenden)
Ich habe eine Android-App für den MiRm-Dienst erstellt
Ich habe einen API-Client für Nature Remo erstellt
Ich habe einen LINE Bot mit Rails + Heroku gemacht
Ich habe Scala berührt
Ich habe mit Ruby On Rails ein Portfolio erstellt
Versuchen Sie, eine mit Quarkus erstellte App auf Heroku auszuführen
Erstellen Sie einen HTTPS-Dateiserver für die Entwicklung mit dem Ring-Jetty-Adapter
Wie kann ich ein Array effizient füllen?
[Ruby] Ich habe einen Crawler mit Anemone und Nokogiri gemacht.
Ich habe im Frühjahr einen Restful-Server und -Client erstellt.
Beim Verschlüsseln mit Node + Docker wurde eine Fehlermeldung angezeigt
Ich habe mit Spring Framework eine API-Domain erstellt. Teil 1
Ich habe Scala ~ [Klasse] ~ berührt
Ich habe versucht, einen API-Server mit Go (Echo) x MySQL x Docker x Clean Architecture zu erstellen
Ich habe Scala ~ [Objekt] ~ berührt
Ich habe Scala ~ [Trate] ~ berührt
Ich habe eine Entwicklungsumgebung mit Rails6 + Docker + PostgreSQL + Materialise erstellt.
Parkett-Tools gibt java.lang.ExceptionInInitializerError, also habe ich es mit java8 funktionieren lassen
Ich habe ein Plug-In erstellt, das Jextract mit Gradle-Aufgaben ausführt
Ich habe meinen eigenen mit Ruby erstellten Blackjack für mein Portfolio aktualisiert
Ich habe einen MOD erstellt, der sofort ein Fahrzeug mit Minecraft anruft
Ich habe eine InvalidUseOfMatchersException erhalten, wenn ich eine in JUnits Mock verwende
Ich habe versucht, den Chat mit dem Minecraft-Server mit der Discord-API zu verknüpfen
Ich möchte manuell eine Autorisierungs-E-Mail mit Devise senden