This article is the 25th day article of Recruit Lifestyle Advent Calendar 2018.
This is @bya from the team CET.
Isn't the first step in learning a new language, Hello World? In this article, I would like to create a Hello World web server in several programming languages, rather than just outputting Hello World. Use standard libraries whenever possible, without using the web server framework for each language.
Ah, today is December 25th Christmas Day, so instead of Hello World, the messageMerry Christmas!Is displayed.
Also, I find it awkward to install each language on my local machine, so I use Docker Image to run it on the container.
Run the following command in the director with the Dockerfile and source code.
docker build --tag server-xmas:latest . && docker run --rm -p 8080:8080 server-xmas:latest
When I open it on localhost: 8080 (http: // localhost: 8080) on the browser, I get the message Merry Christmas!.
Then, please compare the ease of writing in each language.
Everyone, Merry Christmas !!!
Go
Place the source code and Dockerfile as shown below and execute the docker command above.
├── Dockerfile
└── xmas
└── main.go
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
It is an implementation of python3. Place the source code and Dockerfile as shown below and execute the docker command above.
.
├── Dockerfile
├── main.py
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
Speaking of java web server, I think that Spring is used, but since it only displays a message, it is created only with a standard library.
Place the source code and Dockerfile as shown below and execute the docker command above.
.
├── Dockerfile
├── main.java
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
I can't write it with raw Javascript, so I'll write it with nodejs!
Place the source code and Dockerfile as shown below and execute the docker command above.
.
├── Dockerfile
├── main.js
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
Place the source code and Dockerfile as shown below and execute the docker command above.
.
├── Dockerfile
├── main.rb
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
How about comparing the above? It would be great if you could see the goodness of each.
In the next article, I'll also create a Hello World! Web server using the main frameworks of each language.
The source code is also posted on Github.
Recommended Posts