مكتوبة من قبل:
ربما تكون نهاية الفترة ، وتصميمات الدورات المختلفة تأتي واحدة تلو الأخرى. في الآونة الأخيرة ، رأيت سؤالين وإجابات على CSSDN ، وهو كتابة برنامج دردشة قائم على المقبس. صادفت أن أفعل شيئًا مع Socket مؤخرًا. بدافع الاهتمام ، استغرقت بضع ليال من وقت الفراغ لضرب واحد. حاليا ، يدعم فقط الدردشة المفردة والدردشة الجماعية ووظائف نقل الملفات. أولاً ، قمت بنشر صورة برنامج قبيحة (UI مكتوب في Java Swing ، لقد نسيت هذه الصورة لفترة طويلة ، لذلك لم أستطع إلا قراءة API JDK لكتابة واحدة) ، كما هو موضح أدناه:
تصميم الخادم:
يحتوي الخادم على عمليتين رئيسيتين: إحداهما هو حظر مقبس العميل المستلم وأداء معالجة الاستجابة ، والآخر هو اكتشاف نبضات العميل. إذا لم يرسل العميل نبضات القلب لفترة من الوقت ، فقم بإزالة العميل ، وقم بإنشاء Serversocket ، ثم ابدأ تجمعين مؤشرات ترابط للتعامل مع هذين الأمرين (NewFixedThreadPool ، NewsCheduleDthreadPool). فئات المعالجة المقابلة هي SocketDispatcher و SocketSchedule. يتم توزيع SocketDispatcher على Sockethandlers مختلف وفقًا لطلبات المقبس المختلفة. يضيف SocketWrapper غلاف قذيفة إلى المقبس ، ويسجل أحدث وقت تفاعل للمقبس مع Socketholder يخزن مجموعة المقبس التي تتفاعل حاليًا مع الخادم. التصميم كما يلي:
تصميم العميل:
ينقسم تصميم العميل بشكل أساسي إلى جزأين ، وهما تصميم وحدة اتصالات التوصيل والتصميم المتعلق بواجهة المستخدم
يشبه تصميم اتصالات مقبس العميل في الواقع عملية الخادم. الفرق هو أن الخادم يتلقى حزم نبضات ، بينما يرسل العميل حزم نبضات القلب. نظرًا لأن العميل يتواصل فقط مع خادم واحد (يتم توزيع الاتصالات بين العملاء أيضًا بواسطة الخادم) ، يتم استخدام مجموعة مؤشرات ترابط بحجم 2 فقط للتعامل مع هذين الأمرين (NewFixedThreadPool (2)). فئات المعالجة المقابلة هي مستقبِل و keepalivedog. عند تهيئة المستقبِل ، يتم إرسال رد الاتصال كرد اتصال على العميل يستقبل رسالة الخادم. التنفيذ الافتراضي لاستدعاء رد الاتصال هو DefaultCallback. يتم توزيع DefaultCallback على معالجات مختلفة من خلال HF وفقًا للأحداث المختلفة. يقوم العميل بتخزين معلومات العميل الحالية. التصميم كما يلي:
التصميم المتعلق بواجهة المستخدم ، لا أخطط لكتابة واجهة المستخدم بنفسي. بعد كل شيء ، ما كتبته هو قبيح للغاية ، لذلك قد أطلب من زملائي في الفصل أو أصدقائي مساعدتي في ضربه لاحقًا ، لذلك أقوم بتسليم معالجة حدث واجهة المستخدم إلى العمل للتعامل معها ، وفصل تصميم واجهة المستخدم واستجابة الأحداث. جميع واجهة المستخدم يرث JFrame وتنفيذ واجهة العرض. يتم الحصول على فئة تنفيذ المعالج أعلاه من خلال جهاز التوجيه (سيتم إرجاعه مباشرة إذا كان موجودًا ، وسيتم إنشاؤه وتخزينه إذا لم يكن موجودًا). يوفر العرض إنشاء واجهة المستخدم () ، والحصول على حاوية () ، والحصول على المكونات في GetComponent () ، و Display () ، و Recycle Trash () ؛ ResultWrapper و ReseTholder هي فقط لإنشاء وتخزين علامات الدردشة.
تصميم الوحدة الشائعة:
الوحدة الشائعة هي تفاعل البيانات بشكل أساسي ، حيث يتم استخدام بيانات JSON للتفاعل. تحدد الوحدة النمطية المشتركة أنواعًا مختلفة من معلومات التفاعل ، ونقل معلومات المقبس التي تنفذها SendHelper ، I18N هي اللغة ، و ConstantValue هي التكوين والثوابت في النظام (جميع الثوابت هي واجهات ، والتي قد لا تكون جيدة جدًا). بالنسبة إلى ReturnMessage ، فإنه يحتوي على سلسلة من DTOs كسمات محتوىها.
إدخال البرنامج:
أخيرًا ، يتم إعطاء برنامج الدخول للخادم والعميل (يتم تعليق الرمز الكامل على CSDN ، وسيتم تحديثه بشكل مستمر إذا كان لديك وقت ، وسيكون المقالة عنوان في النهاية)
بوابة الخادم:
package yaolin.chat.server ؛ import java.io.ioException ؛ استيراد java.net.serversocket ؛ import java.util.date ؛ import java.util.concurrent.executorservice ؛ import java.util.concurrent.executors ؛ import java.Util.Util.scurent.schedexexextervice ؛ java.util.concurrent.timeUnit ؛ استيراد yaolin.chat.common.constantvalue ؛ استيراد yaolin.chat.util.loggerutil ؛/*** خادم* Author yaolin*/خادم الفئة العامة {خادم خاص خاص ؛ تجمع الخاصين النهائيين للخدمة النهائية ؛ server public () يلقي ioException {server = new serversoCkE (constantValue.server_port) ؛ pool = Executors.NewFixedThreadPool (constantValue.max_pool_size) ؛ } public void start () {try {ScripedExecutorService thement = Executors.NewScheduledThreadPool (1) ؛ // مشاهدة الكلب. استثناء؟؟ الجدول الزمني. بينما (صحيح) {pool.execute (socketDispatcher جديد (server.accept ())) ؛ loggerUtil.info ("قبول عميل في" + تاريخ جديد ()) ؛ }} catch (ioException e) {pool.shutdown () ؛ }} public static void main (string [] args) {try {new server (). start () ؛ } catch (ioException e) {loggerUtil.error ("فشل Server START! ->" + E.GetMessage () ، e) ؛ }}} بوابة العميل:
package yaolin.chat.client ؛ استيراد java.io.ioException ؛ استيراد javax.swing.joptionpane ؛ استيراد yaolin.chat.client.callback.defaultcallback ؛ استيراد yaolin.chat.client.view.router yaolin * */public class niloaychat {public static void main (string [] args) {registerandloginview v = (registerandloginview) Router.getView (registerandloginview.class) .create () ؛ حاول {v.display () ؛ عميل العميل = عميل جديد (DefaultCallback () جديد) ؛ client.start () ؛ ClientHolder.setClient (Client) ؛ } catch (ioException e) {joptionpane.showmessagedialog (v.getContentPane () ، e.getMessage ()) ؛ }}} تنزيل رمز المصدر: العرض التوضيحي
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.