Implementasi server web Java sederhana, relatif sederhana, berdasarkan java.net.socket dan java.net.serversocket;
1. Langkah Eksekusi Program
1. Buat objek server;
2. Hubungi metode penerimaan objek server dan tunggu koneksi. Jika koneksi berhasil, objek soket akan dikembalikan, jika tidak, itu akan diblokir dan ditunggu;
3. Dapatkan stream inputStream dan outputStream byte dari objek soket, dan kedua aliran ini masing -masing sesuai dengan permintaan permintaan dan respons respons;
4. Memproses permintaan: Baca informasi aliran byte inputStream, ubah menjadi formulir string, dan parsing. Parsing di sini relatif sederhana, dan hanya memperoleh informasi URI (pengidentifikasi sumber daya seragam);
5. Respons Pemrosesan: Berdasarkan informasi URI yang diuraikan, temukan file sumber daya sumber daya yang diminta dari direktori web_root, baca file sumber daya, dan tuliskan ke aliran byte outputStream;
6. Tutup objek soket;
7. Lanjutkan ke Langkah 2 dan lanjutkan menunggu permintaan koneksi;
2. Implementasi Kode
Implementasi Server:
Paket ex01.pyrmont; impor java.net.socket; impor java.net.serversocket; impor java.net.inetaddress; import java.io.inputStream; impor java.io.outputstream; public java.io.ioEcception; impor java.io.file. di mana HTML dan file lainnya disimpan. Web_root di sini adalah direktori webroot di direktori kerja*/ string final statis public web_root = system.getProperty ("user.dir") + file.separator + "webroot"; // tutup perintah layanan private static final string shutdown_command = "/shutdown"; public static void main (string [] args) {httpserver server = httpserver baru (); // tunggu server permintaan koneksi.AWAIT (); } public void wait () {serversocket serversocket = null; int port = 8080; coba {// server socket objek serversocket = new serversocket (port, 1, inetaddress.getbyname ("127.0.0.1")); } catch (ioException e) {e.printstacktrace (); System.exit (1); } // Looping untuk menunggu permintaan while (true) {socket socket = null; Inputstream input = null; OutputStream output = null; coba {// menunggu koneksi, setelah koneksi berhasil, kembalikan soket soket soket = serversocket.accept (); input = socket.getInputStream (); output = socket.getoutputStream (); // buat objek permintaan dan permintaan parse permintaan = permintaan baru (input); request.parse (); // Periksa apakah itu perintah layanan tertutup jika (request.geturi (). Sama (shutdown_command)) {break; } // Buat respons objek respons respons = respons baru (output); response.setRequest (permintaan); response.sendstaticResource (); // tutup socket objek socket.close (); } catch (Exception e) {E.PrintStackTrace (); melanjutkan; }}}}Kelas permintaan:
Paket ex01.pyrmont; impor java.io.inputStream; import java.io.ioException; permintaan kelas publik {input inputStream private; Private String URI; permintaan publik (inputStream input) {this.input = input; } // Baca informasi permintaan dari inputStream dan dapatkan nilai URI dari permintaan public void parse () {StringBuffer request = New StringBuffer (2048); int i; byte [] buffer = byte baru [2048]; coba {i = input.read (buffer); } catch (ioException e) {e.printstacktrace (); i = -1; } untuk (int j = 0; j <i; j ++) {request.append ((char) buffer [j]); } System.out.print (request.toString ()); uri = parseuri (request.toString ()); } /** * * Bentuk requestString adalah sebagai berikut: * get /index.html http /1.1 * host: localhost: 8080 * Koneksi: Keep-Alive * Cache-Control: Max-AGE = 0 * ... * Tujuan fungsi ini adalah untuk mendapatkan /index.html string * /string private string parseuri (string private parseuri (string string private parseuri (string string private parseuri (string string parseuri (string private parseuri (string string private parseuri (string string parseuri (string string private parseuri) untuk mendapatkan /index.HTML string string private PARSEURI (string private PARSEURI PARSEURI UNTUK index1 = requestString.indexof (''); if (index1! = -1) {index2 = requestString.indexof ('', index1 + 1); if (index2> index1) return requestString.substring (index1 + 1, index2); } return null; } public string geturi () {return uri; }} Kelas Respons:
package ex01.pyrmont;import java.io.OutputStream;import java.io.IOException;import java.io.FileInputStream;import java.io.File;/* HTTP Response = Status-Line *(( general-header | response-header | entity-header ) CRLF) CRLF [ message-body ] Status-Line = HTTP-Version SP Status-Code SP Alasan-Phrase CRLF*/Respons kelas publik {private static final int buffer_size = 1024; Permintaan permintaan; Outputstream output; respons publik (outputStream output) {this.output = output; } public void setRequest (permintaan permintaan) {this.Request = request; } public void sendStaticResource () melempar ioException {byte [] bytes = byte baru [buffer_size]; FileInputStream fis = null; coba {// tulis file web ke file aliran byte byte outputStream = file baru (httpserver.web_root, request.geturi ()); if (file.exists ()) {fis = FileInputStream baru (file); int ch = fis.read (bytes, 0, buffer_size); while (ch! = -1) {output.write (bytes, 0, ch); ch = fis.read (bytes, 0, buffer_size); }} else {// File tidak ditemukan string errormessage = "http/1.1 404 File tidak ditemukan/r/n" + "tipe konten: teks/html/r/n" + "panjang konten: 23/r/n" + "/r/n" + "<h1> file tidak ditemukan </h1>"; output.write (errormessage.getbytes ()); }} catch (Exception e) {// dilemparkan jika tidak dapat instantiate file objek sistem.out.println (e.toString ()); } akhirnya {if (fis! = null) fis.close (); }}} 3. Tes Hasil
Akses file sumber daya yang ada (perhatikan bahwa mereka disimpan di folder webroot di direktori proyek):
Mengakses file sumber daya yang tidak ada:
Tutup server:
Referensi: "Analisis Tomcat yang mendalam"
@Author Coder seperti angin
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.