ด้วยการพัฒนาอินเทอร์เน็ตโปรโตคอล HTTP แบบดั้งเดิมนั้นยากที่จะตอบสนองความต้องการที่ซับซ้อนมากขึ้นของเว็บแอปพลิเคชัน ในช่วงไม่กี่ปีที่ผ่านมามีการเสนอโปรโตคอล Websocket Protocol มันตระหนักถึงการสื่อสารแบบฟูลเพล็กซ์ระหว่างเบราว์เซอร์และเซิร์ฟเวอร์ขยายฟังก์ชั่นการสื่อสารระหว่างเบราว์เซอร์และเซิร์ฟเวอร์และทำให้เซิร์ฟเวอร์สามารถส่งข้อมูลไปยังไคลเอนต์ได้อย่างแข็งขัน
โปรโตคอล HTTP แบบดั้งเดิมนั้นไร้สัญชาติ แต่ละคำขอจะต้องเริ่มต้นโดยลูกค้า (เช่นเบราว์เซอร์) หลังจากการประมวลผลเซิร์ฟเวอร์จะส่งคืนผลการตอบกลับ เป็นเรื่องยากสำหรับเซิร์ฟเวอร์ที่จะส่งข้อมูลไปยังไคลเอนต์อย่างแข็งขัน เว็บโมเดลแบบดั้งเดิมประเภทนี้เป็นเชิงรุกและเซิร์ฟเวอร์เป็นแบบพาสซีฟ โมเดลเว็บแบบดั้งเดิมทำให้เกิดปัญหาน้อยลงสำหรับเว็บแอปพลิเคชันที่มีการเปลี่ยนแปลงข้อมูลไม่บ่อยนัก แต่ มันนำความไม่สะดวกอย่างมากสำหรับเว็บแอปพลิเคชันที่เกี่ยวข้องกับข้อมูลเรียลไทม์เช่นแอปพลิเคชันที่มีฟังก์ชั่นเช่นการสื่อสารแบบทันทีข้อมูลแบบเรียลไทม์การสมัครสมาชิก ฯลฯ ก่อนที่จะมีการเสนอข้อกำหนด WebSocket ในความเป็นจริงหลังเป็นแบบสำรวจ แต่ได้รับการปรับปรุงแล้ว
การสำรวจเป็นโซลูชันดั้งเดิมที่สุดในการใช้งานเว็บแอปพลิเคชันแบบเรียลไทม์ เทคโนโลยีการสำรวจต้องการให้ลูกค้าส่งคำขอไปยังเซิร์ฟเวอร์เป็นระยะตามช่วงเวลาที่กำหนดและสอบถามบ่อยครั้งว่ามีการเปลี่ยนแปลงข้อมูลใหม่หรือไม่ เห็นได้ชัดว่าวิธีการนี้สามารถนำไปสู่คำขอที่ไม่จำเป็นมากเกินไปการสูญเสียการรับส่งข้อมูลและทรัพยากรเซิร์ฟเวอร์
เทคโนโลยีดาวหางสามารถแบ่งออกเป็นเทคโนโลยีการสำรวจและสตรีมมิ่งที่ยาวนาน การสำรวจระยะยาวช่วยปรับปรุงเทคโนโลยีการสำรวจที่กล่าวถึงข้างต้นลดการร้องขอที่ไร้ประโยชน์ มันกำหนดเวลาหมดอายุสำหรับข้อมูลบางอย่างและส่งคำขอไปยังเซิร์ฟเวอร์หลังจากข้อมูลหมดอายุเท่านั้น กลไกนี้เหมาะสำหรับสถานการณ์ที่การเปลี่ยนแปลงข้อมูลไม่บ่อยนัก เทคโนโลยีสตรีมมิ่งมักหมายถึงไคลเอนต์โดยใช้หน้าต่างที่ซ่อนอยู่เพื่อสร้างการเชื่อมต่อ HTTP ยาวกับเซิร์ฟเวอร์ เซิร์ฟเวอร์จะอัปเดตสถานะการเชื่อมต่ออย่างต่อเนื่องเพื่อให้การเชื่อมต่อ HTTP ยาวมีชีวิตอยู่ ด้วยวิธีนี้เซิร์ฟเวอร์สามารถส่งข้อมูลไปยังไคลเอนต์ผ่านการเชื่อมต่อที่ยาวนานนี้ เทคโนโลยีสตรีมมิ่งอาจทดสอบประสิทธิภาพของเซิร์ฟเวอร์ในสภาพแวดล้อมที่มีขนาดใหญ่พร้อมกัน
เทคโนโลยีทั้งสองขึ้นอยู่กับโหมดการตอบสนองการร้องขอและไม่ได้รับการพิจารณาว่าเป็นเทคโนโลยีแบบเรียลไทม์ในความหมายที่แท้จริง การร้องขอหรือการตอบสนองของเสียจากการรับส่งข้อมูลจำนวนหนึ่งในข้อมูลส่วนหัวเดียวกันและความซับซ้อนในการพัฒนาก็สูงเช่นกัน
** พร้อมกับการเปิดตัว HTML5 WebSocket ตระหนักถึงการสื่อสารแบบเรียลไทม์ของเว็บอย่างแท้จริงทำให้โหมด B/S มีความสามารถในการสื่อสารแบบเรียลไทม์ของโหมด C/S ** เวิร์กโฟลว์ของ WebSocket มีดังนี้: เบราว์เซอร์ส่งคำขอไปยังเซิร์ฟเวอร์เพื่อสร้างการเชื่อมต่อ WebSocket ผ่าน JavaScript หลังจากสร้างการเชื่อมต่อ WebSocket สำเร็จไคลเอนต์และเซิร์ฟเวอร์สามารถส่งข้อมูลผ่านการเชื่อมต่อ TCP เนื่องจากการเชื่อมต่อ WebSocket เป็นการเชื่อมต่อ TCP จึงไม่จำเป็นต้องใช้ข้อมูลส่วนหัวซ้ำ ๆ ที่จะดำเนินการกับการส่งแต่ละครั้งดังนั้นปริมาณการส่งข้อมูลของข้อมูลจึงมีขนาดเล็กกว่าการสำรวจและเทคโนโลยีดาวหางมาก บทความนี้ไม่ได้แนะนำข้อกำหนดของ WebSocket ในรายละเอียด แต่ส่วนใหญ่แนะนำการใช้งาน WebSocket ใน Java Web และใช้ WebSocket เพื่อใช้ห้องแชท
Javaee 7 ได้สร้าง JSR-356: Java API สำหรับข้อมูลจำเพาะ WebSocket เว็บคอนเทนเนอร์หลายรายการเช่น Tomcat, Nginx, Jetty ฯลฯ สนับสนุน WebSocket Tomcat รองรับ WebSocket ตั้งแต่ 7.0.27 และ JSR-356 ตั้งแต่ 7.0.47 รหัสต่อไปนี้จะต้องทำงานบน Tomcat7.0.27 หรือสูงกว่า
รหัสเซิร์ฟเวอร์ WebSocket
// คำอธิบายประกอบนี้ใช้เพื่อระบุ URI ซึ่งลูกค้าสามารถเชื่อมต่อกับ WebSocket ได้ การทำแผนที่คำอธิบายประกอบแบบ servlet ไม่จำเป็นต้องกำหนดค่าใน web.xml @ServerendPoint ("/websocket") คลาสสาธารณะ WebSocketDemo {// ตัวแปรคงที่ที่ใช้ในการบันทึกจำนวนการเชื่อมต่อออนไลน์ปัจจุบัน ควรได้รับการออกแบบให้มีความปลอดภัยด้าย private static final atomicinteger onlineCount = ใหม่ atomicinteger (0); // ชุดเธรดที่ปลอดภัยของแพ็คเกจพร้อมกันใช้เพื่อจัดเก็บวัตถุ mywebsocket ที่สอดคล้องกันของไคลเอนต์แต่ละตัว ในการตระหนักว่าเซิร์ฟเวอร์สื่อสารกับไคลเอนต์เดียวคุณสามารถใช้แผนที่เพื่อจัดเก็บโดยที่คีย์สามารถระบุ copyOnWriteArraySet ของผู้ใช้ส่วนตัวได้ // กำหนดชื่อเล่นแชทที่บันทึกชื่อเล่นสตริงส่วนตัวของไคลเอ็นต์ส่วนตัว; // เชื่อมต่อเซสชันการเชื่อมต่อกับไคลเอนต์บางตัวและคุณต้องส่งข้อมูลไปยังเซสชันส่วนตัวของไคลเอนต์ Public WebSocketDemo () {nickname = "Guest" + OnLineCount.getandincrement (); } / * * ใช้คำอธิบายประกอบ @Onopen เพื่อระบุการส่งคืนหลังจากลิงค์ไคลเอนต์สำเร็จ เซสชันพารามิเตอร์เป็นพารามิเตอร์เสริมเซสชันนี้เป็นเซสชันในข้อกำหนดของ WebSocket ซึ่งแสดงถึงเซสชัน ไม่ใช่ httpsession */ @onopen โมฆะสาธารณะ onopen (เซสชันเซสชัน) {this.session = เซสชัน; websocketSet.add (นี่); String message = string.format ("[%s,%s]", ชื่อเล่น, "เพิ่มในห้องแชท"); ออกอากาศ (ข้อความ); System.out.println ("Onopen"); }/ * * ใช้คำอธิบายประกอบ @OnMessage เพื่อระบุว่าไคลเอนต์ส่งข้อความและพารามิเตอร์แรกระบุข้อมูลที่ส่งโดยผู้ใช้ เซสชันพารามิเตอร์เป็นพารามิเตอร์เสริมซึ่งสอดคล้องกับเซสชันในวิธีการ ONOPEN */@OnMessage โมฆะสาธารณะ onMessage (ข้อความสตริงเซสชันเซสชัน) {// แน่นอน System.out.out.println (this.session == เซสชัน); ออกอากาศ (string.format ("%s:%s", ชื่อเล่น, ตัวกรอง (ข้อความ))); }/ ** การโทรกลับหลังจากผู้ใช้ทำลายลิงก์โปรดทราบว่าวิธีนี้จะต้องถูกเรียกใช้หลังจากไคลเอ็นต์เรียกวิธีการเชื่อมโยงที่เสีย*/ @onclose โมฆะสาธารณะ onClose () {webSocketSet.remove (นี่); String message = string.format ("[%s,%s]", ชื่อเล่น, "ออกจากลิงค์ห้องแชท"); ออกอากาศ (ข้อความ); } // มวลชนส่งการออกอากาศเป็นโมฆะส่วนตัว (ข้อมูลสตริง) {สำหรับ (WebSocketDemo W: WebSocketSet) {ลอง {ซิงโครไนซ์ (WebSocketDemo.Class) {W.Session.getBasicRemote () SendText (ข้อมูล); }} catch (ioexception e) {system.out.println ("ส่งข้อความไปยังไคลเอนต์"+w.nickname+"ไม่สามารถส่งข้อความได้"); WebSocketSet.remove (W); ลอง {w.session.close (); } catch (ioexception e1) {} string message = string.format ("[%s,%s]", w.nickname, "ตัดการเชื่อมต่อ"); ออกอากาศ (ข้อความ); }}} // สามารถทำคำขอกรองสำหรับข้อความผู้ใช้เช่นการปิดกั้นคำหลัก ฯลฯ - ตัวกรองสตริงคงที่สาธารณะ (ข้อความสตริง) {if (message == null) {return null; } ส่งคืนข้อความ; -ไคลเอนต์ (เว็บเพจเว็บ) รหัส:
<! doctype html> <html> <head> <meta charset = "utf-8"> <title> แทรกชื่อที่นี่ </title> <script type = "text/javascript"> var ws = new websocket ("ws: // localhost: 8080/websockettest/websocket / * * ฟังการเปลี่ยนแปลงในสามรัฐ js จะโทรกลับ*/ ws.onopen = ฟังก์ชั่น (ข้อความ) {}; ws.onclose = function (ข้อความ) {}; ws.onMessage = ฟังก์ชั่น (ข้อความ) {showMessage (message.data); - // ฟังเหตุการณ์ปิดหน้าต่าง เมื่อปิดหน้าต่างให้ปิดการเชื่อมต่อ WebSocket อย่างแข็งขันเพื่อป้องกันไม่ให้หน้าต่างปิดก่อนที่การเชื่อมต่อจะถูกตัดการเชื่อมต่อและฝั่งเซิร์ฟเวอร์จะทำการยกเว้น window.onbeforeunload = function () {ws.close (); - // ปิดฟังก์ชั่นการเชื่อมต่อ closewebsocket () {ws.close (); } // ส่งฟังก์ชั่นข้อความส่ง () {var input = document.getElementById ("msg"); var text = input.value; ws.send (ข้อความ); input.value = ""; } function showMessage (ข้อความ) {var text = document.createtextNode (ข้อความ); var br = document.createElement ("br") var div = document.getElementById ("ShowchatMessage"); Div.AppendChild (ข้อความ); Div.AppendChild (BR); } </script> </head> <body> <div id = "show"> <div id = "showchatMessage"> </div> <อินพุต type = "text" size = "80" id = "msg" name = "msg" placeholder = "ป้อนเนื้อหา" onclick = "send ()"> </body> </html>ดังที่ได้กล่าวไว้ข้างต้นห้องแชทที่มีฟังก์ชั่นการแชทเป็นกลุ่มเสร็จสิ้น ในระหว่างกระบวนการตรวจสอบพบว่าการใช้ WebSocket สามารถดำเนินการตามคำขอข้ามโดเมนได้
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น