تطبيق خادم الويب Java بسيط ، بسيط نسبيًا ، استنادًا إلى java.net.socket و java.net.serversocket ؛
1. خطوات تنفيذ البرنامج
1. إنشاء كائن Serversocket ؛
2. استدعاء طريقة قبول كائن Serversocket وانتظر الاتصال. إذا كان الاتصال ناجحًا ، فسيتم إرجاع كائن المقبس ، وإلا سيتم حظره وانتظره ؛
3. احصل على تدفقات البايت inputstream و outputstream من كائن المقبس ، وهذان المجاريان يتوافقان مع طلب الطلب والاستجابة على التوالي ؛
4. معالجة الطلب: اقرأ معلومات دفق البايت inputstream ، وتحويلها إلى نموذج سلسلة ، وحوضه. التحليل هنا بسيط نسبيًا ، ويحصل فقط على معلومات URI (معرف الموارد الموحد) ؛
5. استجابة المعالجة: بناءً على معلومات URI المحلية ، ابحث عن ملف المورد المطلوب من دليل Web_Root ، وقراءة ملف المورد ، واكتبه إلى دفق بايت OutputStream ؛
6. أغلق كائن المقبس ؛
7. انتقل إلى الخطوة 2 واستمر في انتظار طلب الاتصال ؛
2. تنفيذ الكود
تنفيذ الخادم:
package ex01.pyrmont ؛ import java.net.socket ؛ import java.net.serversocket ؛ استيراد java.net.inetaddress ؛ استيراد java.io.inputstream ؛ استيراد java.io.outputstream ؛ استيراد java.io.ioexception ؛ استيراد java.io.file ؛ يتم تخزين HTML والملفات الأخرى. Web_root هنا هو دليل webroot في دليل العمل*/ السلسلة النهائية الثابتة العامة web_root = system.getProperty ("user.dir") + file.separator + "webroot" ؛ // Close Service Command Private Static Final String sthowddown_command = "/stapdown" ؛ public static void main (string [] args) {httpserver server = new httpserver () ؛ // انتظر طلب الاتصال server.await () ؛ } public void await () {serversocket serversite = null ؛ INT PORT = 8080 ؛ TREE {// Server Socket Object ServerSocket = New ServersOcket (المنفذ ، 1 ، inetaddress.getByName ("127.0.0.1")) ؛ } catch (ioException e) {E.PrintStackTrace () ؛ System.exit (1) ؛ } // looping لانتظار طلب بينما (صحيح) {Socket Socket = null ؛ إدخال inputStream = فارغ ؛ OutputStream Output = null ؛ جرب {// في انتظار الاتصال ، بعد أن يكون الاتصال ناجحًا ، قم بإرجاع مقبس كائن المقبس = serversocket.accept () ؛ الإدخال = socket.getInputStream () ؛ الإخراج = socket.getOutputStream () ؛ // إنشاء طلب طلب وطلب طلب = طلب جديد (إدخال) ؛ request.parse () ؛ // } // إنشاء استجابة استجابة كائن استجابة = استجابة جديدة (الإخراج) ؛ استجابة. استجابة. sendstaticResource () ؛ // إغلاق socket كائن socket.close () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ يكمل؛ }}}}فئة الطلب:
حزمة ex01.pyrmont ؛ استيراد java.io.inputstream ؛ استيراد java.io.ioException ؛ طلب الفئة العامة {private inputstream input ؛ سلسلة خاصة أوري ؛ طلب عام (إدخال inputStream) {this.input = input ؛ } // اقرأ معلومات الطلب من inputStream واحصل على قيمة URI من request public void parse () {stringBuffer request = new StringBuffer (2048) ؛ int أنا ؛ Byte [] Buffer = New Byte [2048] ؛ حاول {i = input.Read (buffer) ؛ } 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 ()) ؛ } /** * * شكل requestString كما يلي: * get /index.html http /1.1 * المضيف: localhost: 8080 * الاتصال: keep-alive * cache-control: max-mage = 0 * ... index1 = requestString.indexof ('') ؛ if (index1! = -1) {index2 = requestString.indexof ('' ، index1 + 1) ؛ if (index2> index1) return requestString.SubString (index1 + 1 ، index2) ؛ } إرجاع فارغ ؛ } السلسلة العامة geturi () {return uri ؛ }} فئة الاستجابة:
حزمة ex01.pyrmont ؛ استيراد java.io.outputstream ؛ استيراد java.io.ioException ؛ استيراد java.io.fileInputStream ؛ استيراد java.io.file QUARY-PHRASE CRLF*/Public Class Response {private Static Final Buffer_size = 1024 ؛ طلب طلب ؛ إخراج الإخراج الاستجابة العامة (إخراج outputStream) {this.output = الإخراج ؛ } public void setRequest (طلب طلب) {this.request = request ؛ } void public sendStaticResource () يلقي ioException {byte [] bytes = new byte [buffer_size] ؛ FileInputStream Fis = NULL ؛ حاول {// اكتب ملف الويب في ملف دفق البايت OutputStream = ملف جديد (httpserver.web_root ، request.geturi ()) ؛ if (file.exists ()) {fis = new FileInputStream (file) ؛ int ch = fis.read (bytes ، 0 ، buffer_size) ؛ بينما (ch! = -1) {output.write (bytes ، 0 ، ch) ؛ ch = fis.read (bytes ، 0 ، buffer_size) ؛ }} آخر {// لم يتم العثور على سلسلة errormessage = "http/1.1 404 لم يتم العثور على ملف/r/n" + "نوع المحتوى: text/html/r/n" + "طول المحتوى: 23/r/n" + "/r/n" + "<h1> لم يتم العثور على </h1>" ؛ output.write (errormessage.getBytes ()) ؛ }} catch (استثناء e) {// replay إذا لم يكن بإمكانه إنشاء ملف كائن ملف system.out.println ( } أخيرًا {if (fis! = null) fis.close () ؛ }}} 3. اختبار النتائج
الوصول إلى ملفات الموارد الحالية (لاحظ أنها يتم تخزينها في مجلد Webroot في دليل المشروع):
الوصول إلى ملفات الموارد غير الموجودة:
أغلق الخادم:
المرجع: "تحليل متعمق لـ Tomcat"
Author مشفر يشبه الرياح
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.