[PYTHON] Frohe Weihnachten Webserver

Dieser Artikel ist der Artikel zum 25. Tag von Recruit Lifestyle Adventskalender 2018.

Dies ist @bya von einem Team namens CET.

Einführung

Ist das nicht der erste Schritt beim Erlernen einer neuen Sprache, "Hallo Welt"? In diesem Artikel möchte ich einen "Hello World" -Webserver in mehreren Programmiersprachen erstellen, anstatt nur "Hello World" auszugeben. Verwenden Sie Standardbibliotheken so oft wie möglich, ohne das Webserver-Framework für jede Sprache zu verwenden.

Ah, heute ist der 25. Dezember, also wird anstelle von "Hallo Welt" die Meldung "Frohe Weihnachten!" Angezeigt.

Außerdem finde ich es umständlich, jede Sprache auf meinem lokalen Computer zu installieren, sodass ich Docker Image verwende, um sie auf dem Container auszuführen.

Führen Sie den folgenden Befehl im Director mit der Docker-Datei und dem Quellcode aus.

docker build --tag server-xmas:latest . && docker run --rm -p 8080:8080 server-xmas:latest

Wenn ich es im Browser auf [localhost: 8080](http: // localhost: 8080) öffne, erhalte ich die Meldung "Frohe Weihnachten!".

Vergleichen Sie dann bitte die Leichtigkeit des Schreibens in jeder Sprache.

Alle frohe Weihnachten !!!

Go

Platzieren Sie den Quellcode und die Docker-Datei wie unten gezeigt und führen Sie den Docker-Befehl oben aus.

├── Dockerfile
└── xmas
    └── main.go

Quellcode

main.go:

package main

import (
"fmt"
"log"
"net/http"
)

var greeting  = "Merry Christmas! (go)"

func myHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprint(w, greeting)
}

func main() {
	http.HandleFunc("/", myHandler)
	log.Fatal(http.ListenAndServe(":8080", nil))
}

Dockerfile

FROM golang:1.8-alpine

COPY xmas /go/src/xmas
RUN go install xmas

FROM alpine:latest
COPY --from=0 /go/bin/xmas .

EXPOSE 8080

CMD ./xmas

Python

Eine Implementierung von Python3. Platzieren Sie den Quellcode und die Docker-Datei wie unten gezeigt und führen Sie den Docker-Befehl oben aus.

.
├── Dockerfile
├── main.py

Quellcode

main.py:

import http.server
import socketserver

GREETING = "Merry Christmas! (python3)"

class MyHandler(http.server.SimpleHTTPRequestHandler):
	def do_GET(self):
		self.send_response(200)
		self.end_headers()
		self.wfile.write(bytes(GREETING, "utf-8"))

with socketserver.TCPServer(("", 8080), MyHandler) as httpd:
	print("Server Running...")
	httpd.serve_forever()

Dockerfile

FROM python:3.7-alpine

ENV DIR=/work

COPY main.py ${DIR}/main.py

WORKDIR ${DIR}

EXPOSE 8080

CMD python main.py

Java

Apropos Java-Webserver: Ich denke, dass "Spring" verwendet wird, aber da nur eine Nachricht angezeigt wird, wird es nur mit einer Standardbibliothek erstellt.

Platzieren Sie den Quellcode und die Docker-Datei wie unten gezeigt und führen Sie den Docker-Befehl oben aus.

.
├── Dockerfile
├── main.java

Quellcode

main.java:

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;

class Main {
    static final String GREETING = "Merry Christmas! (java)";

    public static void main (String args[]) throws IOException {
        HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
        server.createContext("/", new MyHandler());
        server.setExecutor(null);
        server.start();
    }

    static class MyHandler implements HttpHandler {
        public void handle(HttpExchange t) throws IOException {
            System.out.println("Server running...");
            t.sendResponseHeaders(200, GREETING.length());
            OutputStream outputStream = t.getResponseBody();
            outputStream.write(GREETING.getBytes());
            outputStream.close();
        }
    }
}

Dockerfile

FROM openjdk:8-jdk-alpine3.8

ENV DIR=/work

COPY main.java ${DIR}/main.java

WORKDIR ${DIR}

RUN javac main.java

EXPOSE 8080

CMD java Main

NodeJs

Ich kann es nicht mit rohem Javascript schreiben, also schreibe ich es mit nodejs!

Platzieren Sie den Quellcode und die Docker-Datei wie unten gezeigt und führen Sie den Docker-Befehl oben aus.

.
├── Dockerfile
├── main.js

Quellcode

main.js:

const http = require('http');

const port = 8080;

const server = http.createServer((req, res) => {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Merry Christmas! (nodejs)\n');
});

server.listen(port, () => {
    console.log(`Server running at http://localhost:${port}/`);
});

Dockerfile

FROM node:8.14-alpine

ENV DIR=/work

COPY main.js ${DIR}/main.js

WORKDIR ${DIR}

EXPOSE 8080

CMD node main.js

Ruby

Platzieren Sie den Quellcode und die Docker-Datei wie unten gezeigt und führen Sie den Docker-Befehl oben aus.

.
├── Dockerfile
├── main.rb

Quellcode

main.rb:

const http = require('http');
require 'socket'

message = "Merry Christmas! (ruby)"

server = TCPServer.new 8080
loop do
  client = server.accept

  client.puts "HTTP/1.0 200 OK"
  client.puts "Content-Type: text/plain"
  client.puts
  client.puts message
  client.close
end

Dockerfile

FROM ruby:2.5-alpine

ENV DIR=/work

COPY main.rb ${DIR}/main.rb

WORKDIR ${DIR}

EXPOSE 8080

CMD ruby main.rb

abschließend

Wie wäre es mit dem Vergleich der oben genannten? Es wäre großartig, wenn Sie die Güte eines jeden sehen könnten.

Im nächsten Artikel werde ich auch einen "Hello World!" - Webserver erstellen, der die wichtigsten Frameworks jeder Sprache verwendet.

Der Quellcode ist auch auf Github veröffentlicht.

Referenz

Recommended Posts

Frohe Weihnachten Webserver
Kommentar zum Aufbau des Webservers
One Liner Webserver
Ubuntu (18.04.3) Webserverkonstruktion
Aufbau eines Linux-Webservers (Ubuntu & Apache)
Web 3-Layer-Struktur ~ Webserver / AP-Server / DB-Server ~
Schnellste und stärkste Webserver-Architektur
Starten Sie den Webserver im aktuellen Verzeichnis
Portweiterleitung eines Webservers mithilfe von iptables
Webserver zum Testen des Browsers mit Mocha
Veröffentlichen Sie das aktuelle Verzeichnis auf dem Webserver