Pengantar protokol HTTP pertama dengan menulis server Web Java paling sederhana

Saya pikir itu tidak akan berlebihan untuk mengatakan bahwa pengetahuan dan pemahaman tentang esensi protokol HTTP diperlukan bagi siapa saja yang telah memutuskan untuk secara serius terlibat dalam bidang pengembangan Web modern. Pengalaman pribadi saya menunjukkan bahwa pemahaman tidak datang dengan segera. Saya malu mengatakan bahwa ada saat-saat ketika kata GET dan POST mirip dengan mantra sihir untuk saya, dan saya bahkan tidak mencurigai keberadaan PUT, PATCH dan DELETE.

Beberapa bulan yang lalu, selain pengembangan itu sendiri, saya juga mulai mengajar, dan muncul pertanyaan tentang bagaimana lebih mudah dan lebih jelas untuk memberi tahu pengembang Java di masa depan tentang esensi protokol HTTP. Setelah beberapa hari ribut-ribut dan serangkaian usaha yang gagal untuk membuat presentasi, muncul ide, mengapa tidak menulis server HTTP yang paling sederhana di Jawa, karena tidak menjelaskan esensi protokol dengan implementasi yang paling sederhana tetapi bekerja.

Ternyata, ini sama sekali tidak sulit. Di bawah ini adalah kode yang cukup untuk interaksi yang benar dengan browser apa pun! Yang kita butuhkan hanyalah ServerSocket dan beberapa I / O standar.

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.nio.charset.StandardCharsets; public class HttpServer { public static void main(String[] args) { try (ServerSocket serverSocket = new ServerSocket(8080)) { System.out.println("Server started!"); while (true) { //   Socket socket = serverSocket.accept(); System.out.println("Client connected!"); //      //    try (BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8)); PrintWriter output = new PrintWriter(socket.getOutputStream())) { //     while (!input.ready()) ; //         System.out.println(); while (input.ready()) { System.out.println(input.readLine()); } //   output.println("HTTP/1.1 200 OK"); output.println("Content-Type: text/html; charset=utf-8"); output.println(); output.println("<p> !</p>"); output.flush(); //     try-with-resources , //         System.out.println("Client disconnected!"); } } } catch (IOException ex) { ex.printStackTrace(); } } } 

Coba jalankan kode ini. Perlu dicatat bahwa port yang dibuat ServerSocket harus bebas. Jika port yang ditentukan sibuk, Anda harus melepaskannya atau menggunakan port gratis lain.

Setelah menjalankan kode ini, buka jendela browser dan ketik bilah alamat http://localhost:8080/ . Jika semuanya berjalan dengan baik, maka di jendela browser kita akan melihat teks "Halo semua", dan di server log teks mirip dengan yang di bawah ini:

 Server started! Client connected! GET / HTTP/1.1 Host: localhost:8080 Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,he;q=0.6,de;q=0.5,cs;q=0.4 Cookie: _ga=GA1.1.1849608036.1549463927; portainer.pagination_containers=100; _gid=GA1.1.80775985.1550669456; If-Modified-Since: Sat, 05 Jan 2019 12:10:16 GMT Client disconnected! 

Setiap kali kita memasukkan sesuatu ke bilah alamat browser dan menekan Enter, tidak ada yang terjadi selain mengirim teks yang dimulai dengan kata GET dan diakhiri dengan umpan baris. Setelah kata GET, spasi mengikuti jalur ke dokumen yang diminta di server. Coba masukkan http://localhost:8080/something di browser dan lihat bagaimana teks permintaan dalam log berubah.

Di baris permintaan, mulai dari yang kedua disebut header dengan cara informasi tentang pengaturan klien yang dikirimkan ke server. Setiap baris header memiliki format [ ] : []; []; ... [] [ ] : []; []; ... [] [ ] : []; []; ... [] .

Setelah teks permintaan telah sepenuhnya dibaca oleh server, kami mengirimnya respons paling sederhana, strukturnya cukup sederhana dan mirip dengan struktur permintaan. Baris pertama berisi versi protokol HTTP dan 200 kode OK , yang akan memberi tahu browser bahwa permintaan berhasil diproses (semua orang tahu kode 404 lebih baik, bukan;)). Ini diikuti oleh hanya satu judul Jenis Konten di mana informasi tentang format dokumen yang ditransmisikan (teks / html) dan penyandiannya (charset = utf-8) ditransmisikan. Setelah header adalah umpan baris (persyaratan wajib dari protokol HTTP) dan teks aktual yang akan ditampilkan di browser.

Itu saja! Tentu saja, ini jauh dari semua yang perlu Anda ketahui tentang protokol HTTP dan prinsip-prinsip pengembangan server Web, tetapi saya tidak ingin menyulitkan contoh ini, karena tugas utamanya adalah untuk menunjukkan komunikasi paling sederhana melalui protokol HTTP. Dalam salah satu artikel saya berikutnya saya akan mencoba mengembangkan topik mempelajari protokol HTTP melalui implementasinya.

UPD Contoh yang jauh lebih maju dari server semacam itu dapat ditemukan di Bagaimana Tomcat Bekerja: Panduan untuk Mengembangkan Java Servlet Container Anda Sendiri oleh Paul Deck, Budi Kurniawan , Bab 1 - Server Web Sederhana .

UPD1. Webinar berdasarkan artikel ini www.youtube.com/watch?v=RBUFdFKg_rI

Source: https://habr.com/ru/post/id441150/


All Articles