[PYTHON] Serveur web joyeux Noël

Cet article est l'article du 25ème jour du Calendrier de l'Avent Recruit Lifestyle 2018.

C'est @bya d'une équipe appelée CET.

introduction

La première étape de l'apprentissage d'une nouvelle langue n'est-elle pas «Hello World»? Dans cet article, je voudrais créer un serveur Web «Hello World» dans plusieurs langages de programmation, plutôt que de simplement afficher «Hello World». Utilisez autant que possible les bibliothèques standard sans utiliser le framework de serveur Web pour chaque langue.

Ah, aujourd'hui c'est le 25 décembre Noël, donc au lieu de «Hello World», le message «Joyeux Noël!» Est affiché.

De plus, je trouve difficile d'installer chaque langue sur ma machine locale, donc j'utilise Docker Image pour l'exécuter sur le conteneur.

Exécutez la commande suivante dans le directeur avec le Dockerfile et le code source.

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

Quand je l'ouvre sur le navigateur vers [localhost: 8080](http: // localhost: 8080), je reçois le message «Joyeux Noël!».

Ensuite, comparez la facilité d'écriture dans chaque langue.

Tout le monde, joyeux Noël !!!

Go

Placez le code source et Dockerfile comme indiqué ci-dessous et exécutez la commande docker ci-dessus.

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

Code source

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

Une implémentation de python3. Placez le code source et Dockerfile comme indiqué ci-dessous et exécutez la commande docker ci-dessus.

.
├── Dockerfile
├── main.py

Code source

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

En parlant de serveur web java, je pense que Spring est utilisé, mais comme il n'affiche qu'un message, il est créé uniquement avec une bibliothèque standard.

Placez le code source et Dockerfile comme indiqué ci-dessous et exécutez la commande docker ci-dessus.

.
├── Dockerfile
├── main.java

Code source

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

Je ne peux pas l'écrire avec du Javascript brut, donc je vais l'écrire avec nodejs!

Placez le code source et Dockerfile comme indiqué ci-dessous et exécutez la commande docker ci-dessus.

.
├── Dockerfile
├── main.js

Code source

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

Placez le code source et Dockerfile comme indiqué ci-dessous et exécutez la commande docker ci-dessus.

.
├── Dockerfile
├── main.rb

Code source

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

en conclusion

Que diriez-vous de comparer ce qui précède? Ce serait formidable si vous pouviez voir la bonté de chacun.

Dans le prochain article, je vais également créer un serveur Web «Hello World!» En utilisant les principaux frameworks de chaque langue.

Le code source est également affiché sur Github.

référence

Recommended Posts

Serveur web joyeux Noël
Commentaire sur la construction du serveur Web
Serveur Web One Liner
Construction du serveur Web Ubuntu (18.04.3)
Construction de serveur Web Linux (Ubuntu et Apache)
Structure Web à 3 couches ~ Serveur Web / serveur AP / serveur de base de données ~
Architecture de serveur Web la plus rapide et la plus solide
Démarrez le serveur Web dans le répertoire actuel
Redirection de port d'un serveur Web à l'aide d'iptables
Serveur Web pour tester le navigateur avec Mocha
Publier le répertoire actuel sur le serveur Web