Ich habe gepostet, was ich als Schüler gemacht habe, also werde ich es auch hier schreiben!
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.
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.
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.
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