การใช้งานเว็บเซิร์ฟเวอร์ Java อย่างง่ายค่อนข้างง่ายขึ้นอยู่กับ java.net.socket และ java.net.serversocket;
1. ขั้นตอนการดำเนินการโปรแกรม
1. สร้างวัตถุ Serversocket;
2. เรียกวิธีการยอมรับของวัตถุ Serversocket และรอการเชื่อมต่อ หากการเชื่อมต่อสำเร็จวัตถุซ็อกเก็ตจะถูกส่งคืนมิฉะนั้นจะถูกบล็อกและรอ
3. รับกระแสไบต์อินพุทสตรีมและเอาท์พุทสตรีมจากวัตถุซ็อกเก็ตและสตรีมทั้งสองนี้สอดคล้องกับคำขอคำขอและการตอบสนองการตอบสนองตามลำดับ
4. ประมวลผลคำขอ: อ่านข้อมูลสตรีมไบต์อินพุทสตรีมแปลงเป็นรูปแบบสตริงและแยกวิเคราะห์ การแยกวิเคราะห์ที่นี่ค่อนข้างง่ายและได้รับข้อมูล URI (ตัวระบุทรัพยากรที่เหมือนกัน) เท่านั้น
5. การตอบสนองการประมวลผล: ขึ้นอยู่กับข้อมูล URI ที่แยกวิเคราะห์ค้นหาไฟล์ทรัพยากรทรัพยากรที่ร้องขอจากไดเรกทอรี Web_root อ่านไฟล์ทรัพยากรและเขียนลงในสตรีม Byte OutputStream;
6. ปิดวัตถุซ็อกเก็ต;
7. ไปที่ขั้นตอนที่ 2 และรอคำขอการเชื่อมต่อต่อไป
2. การใช้งานรหัส
การใช้งานเซิร์ฟเวอร์:
แพ็คเกจ ex01.pyrmont; นำเข้า java.net.socket; นำเข้า java.net.serversocket นำเข้า java.net.inetaddress; นำเข้า java.io.inputstream; นำเข้า java.io.outputstream; นำเข้า Java.io.ioexception; HTML และไฟล์อื่น ๆ จะถูกเก็บไว้ web_root นี่คือไดเรกทอรี webroot ในไดเรกทอรีการทำงาน*/ สตริงสุดท้ายคงที่สาธารณะ web_root = system.getProperty ("user.dir") + file.Separator + "webroot"; // ปิดคำสั่งบริการส่วนตัวสตริงสุดท้ายคงที่ shutdown_command = "/shutdown"; โมฆะคงที่สาธารณะหลัก (สตริง [] args) {httpserver server = new httpserver (); // รอเซิร์ฟเวอร์คำขอเชื่อมต่อ Await (); } โมฆะสาธารณะรอ () {Serversocket Serversocket = null; พอร์ต int = 8080; ลอง {// Server Socket Object Serversocket = New Serversocket (พอร์ต, 1, InetAddress.getByName ("127.0.0.1")); } catch (ioexception e) {e.printstacktrace (); System.Exit (1); } // การวนซ้ำเพื่อรอคำขอในขณะที่ (จริง) {ซ็อกเก็ตซ็อกเก็ต = null; อินพุตสตรีมอินพุต = null; เอาท์พุทเอาท์พุท = null; ลอง {// รอการเชื่อมต่อหลังจากการเชื่อมต่อสำเร็จแล้วให้ส่งคืนซ็อกเก็ตซ็อกเก็ตซ็อกเก็ต = serversocket.accept (); input = socket.getInputStream (); เอาต์พุต = socket.getOutputStream (); // สร้างคำขอวัตถุคำขอและการร้องขอการแยกวิเคราะห์ = คำขอใหม่ (อินพุต); request.parse (); // ตรวจสอบว่าเป็นคำสั่งบริการปิดหรือไม่ถ้า (request.geturi (). เท่ากับ (shutdown_command)) {break; } // สร้างการตอบสนองการตอบสนองของวัตถุ = การตอบกลับใหม่ (เอาต์พุต); Response.SetRequest (คำขอ); Response.SendStaticResource (); // ปิดซ็อกเก็ตอ็อบเจ็กต์อ็อบเจ็กต์ (); } catch (exception e) {e.printstacktrace (); ดำเนินการต่อ; -ขอคลาส:
แพ็คเกจ ex01.pyrmont; นำเข้า java.io.inputstream; นำเข้า java.io.ioException; คำขอคลาสสาธารณะ {อินพุตอินพุตส่วนตัว; uri สตริงส่วนตัว; คำขอสาธารณะ (อินพุตอินพุตอินพุต) {this.input = input; } // อ่านข้อมูลคำขอจากอินพุตสตรีมและรับค่า URI จากการร้องขอโมฆะสาธารณะ Parse () {stringBuffer request = new StringBuffer (2048); int i; ไบต์ [] บัฟเฟอร์ = ไบต์ใหม่ [2048]; ลอง {i = input.read (บัฟเฟอร์); } catch (ioexception e) {e.printstacktrace (); i = -1; } สำหรับ (int j = 0; j <i; j ++) {request.append ((char) buffer [j]); } system.out.print (request.toString ()); uri = parseuri (request.toString ()); } /** * * รูปแบบของการร้องขอมีดังนี้: * get /index.html http /1.1 * โฮสต์: localhost: 8080 * การเชื่อมต่อ: Keep-alive * cache-control: max-age = 0 * ... * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * index1 = requestString.indexof (''); if (index1! = -1) {index2 = requestString.indexof ('', index1 + 1); if (index2> index1) return requeststring.substring (index1 + 1, index2); } return null; } สตริงสาธารณะ geturi () {return uri; - คลาสตอบสนอง:
แพ็คเกจ ex01.pyrmont; นำเข้า java.io.OutputStream; นำเข้า java.io.ioException; นำเข้า Java.io.fileinputStream; นำเข้า java.io.file;/ * การตอบสนอง http = สถานะ-line-line-body เหตุผลวลี CRLF*/การตอบสนองระดับสาธารณะ {ส่วนตัวคงที่ int buffer_size = 1024; คำขอคำขอ; เอาต์พุตเอาท์พุทสตรีม; การตอบสนองสาธารณะ (เอาต์พุตเอาท์พุทสตรีม) {this.output = เอาต์พุต; } โมฆะสาธารณะ setRequest (คำขอคำขอ) {this.request = คำขอ; } โมฆะสาธารณะ SendStaticResource () พ่น IOException {byte [] bytes = byte ใหม่ [buffer_size]; FileInputStream FIS = NULL; ลอง {// เขียนไฟล์เว็บลงในไฟล์ utputStream byte stream ไฟล์ = ไฟล์ใหม่ (httpserver.web_root, request.geturi ()); if (file.exists ()) {fis = new fileInputStream (ไฟล์); int ch = fis.read (ไบต์, 0, buffer_size); ในขณะที่ (ch! = -1) {output.write (ไบต์, 0, ch); ch = fis.read (ไบต์, 0, buffer_size); }} else {// ไฟล์ไม่พบสตริง errorMessage = "http/1.1 404 ไฟล์ไม่พบ/r/n" + "เนื้อหาประเภท: ข้อความ/html/r/n" + "ความยาวเนื้อหา: 23/r/n" + "/r/n" + "<h1> ไฟล์ไม่พบ </h1>"; output.write (errorMessage.getBytes ()); }} catch (Exception e) {// thrown หากไม่สามารถสร้างอินสแตนซ์ไฟล์วัตถุไฟล์. out.println (e.toString ()); } ในที่สุด {ถ้า (fis! = null) fis.close (); }}} 3. การทดสอบผลลัพธ์
เข้าถึงไฟล์ทรัพยากรที่มีอยู่ (โปรดทราบว่าจะถูกเก็บไว้ในโฟลเดอร์ WebRoot ในไดเรกทอรีโครงการ):
การเข้าถึงไฟล์ทรัพยากรที่ไม่มีอยู่จริง:
ปิดเซิร์ฟเวอร์:
การอ้างอิง: "การวิเคราะห์เชิงลึกของ Tomcat"
@author ผู้เขียนแบบมีลมเหมือนลม
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น