วิธีใช้ WebSocket ใน Tomcat
โปรโตคอล WebSocket เป็นของมาตรฐาน HTML5 และเบราว์เซอร์ที่ได้รับการสนับสนุนอย่างมากจาก WebSocket ซึ่งช่วยให้ลูกค้าและเซิร์ฟเวอร์สามารถสื่อสารได้สองทาง หลังจากสร้างการเชื่อมต่อ WebSocket ระหว่างไคลเอนต์และเซิร์ฟเวอร์ข้อความฝั่งเซิร์ฟเวอร์สามารถส่งไปยังไคลเอนต์โดยตรงดังนั้นจึงทำลายโหมดการตอบกลับคำขอแบบดั้งเดิมและหลีกเลี่ยงคำขอที่ไม่มีความหมาย ตัวอย่างเช่นวิธีดั้งเดิมอาจใช้ AJAX เพื่อขอฝั่งเซิร์ฟเวอร์อย่างต่อเนื่องในขณะที่ WebSocket สามารถส่งข้อมูลไปยังไคลเอนต์ได้โดยตรงและไคลเอนต์ไม่จำเป็นต้องขอ ในเวลาเดียวกันด้วยการสนับสนุนเบราว์เซอร์เนทีฟการเขียนแอปพลิเคชันไคลเอนต์ได้สะดวกมากขึ้นและไม่จำเป็นต้องพึ่งพาปลั๊กอินของบุคคลที่สาม นอกจากนี้โปรโตคอล WebSocket ทิ้งส่วนหัวคำขอที่ยุ่งยากของโปรโตคอล HTTP แต่ส่งผ่านในรูปแบบของเฟรมข้อมูลซึ่งมีประสิทธิภาพมากขึ้น
รูปภาพแสดงกระบวนการสื่อสารโปรโตคอล WebSocket ก่อนอื่นไคลเอนต์จะส่งแพ็คเกจจับมือเพื่อบอกเซิร์ฟเวอร์ว่าฉันต้องการอัพเกรดเป็น WebSocket ฉันไม่รู้ว่าเซิร์ฟเวอร์ของคุณเห็นด้วยหรือไม่ ในเวลานี้หากเซิร์ฟเวอร์รองรับ WebSocket Protocol มันจะส่งคืนแพ็คเกจการจับมือกันเพื่อบอกลูกค้าว่าไม่มีปัญหาและการอัพเกรดได้รับการยืนยันแล้ว จากนั้นมีการสร้างการเชื่อมต่อ WebSocket สำเร็จซึ่งรองรับการสื่อสารสองทางและส่งข้อความโดยใช้รูปแบบเฟรมข้อมูลของโปรโตคอล WebSocket
ต้องมีการอธิบายกระบวนการจับมือกัน เพื่อให้โปรโตคอล WebSocket เข้ากันได้กับสถาปัตยกรรมเว็บ HTTP โปรโตคอลที่มีอยู่การจับมือกันของโปรโตคอล WebSocket จะต้องขึ้นอยู่กับโปรโตคอล HTTP ตัวอย่างเช่นไคลเอนต์จะส่งข้อความ HTTP คล้ายกับคำขอต่อไปนี้ไปยังคำขอเซิร์ฟเวอร์เพื่ออัพเกรดเป็นโปรโตคอล WebSocket การอัปเกรด: WebSocket บอกเซิร์ฟเวอร์ว่าฉันต้องการอัพเกรดโปรโตคอล:
รับ ws: // localhost: 8080/สวัสดี http/1.1 ต้นกำเนิด: http: // localhost: 8080 การเชื่อมต่อ: อัพเกรดโฮสต์: localhost: 8080 sec-websocket-key: urovsczjnol/umbtt5ukmw == อัปเกรด: WebSocket Sec
ในเวลานี้หากเซิร์ฟเวอร์รองรับโปรโตคอล WebSocket มันจะส่งข้อความที่ตกลงไปยังโปรโตคอลการอัพเกรดของลูกค้า ข้อความเฉพาะนั้นคล้ายกับต่อไปนี้โดยที่การอัพเกรด: WebSocket บอกลูกค้าว่าฉันเห็นด้วยกับโปรโตคอลการอัพเกรดของคุณ:
HTTP/1.1 101 WebSocket Handshake วันที่: ศุกร์, 10 ก.พ. 2016 17:38:18 การเชื่อมต่อ GMT: อัพเกรดเซิร์ฟเวอร์: Kaazing Gateway Upgrade: WebSocket Secbebsocket-Accept: RLHCKW/SKSO9GAH/ZSFHBATDKRU
หลังจากเสร็จสิ้นการจับมือกันดังกล่าวข้างต้นการเชื่อมต่อโปรโตคอล HTTP จะเสีย ถัดไปคุณเริ่มใช้โปรโตคอล WebSocket เพื่อสื่อสารระหว่างทั้งสองฝ่าย การเชื่อมต่อนี้ยังคงเป็นการเชื่อมต่อ TCP/IP ดั้งเดิมและพอร์ตยังคงเป็น 80 หรือ 443 ดั้งเดิม
นี่คือตัวอย่างง่ายๆในการเขียน WebSocket ใน Tomcat:
ชั้นเรียนสาธารณะ HelloWebsocketServlet ขยาย WebSocketServlet {รายการคงที่ส่วนตัว <SessageInbound> SocketList = new ArrayList <S MessageInbound> (); ได้รับการป้องกัน streaminbound createWebsocketInbound (สตริง subprotocol, คำขอ httpservletrequest) {ส่งคืน websocketMessageInbound ใหม่ (); } คลาสสาธารณะ WebSocketMessageInBound ขยาย MessageInbound {void onClose (สถานะ int) {super.onclose (สถานะ); SocketList.remove (นี่); } โมฆะป้องกัน onopen (wsoutbound ขาออก) {super.onopen (ขาออก); socketlist.add (นี่); } @Override void protected onbinaryMessage (ข้อความ bytebuffer) พ่น ioexception {} @Override ป้องกันโมฆะ ontextMessage (ข้อความ Charbuffer) โยน iOexception {สำหรับ (ข้อความ wsoutbound outbound = messageinbound.getWsoutbound (); outbound.writeTextMessage (บัฟเฟอร์); outbound.flush (); -servlet นี้จะต้องสืบทอด WebSocketServlet จากนั้นสร้างคลาส WebSocketMessageInbound ที่สืบทอด MessageInbound เติม OnClose, Onopen, OnBinaryMessage และ OnTextMessage ลงในคลาสนี้เพื่อให้ตรรกะของแต่ละเหตุการณ์เสร็จสมบูรณ์ Onopen จะถูกเรียกเมื่อมีการสร้างการเชื่อมต่อ WebSocket OnClose จะถูกเรียกเมื่อ WebSocket ถูกปิด onBinaryMessage จะถูกเรียกเมื่อข้อมูลไคลเอนต์ได้รับในโหมดไบนารีและ ontextMessage จะถูกเรียกเมื่อข้อมูลไคลเอนต์ได้รับในโหมดข้อความ รหัสข้างต้นใช้ผลกระทบของการออกอากาศ
ตามตรรกะการประมวลผลข้างต้นการรวม Websocket ของ Tomcat จะไม่ยากเกินไป หมายความว่าหากคุณพบคำขอโปรโตคอล WebSocket เมื่อประมวลผลคำขอคุณจะทำการประมวลผลพิเศษให้เชื่อมต่อและโทรหา OnClose, Onopen, OnBinaryMessage และ ontextMessage ของวิธีการข้อความของ WebSocketServlet ในเวลาที่เหมาะสม เนื่องจากโดยทั่วไปแล้ว WebSocket แนะนำให้ใช้ในโหมด NIO ให้ดูที่โปรโตคอลการรวมโหมด NIO WebSocket
ดังที่แสดงไว้ในรูปหากการเชื่อมต่อไคลเอนต์ของ WebSocket ได้รับจากตัวรับสัญญาณและลงทะเบียนในคิว Niochannel ส่วนประกอบของ Poller ยังคงพักอยู่ว่ามี niochannel ที่จะจัดการหรือไม่ ถ้าเป็นเช่นนั้นมันจะผ่านไปป์ไลน์การประมวลผลไปยังเซิร์ฟเล็ตที่สืบทอด WebSocketServlet วิธีการ DOGET ของ WebSocketServlet จะจัดการการจับมือกัน WebSocket และบอกให้ไคลเอ็นต์ Return ยอมรับข้อตกลงการอัพเกรด ต่อมา Poller ยังคงผลัดกันเพื่อกำจัด Niochannel ที่เกี่ยวข้อง เมื่อมีการค้นพบว่าไปป์ไลน์ที่ใช้โปรโตคอล WebSocket ถูกนำมาใช้มันจะเรียกใช้วิธีการส่งข้อความเพื่อให้เสร็จสิ้นการประมวลผลของเหตุการณ์ที่แตกต่างกันซึ่งจะได้รับการสนับสนุนสำหรับโปรโตคอล WebSocket
ขอบคุณสำหรับการอ่านฉันหวังว่ามันจะช่วยคุณได้ ขอบคุณสำหรับการสนับสนุนเว็บไซต์นี้!