إنشاء اتصال ثنائي الاتجاه بين العميل والخادم ، مما يعني أن العميل يحتاج فقط إلى إرسال طلب إلى الخادم ، وسيقوم الخادم بمعالجته بعد المعالجة. يمكن أثناء انتظار هذا الوقت لمواصلة القيام بأعمال أخرى ، والعملية بأكملها غير متزامنة. في هذه السلسلة من البرامج التعليمية ، سيتم توجيه المستخدمين لاستخدام تحليل JSON API الجديد (JSR-353) في Java EE 7 في حاوية Glassfish 4 ، واستخدام jQuery و Bootstrap مجتمعة. تتطلب هذه المقالة أن يكون لدى القراء معرفة مبدئية أساسية معينة من WebSocket HTML 5.
رسم تخطيطي للتكاثر
دعونا أولاً نلقي نظرة على العروض بعد الانتهاء من هذا البرنامج التعليمي ، كما هو موضح أدناه:
تحضير
نحن نستخدم JDK 7 و Mavn 3 لبناء المكتبة.
<Properties> <Indorsed.dir> $ {project.build.directory}/المعتمدة </endorsed.dir> <project.build.sourceencoding> utf-8 </projous <Rependency> <roupEd> javax </rougiD> <StifactId> javaee-api </shintifactid> <الإصدار> 7.0 </version> plugins> <ultion> <roupiD> org.apache.maven.plugins </groupId> <StifactId> maven-compiler-plugin </suntifactid> <sored> > <Target> 1.7 </sugres> <PremilerArguments> <IndorsedDirs> $ {inforsed.dir} </endorsedDirs> </sempilerArguments> </isplicturation> </sultin> <clupin> <rouplyid> org.pach.paven.plugins </rougeid> <StifactId> maven-war-plugin </stifactId> <sored> 2.3 </splext> <iscondation> <FisorOnMissingWebxml> false </isalonmissingwebxml> </ispification on> </sultiin> <croupin> org.apache.
في الوقت نفسه ، من أجل استخدام Glassfish 4 ، يجب إضافة المكونات الإضافية التالية:
Plugin> <rougiD> org.glassfish.embedded </groupId> <StifactId> maven-embedded-glassfish-plugin </stiftiD> <الإصدار> 4.0 </version> <confi guration> <DoalPrefix> مضمنًا <App> $ {inlderir}/target/$ {project.artifactid}-$ {project.version} .war </app> <AutoDeLete> true </atoDeLete> <port> 8080 </port> <name> $ { Project .Artifactid} </mame> <Inctextrot> hascode </inctextrooot> </ispecturation> <evelopmentions> <evelop> <irod> <vype> نشر </tord> </exe> </exe cute> </exjustions> </ plugin>
إعداد نقطة النهاية من WebSocket
دعونا أولاً نلقي نظرة على رمز WebSocket الخادم كما يلي ، ثم إجراء مزيد من التحليل:
Package Com.HASCODE. WebSocket .onopen ؛ decoders = chatmessagedecoder.class) الدرس العام {private final logger log = logger.getLogger (getClass (). getName ()) ؛ {log. string Room = (String) Session.getUserProperties (). Get ("Room") ؛ ). }}
يحلل التالية الرمز أعلاه:
استخدم ServerEndPoint لتحديد نقطة نهاية جديدة ، حيث تحدد القيمة عنوان URL ويمكنه استخدام معلمة Pathparams ، تمامًا كما هو مستخدم في Jax-RS.
لذلك ، تسمح القيمة "/chat/{room}" للمستخدم بالاتصال بغرفة الدردشة من خلال عنوان URL التالي: ws: //0.0.0: 8080/hascode/chat/java
يمكن حقن القيمة في الأقواس (أي الغرفة) كمعلمة في طريقة رد اتصال دورة حياة نقطة النهاية باستخدام javax.websocket.server.pathparam.
بالإضافة إلى ذلك ، نريد استخدام فئة مشفرة ومغطاة لأننا نستخدم فئة DTO التي يتم استخدامها لنقل البيانات على جانب الخادم وجانب العميل.
عندما يتصل المستخدم بالخادم لأول مرة ويدخل رقم الغرفة للدخول إلى غرفة الدردشة ، سيتم حقن رقم الغرفة في التقديم في شكل معلمات ، ويتم حفظ القيمة في خريطة خاصية المستخدم باستخدام الجلسة. getUserProperties.
عندما يرسل أحد المشاركين في الدردشة المعلومات إلى الخادم من خلال اتصال TCP ، فإنه يحلق من خلال جميع الجلسات المفتوحة ، فإن كل جلسة مرتبطة بغرفة الدردشة المحددة ، وتتلقى معلومات مشفرة ومغطاة.
إذا أردنا إرسال معلومات أو معلومات نصية بسيطة بتنسيق ثنائي ، فيمكننا استخدام Session.getBasicRemote (). SendBinary () أو Session.getBasicRemote (). SendText ()
بعد ذلك ، دعونا نلقي نظرة على الكود المستخدم لتمثيل كيان نقل المعلومات (DTO: كائن نقل البيانات) ، على النحو التالي:
Package Com.HASCODE.
تحويل رسائل الدردشة
في هذا التطبيق ، سيتم كتابة فئة الترميز وفك التشفير للتحويل بين معلومات الدردشة وتنسيق JSON.
دعنا أولاً نلقي نظرة على تنفيذ فئة فك التشفير ، والتي ستحول معلومات الدردشة التي تم تمريرها إلى الخادم إلى فئة ChatMessage Entity. هنا ، يتم استخدام مواصفات Java API لمعالجة JSON (JSR353) لتحويل معلومات تنسيق JSON إلى فئات الكيان.
Package Com.HASCODE. استيراد javax.websocket.endpointConfig ؛ رمي decodeexception {chatmessage chatmessage = new ChatMessage () ؛ GetString (Sender ") ؛
دعنا نلقي نظرة على كود فئة الترميز.
Package Com.Hascode.tutorial void init (Final EndPointConfig config) {} Override public void dorder () {} @Override public string encode (Final Chatmessage chatmessage) يلقي enco dexception {return json.createbjectbuilder () .add ( ).
هنا يمكنك رؤية القوة القوية لـ JSR-353.
بناء عميل بسيط من خلال bootstrap و javacsript
أخيرًا ، نستخدم بشكل شامل bootstrap الشهير ، إطار JQuery و JavaScript لتصميم عميل بسيط. نقوم بإنشاء ملف index.html جديد في دليل src/main/weapp ، والرمز كما يلي:
[! Var $ Message ؛ ) ؛ .message + '/td> </tr>') ؛ "،" المرسل ":" " + $ $ namname.val () +" "،" ورد ":" "} '؛ wsocket.send (msg) ؛ $ message.val (' '). Focus () ؛} ConnectToChatserver () $ chatwindow.empty () ؛ function () {$ labemed = $ (#lameame ') ؛ ؛ + $ LJOMNAME.VAL () + "@" Room) ؛ }) ؛ ) ::::::::::::::::::::::::: :::::::::::::::::::::: :::::::::::::: نموذج> <h2> علامة الدردشة في </h2> <label for = "labeame"> لقب </label> <input type = "text" epalderder = "lamname" id = "labearame"> <viv> <label for = "chatroom"> chatroom </ label> <select size = "1" id = "chatroom"> <borting> arduino </:::::::::::::::::::::::: ::::::::::::::::::::::::: :::::::::::::::::::::: ::::::::::::::::::::::::: :::::::::::::::::::::: :::::: Option> <borte> java </portive> <bort> groovy </portive> <bort> scala </soph> </rection> </viv> <button type = "proff "> تسجيل الدخول </button> </form> </viv> <!-/container-> <viv> <form id =" do-chat "> <h2> </h2> <table id =" استجابة "> </table> <fieldset> <legend> أدخل رسالتك .. </ legend> <viv> <إدخال type =" text " : 60px "/> <input type =" إرسال "value =" إرسال رسالة "/> <button type =" button "id =" lieve-room "> ترك غرفة </button> </div> </fieldset> < /form> </viv> </body> </html>
في الرمز أعلاه ، يرجى الانتباه إلى النقاط التالية:
إذا كنت ترغب في الاتصال بـ WebSocket على جانب JavaScript ، فيجب عليك بدء الاتصال بالطريقة التالية: WS: // IP: PORT/CONTEXT_PATH/ENDPOINT_URL على سبيل المثال: //0.0.0.0: 8080/HASCOD
طريقة إنشاء اتصال WebSocket بسيط للغاية ، باستخدام var wsocket = websocket جديد ('ws: //0.0.0.0: 8080/hascode/chat/java') ؛
للحصول على المعلومات التي يتم إرجاعها من الخادم ، تحتاج فقط إلى تعيين الطريقة المقابلة للحصول على معلومات الإرجاع في وظيفة رد الاتصال wsocket.onmessage.
إرسال رسالة WebSocket إلى الخادم ، باستخدام wsocket.send () ، حيث يمكن أن تكون الرسائل التي يمكن إرسالها نصية أو بيانات ثنائية.
لإغلاق الاتصال ، يتم استخدام wsocket.close ().
أخيرًا ، نقوم بنشر الكود من خلال حزمة MVN المدمجة الأسماك المدمجة: Run ، ثم يمكننا أن نرى تأثير لقطة الشاشة في بداية هذه المقالة.
ما سبق هو غرفة الدردشة التي يتم تنفيذها باستخدام Javaee7 و WebSockets و GlassFish4.