1. Pertama, mari kita lihat struktur pesan http.
1. Minta pesan
Pesan permintaan HTTP terdiri dari empat bagian: baris permintaan, header permintaan, baris kosong, dan data permintaan.
(1) Jalur permintaan
Baris permintaan terdiri dari tiga bidang: bidang metode permintaan, bidang URL, dan bidang versi protokol HTTP, yang dipisahkan oleh spasi. Misalnya, DAPATKAN /index.html HTTP/1.1.
Metode permintaan protokol HTTP termasuk GET, POST, HEAD, PUT, DELETE, OPTIONS, TRACE, dan CONNECT. Di sini kami memperkenalkan metode GET dan metode POST yang paling umum digunakan.
GET: Metode GET digunakan ketika klien ingin membaca dokumen dari server. Metode GET mengharuskan server untuk meletakkan sumber daya yang terletak berdasarkan URL di bagian data pesan respons dan mengirimkannya kembali ke klien. Saat menggunakan metode GET, parameter permintaan dan nilai terkait ditambahkan ke URL. Tanda tanya ("?") digunakan untuk mewakili akhir URL dan awal parameter permintaan parameternya terbatas. Misalnya, /index.jsp?id=100&op=bind.
POST: Metode POST dapat digunakan ketika klien memberikan banyak informasi ke server. Metode POST merangkum parameter permintaan dalam data permintaan HTTP, muncul dalam bentuk nama/nilai, dan dapat mengirimkan data dalam jumlah besar.
(2) Tajuk permintaan
Header permintaan terdiri dari pasangan kata kunci/nilai, satu pasang per baris, dan kata kunci serta nilai dipisahkan dengan titik dua bahasa Inggris ":". Header permintaan menginformasikan server tentang permintaan klien. Header permintaan yang umum adalah:
Agen-Pengguna: Jenis browser yang menghasilkan permintaan.
Terima: Daftar tipe konten yang dikenali oleh klien.
Host: Nama host yang diminta, memungkinkan beberapa nama domain berada di alamat IP yang sama, yaitu host virtual.
(3) Baris kosong
Header permintaan terakhir diikuti dengan baris kosong, karakter pengangkutan kembali dan umpan baris dikirim untuk memberi tahu server bahwa tidak ada lagi header permintaan yang diikuti.
(4) Minta data
Data permintaan tidak digunakan dalam metode GET, tetapi dalam metode POST. Metode POST cocok untuk situasi di mana pelanggan diharuskan mengisi formulir. Header permintaan yang paling umum digunakan terkait dengan data permintaan adalah Tipe Konten dan Panjang Konten.
2. Pesan tanggapan
Format pesan tanggapan umumnya mirip dengan pesan permintaan, hanya saja baris pertama berbeda. Pembaca dapat menemukan pengenalan aspek ini di Internet dan tidak akan membahas detailnya di sini.
2. Implementasi program
Langkah-langkah untuk melaksanakan program tersebut adalah sebagai berikut:
1. Menerima permintaan dari browser klien;
2. Buat thread baru untuk menangani permintaan tersebut;
3. Membaca data pesan, menentukan apakah pesan tersebut benar, dan menganalisis isi pesan;
4. Buat pesan respons dan kirimkan ke klien;
5. Akhiri thread pemrosesan dan proses permintaan pelanggan lainnya;
Kode programnya adalah sebagai berikut:
lihat salinan biasa ke cetak papan klip?
impor java.net.*;
import java.io.*;
import java.util.*;
import java.lang.*;
Server Web kelas publik {
public static void main(String [] args){
pelabuhan int;
ServerSocket server_socket;
mencoba{
port=Bilangan Bulat.parseInt(args[0]);
}
tangkapan (Pengecualian e){
pelabuhan=8080;
}
mencoba{
server_socket=ServerSocket baru(pelabuhan);
System.out.println("WebServer berjalan pada port"+server_socket.getLocalPort());
sementara(benar){
Soket soket=server_socket.accept();
System.out.println("Koneksi baru diterima"+socket.getInetAddress()+":"+socket.getPort());
//Buat thread untuk permintaan spesifik untuk menangani permintaan tersebut
mencoba{
httpRequestHandler request=httpRequestHandler(soket) baru;
Thread thread = Thread baru (permintaan);
thread.mulai();
}
tangkapan(Pengecualian e){
Sistem.keluar.println(e);
}
}
}
tangkapan(IOException e){
Sistem.keluar.println(e);
}
}
}
//Kelas thread untuk memproses permintaan
kelas httpRequestHandler mengimplementasikan Runnable{
String statis akhir CRLF="rn";
soket soket;
Masukan aliran masukan;
Keluaran aliran keluaran;
BufferedReader br;
//Tentukan apakah jenis file yang diminta sudah benar
tipe file boolean=benar;
//Parameter inisialisasi
publik httpRequestHandler(Soket soket) memunculkan Pengecualian{
this.socket=soket;
this.input=socket.getInputStream();
this.output=socket.getOutputStream();
this.br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
//Mulai threadnya
menjalankan kekosongan publik(){
mencoba{
prosesPermintaan();
}
tangkapan(Pengecualian e){
Sistem.keluar.println(e);
}
}
//Fungsi inti untuk memproses permintaan
private void processRequest() memunculkan Pengecualian{
sementara(benar){
String headerLine=br.readLine();
System.out.println("permintaan klien adalah"+headerLine);
if(headerLine.equals(CRLF)||headerLine.equals(""))
merusak;
StringTokenizer s=StringTokenizer baru(headerLine);
String suhu=s.nextToken();
if(temp.equals("GET")){
String namafile=s.nextToken();
Namafile="."+Namafile;
FileInputStream fis=null;
boolean fileExists=benar;
if(!(namafile.endsWith(".htm")||namafile.endsWith(".html")))
{
this.fileType=false;
mencoba{
fis=fileInputStream baru("error.html");
}
menangkap(FileNotFoundException e){
fileExists=salah;
}
}
kalau tidak{
mencoba{
fis=FileInputStream baru(Namafile);
}
menangkap(FileNotFoundException e){
fileExists=salah;
}
}
String serverLine="Server: WebServer java sederhana";
String statusLine=null;
String contentTypeLine=null;
String entitasBody=null;
String contentLengthLine="kesalahan";
if(fileExists&&ini.fileType){
statusLine="HTTP/1.0 200 Oke"+CRLF;
contentTypeLine="Jenis konten:"+ini.contentType(Namafile)+CRLF;
contentLengthLine="Panjang Konten:"+(Integer baru(fis.available())).toString()+CRLF;
}
kalau tidak{
if(fileExists&&ini.fileType==false){
statusLine="HTTP/1.0 400 Permintaan Buruk"+CRLF;
contentTypeLine="teks/html";
entitasBody="<HTML>400 Permintaan Tidak Buruk</TITLE></HEAD>"+
"<BODY>400 Permintaan Buruk"+
"<br>penggunaan:http://yourHostName:port/"+
"namafile.html</BODY></HTML>";
}
else if(fileExists==false){
statusLine="HTTP/1.0 404 Tidak Ditemukan"+CRLF;
contentTypeLine="teks/html";
entitasBody="<HTML>404 Tidak Ditemukan</TITLE></HEAD>"+
"<BODY>404 Tidak Ditemukan"+
"<br>penggunaan:http://yourHostName:port/"+
"namafile.html</BODY></HTML>";
}
}
keluaran.tulis(statusLine.getBytes());
keluaran.tulis(serverLine.getBytes());
keluaran.tulis(contentTypeLine.getBytes());
keluaran.tulis(contentLengthLine.getBytes());
keluaran.tulis(CRLF.getBytes());
if(fileExists&&ini.fileType){
sendBytes(fis,keluaran);
fis.close();
}
kalau tidak{
keluaran.tulis(entityBody.getBytes());
}
}
}
mencoba{
keluaran.close();
br.close();
soket.close();
}
tangkapan(Pengecualian e){}
}
//Kirim halaman yang diminta oleh klien
private static void sendBytes(FileInputStream fis,OutputStream os) memunculkan Pengecualian{
byte[] buffer=byte baru[1024];
int byte=0;
while((byte=fis.read(buffer))!=-1){
os.write(buffer,0,byte);
}
}
//Setel konten ContentType
Tipe konten String statis pribadi(String nama file){
if(namafile.endsWith(".htm")||namafile.endsWith(".html")){
kembalikan "teks/html";
}
kembalikan "nama file";
}