Telah diketahui bahwa komunikasi antara server web dan klien menggunakan protokol HTTP. HTTP adalah standar untuk permintaan dan tanggapan klien dan server (TCP). Karena protokol HTTP didasarkan pada protokol TCP, saya akan menggunakan soket di java untuk menyelesaikan server web sederhana ini. Untuk informasi HTTP yang lebih rinci, Anda dapat berkonsultasi dengan informasi yang relevan untuk mempelajarinya.
Sebelum menulis server, mari kita lihat aturan komunikasi antara browser dan server.
Pertama -tama, kami menggunakan ServerSocket untuk mensimulasikan server, mengaksesnya melalui browser, dan melihat konten yang diminta oleh browser:
impor java.io.bufferedwriter; impor java.io.inputstream; impor java.io.outputStreamWriter; impor java.net.inetaddress; impor java.net.inetsocketaddress; impor java.net.serversocket; impor java.net.socket; Tes * * @Author JiANGGUJin * */kelas publik hqhttpprotocoltest {@test public void server () melempar Exception {serversocket serversocket = server baru (80); Soket soket = serversocket.accept (); InputStream stream = socket.getInputStream (); int r = -1; while ((r = stream.read ())! = -1) {System.out.print ((char) r); }}}Jalankan dengan junit dan akses melalui browser: http://127.0.0.1 , kita dapat melihat bahwa output konten permintaan browser pada konsol adalah sebagai berikut:
GET / HTTP/1.1Host: 127.0.0.1Connection: keep-aliveAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36accept-encoding: GZIP, mengempis, SDChaccept-bahasa: ZH-CN, ZH; q = 0.8
Untuk menganalisis konten permintaan dengan lebih baik, kami menulis halaman HTML untuk mengirimkan beberapa data dan melihat konten permintaan lagi:
<! Doctype html> <html> <head> <meta charset = "utf-8"> <itement> tes </iteme> </head> <bod body> <bentuk method = "post" action = "http://127.0.0.1?test=123"> <input type = "name" name = "name" " type = "Kirim"/> </form> </body> </html>
Masukkan Bob di kotak input, klik tombol untuk mengirimkan, dan amati output konsol:
POST/? TEST = 123 http/1.1host: 127.0.0.1koneksi: Keep-alivecontent-length: 8cache-control: Max-AGE = 0cepcept: Text/html, Application/XHTML+XML, Application/XML; q = 0.9, Image/Webp,*/ NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36Content-Type: application/x-www-form-urlencodedAccept-Encoding: gzip,deflate,sdchAccept-Language: zh-CN,zh;q=0.8name=bob
Mari kita analisis konten permintaan ini:
Baris pertama: terdiri dari tiga bagian, dipisahkan oleh spasi di tengah, bagian pertama adalah metode permintaan (get, post), bagian kedua adalah parameter jalur permintaan dan kueri, dan bagian ketiga adalah versi protokol HTTP (HTTP/1.1)
Baris 2 ke baris 10: Informasi header dari permintaan, nama dan nilai header permintaan disahkan: Pisahkan baris kesebelas: baris kosong 12th Line: Konten formulir yang dikirimkan, kita bisa mendapatkan kesimpulan berikut: Perilaku pertama dari informasi permintaan adalah metode permintaan, jalur permintaan, parameter kueri, dan versi HTTP Protocol. Setelah istirahat jalur /R /N, informasi header permintaan segera diikuti oleh istirahat jalur /R /N, informasi header permintaan diikuti oleh saluran kosong setelah informasi header permintaan selesai, dan data permintaan segera diikuti oleh saluran kosong. Perlu dicatat bahwa ini hanya disimulasikan. Adapun pengiriman file yang kompleks, dll., Ini tidak dibahas di sini, dan format konten permintaan sedikit berbeda.
Pada titik ini, kami sudah mengetahui konten yang diminta oleh klien. Mari kita lihat format data respons server setelah menerima permintaan. Kami membuat proyek web baru untuk menguji dan mengedit konten halaman HTML sebagai berikut:
<! Doctype html> <html> <head> <meta charset = "utf-8"> <itement> tes </iteme> </head> <body> Ini adalah halaman tes. </body> </html>
Mulai server, lalu tulis kode uji klien untuk mendapatkan data pengembalian server:
impor java.io.bufferedwriter; import java.io.inputstream; impor java.io.outputStreamWriter; import java.net.serversocket; import java. public void server () melempar Exception {ServerSocket ServerSocket = New ServerSocket (80); Soket soket = serversocket.accept (); InputStream stream = socket.getInputStream (); // bufferedInputStream inputStream = baru bufferedInputStream (stream); int r = -1; while ((r = stream.read ())! = -1) {System.out.print ((char) r); }} @Test public void client () melempar pengecualian {socket socket = soket baru ("127.0.0.1", 80); BufferedWriter Writer = BufferedWriter baru (outputStreamWriter baru (socket.getoutputStream ())); writer.write ("get /servlet/test.html http/1.1/r/n"); writer.write ("Host: 127.0.0.1/r/n"); writer.write ("Koneksi: Keep-Alive/R/N"); writer.write ("Accept: Text/HTML, Application/XHTML+XML, Application/XML; q = 0.9, Image/Webp,*/*; q = 0.8/r/n"); writer.write ("Agen-pengguna: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (Khtml, Like Gecko) Chrome/31.0.1650.63 Safari/537.36/R/N"); writer.write ("Accept-encoding: GZIP, Deflate, SDCH/R/N"); writer.write ("penerimaan-bahasa: zh-cn, zh; q = 0,8/r/n"); writer.write ("/r/n"); writer.flush (); InputStream stream = socket.getInputStream (); int r = -1; while ((r = stream.read ())! = -1) {System.out.print ((char) r); }}}Menjalankan program untuk mendapatkan server mengembalikan konten berikut:
HTTP/1.1 200 OKServer: Apache-Coyote/1.1Accept-Ranges: bytesETag: W/"129-1456125361109"Last-Modified: Mon, 22 Feb 2016 07:16:01 GMTContent-Type: text/htmlContent-Length: 129Date: Mon, 22 Feb 2016 08:08:32 GMT<!DOCTYPE html> <html> <head> <head> <meta charset = "utf-8"> <itement> tes </iteme> </head> <body> Ini adalah halaman tes. </body> </html>
Demikian pula, mari kita analisis pesan pengembalian ini:
Baris pertama terdiri dari tiga bagian, dipisahkan oleh spasi di tengah, bagian pertama adalah versi protokol HTTP (HTTP/1.1), bagian kedua adalah kode status respons, dan bagian ketiga adalah deskripsi status respons dari baris kedua, lini ketujuh, informasi respons di antara respons nama header respons dan nilai: memisahkan garis Eurthth: The NINTH SIMPLEON THE THE NINTH SOMPLETER THE NINTH AREKS TERTENTU AREKTIF THE OFER DARI TEPPLIKASI TERTINGKAN DAN NILAI: Pisahkan NINTH LINE: THE EIGHTH LINE NINTH NINTH NINth. Hal pertama adalah informasi permintaan versi protokol http, kode status respons, dan deskripsi status respons, dan informasi header respons diikuti oleh istirahat saluran /R /N, dan informasi header respons dilewati oleh /r /n line break, dan informasi header respons diikuti oleh saluran kosong setelah informasi header respons diselesaikan, dan data respons segera diikuti oleh data respons. Perlu dicatat bahwa selain respons ini, sebenarnya ada metode lain yang sesuai, seperti chunk, yang tidak dibahas di sini, dan Anda dapat memeriksa informasi yang relevan.
Sejauh ini, kami telah menganalisis format konten permintaan klien dan format konten yang sesuai dari server. Artikel ini berakhir di sini. Saya berharap ini akan membantu untuk pembelajaran semua orang.