تشارك هذه المقالة مثالاً لتلبية احتياجات الاتصالات على شبكة الإنترنت عبر الإنترنت. نظرًا لإصدار الويب من وظيفة الدردشة عبر الإنترنت التي تنفذها Java Socket ، للرجوع إليها ، فإن المحتوى المحدد هو كما يلي
خطوات التنفيذ:
1. استخدم مكون AWT والمقبس لتنفيذ عميل واحد بسيط لإرسال الرسائل باستمرار إلى الخادم ؛
2. مع مؤشرات الترابط ، أدرك اتصالًا متعدد العميل للخادم لإرسال الرسائل ؛
3. قم بتنفيذ رسائل عميل إعادة توجيه الخادم إلى جميع العملاء وعرضها على العميل في نفس الوقت ؛
4. قم بتغيير واجهة النافذة التي تم إنشاؤها بواسطة مكون AWT إلى الواجهة التي يتم عرضها بواسطة JSP الأمامي أو HTML ، وقم بتغيير العميل الذي تم تنفيذه بواسطة Socket Java إلى تطبيق التكنولوجيا الأمامية.
هنا ننفذ الوظيفة البسيطة للخطوة الأولى ، الصعوبة هي:
1. لم أستخدم مكون AWT مطلقًا ولم أستخدم أحداث الاستماع المتعلقة بـ Java أبدًا ؛
2. لم أستخدم مآخذ لفترات طويلة من الوقت للتفاعل بين العميل والخادم ، ولم أقم بتطوير بنية CSS حقًا.
رمز لتنفيذ الوظيفة :
عميل الدردشة عبر الإنترنت:
1. قم بإنشاء مخطط واجهة النافذة الرسومية
2. أضف حدثًا قريبًا إلى المخطط التفصيلي
3. أضف مساحة الإدخال ومنطقة عرض المحتوى إلى المخطط التفصيلي
4. أضف حدث إرجاع النقل إلى منطقة الإدخال
5. إنشاء اتصال خادم وأرسل البيانات
حزمة الدردشة. استيراد java.awt.borderlayout ؛ استيراد java.awt.frame ؛ استيراد java.awt.textarea ؛ استيراد java.awt.textfield ؛ استيراد java.awt.event.actionevent ؛ استيراد java.awt.event.actionListener ؛ استيراد java.awt.event.windowadapter ؛ استيراد java.awt.event.windowevent ؛ استيراد java.io.dataOutputStream ؛ استيراد java.io.ioException ؛ استيراد java.net.socket ؛ استيراد java.net.unknownhostexception ؛ / ** * عميل الدردشة عبر الإنترنت 1. قم بإنشاء مخطط واجهة النافذة الرسومية 2. أضف حدثًا قريبًا إلى المخطط العائد 3. أضف منطقة إدخال ومنطقة عرض محتوى إلى المخطط التفصيلي 4. أضف حدث إرجاع النقل لمنطقة الإدخال * 5. قم بإنشاء اتصال خادم وإرسال البيانات * * @Auuthor tuzongxun123 */ public class chat يمتد { // منطقة عرض المحتوى textarea taste = new textarea () ؛ مقبس المقبس الخاص = فارغ ؛ // دفق إخراج البيانات DataOutputStream DataOutputStream = NULL ؛ public static void main (string [] args) {new ChatClient (). launcframe () ؛ } / ** * إنشاء نافذة رسومية بسيطة * * Author: tuzongxun * title: launcframe * param * return void * date 18 مايو ، 2016 9:57:00 am * throws * / public void launcframe () {setLocation (300 ، 200) ؛ this.setsize (200 ، 400) ؛ إضافة (tftxt ، borderlayout.south) ؛ إضافة (Tarea ، BorderLayout.north) ؛ علية()؛ . tftxt.addActionListener (new tflister ()) ؛ setVisible (صحيح) ؛ يتصل()؛ } / ** * الاتصال بالخادم * * Author: Tuzongxun * title: connect * param * @return * date 18 مايو ، 2016 9:56:49 AM * @throws * / public void connect () {try {// إنشاء sentike connective setock = 127.0.0.0.1 ، 8888) ؛ // احصل على دفق إخراج العميل dataOutputStream = جديد dataoutputStream (socket.getOutputStream ()) ؛ System.out.println ("الاتصال بالخادم") ؛ } catch (unknownHostException e) {E.PrintStackTrace () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }} / ** * أغلق موارد العميل * * Author: Tuzongxun * title: disconnect * @param * return void * date 18 مايو ، 2016 9:57:46 AM * throws * / public void disonnect () {try {dataoutputstream.close.close () ؛ socket.close () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }} / ** * أرسل رسالة إلى الخادم * * Author: Tuzongxun * title: sendMessage * paramparam text * @return void * @date 18 ، 2016 9:57:56 am * athrows * / private void sendMessage (telect string) {try {dataoutputstream.writeutf (text) ؛ DataOutputStream.flush () ؛ } catch (ioException e1) {e1.printStackTrace () ؛ }} / ** * منطقة إدخال نافذة الرسومات للاستماع إلى حدث إرجاع النقل * * Author tuzongxun123 * * / private class tflister تنفذ ActionListener {Override public void actionperformed (actionevent e) {String text = tftxt.getText (). trim () ؛ safy.settext (text) ؛ tftxt.settext ("") ؛ // إرسال البيانات إلى الخادم sendMessage (نص) ؛ }}} الخادم:
حزمة الدردشة. استيراد java.io.datainputStream ؛ استيراد java.io.eofexception ؛ استيراد java.io.ioException ؛ استيراد java.net.bindexception ؛ استيراد java.net.serversocket ؛ استيراد java.net.socket ؛ /*** تستخدم Java مكونات Socket و AWT لتنفيذ وظيفة الدردشة عبر الإنترنت ببساطة. يمكن للخادم إدراك الخادم لإرسال الرسائل باستمرار إلى الخادم بعد توصيل عميل واحد* ولكن لا يدعم العديد من العملاء للاتصال في نفس الوقت. والسبب هو أنه بعد الحصول على اتصال العميل في الكود ، سيستمر في الاستماع إلى مدخلات العميل محاطية ، مما يسبب انسدادًا* حتى لا يتمكن الخادم من الاستماع إلى عميل آخر مرتين. إذا كنت ترغب في تنفيذها ، فأنت بحاجة إلى استخدام Tuzongxun123 * *//// فئة عامة {public static void main (string [] args) {// ما إذا كان الخادم قد بدأ بنجاح boolean isStart = false ؛ // Server Socket Serversocket SS = NULL ؛ // مقبس المقبس العميل = فارغ ؛ . حاول {// ابدأ Server SS = New ServersOcket (8888) ؛ } catch (bindException e) {system.out.println ("المنفذ قيد الاستخدام بالفعل") ؛ // أغلق نظام البرنامج. Exit (0) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } حاول {isStart = true ؛ بينما (isStart) {boolean isConnect = false ؛ // ابدأ مقبس الاستماع = ss.accept () ؛ System.out.println ("Connect Connect") ؛ iSconnect = صحيح ؛ بينما (isConnect) {// احصل على دفق إدخال العميل datainputStream = جديد datainputStream (socket.getInputStream ()) ؛ // اقرأ البيانات التي تم تمريرها بواسطة رسالة سلسلة العميل = datainputstream.readutf () ؛ System.out.println ("يقول العميل:" + رسالة) ؛ }}} catch (eofexception e) {system.out.println ("client leable!") ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } أخيرًا {// أغلق المورد ذي الصلة ، حاول {datainputStream.close () ؛ socket.close () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }}}}تابع ، استنادًا إلى اتصال عميل واحد ، تتطلب الخطوة الثانية هنا تنفيذ اتصالات العميل المتعددة ، والتي تتطلب استخدام مؤشرات الترابط. عندما يتصل عميل جديد ، يحتاج الخادم إلى بدء مؤشر ترابط جديد للمعالجة ، وبالتالي حل مشكلة حظر قراءات الحلقة السابقة.
عادة ما تكون هناك طريقتان لكتابة مؤشرات الترابط: دمج مؤشر الترابط أو تنفيذ واجهة Runnable. من حيث المبدأ ، إذا كان من الممكن تنفيذ Runnable ، فلن يتم مورثها لأن طريقة تنفيذ الواجهة أكثر مرونة.
لم يتغير رمز العميل مقارنةً بـ Come Comper ، لذلك يتم نشر رمز الخادم هنا:
تستخدم Java مكونات Socket و AWT و Multi-Thresident ببساطة لتنفيذ خادم وظيفة الدردشة عبر الإنترنت:
بعد توصيل العديد من العملاء ، يتم إرسال الرسائل باستمرار إلى الخادم. بالمقارنة مع الإصدار الأول ، ينصب التركيز على استخدام الخيوط المتعددة. لم ينفذ الخادم وظيفة إعادة التوجيه بعد. لا يمكن للعميل رؤية المعلومات التي يتم إدخالها بنفسها إلا في نافذة الرسومات ، ولا يمكنها رؤية الرسائل المرسلة من قبل العملاء الآخرين.
حزمة الدردشة. استيراد java.io.datainputStream ؛ استيراد java.io.eofexception ؛ استيراد java.io.ioException ؛ استيراد java.net.bindexception ؛ استيراد java.net.serversocket ؛ استيراد java.net.socket ؛ استيراد java.net.socketException ؛ / ** * * * Author tuzongxun123 * */ public class chatserver {public static void main (string [] args) {new chatserver (). start () ؛ } // ما إذا كان الخادم قد بدأ بنجاح خاص بولاء isStart = false ؛ // Server Socket ServerSocket SS = NULL ؛ // مقبس العميل المقبس الخاص = فارغ ؛ public void start () {try {// start server ss = new serversocket (8888) ؛ } catch (bindException e) {system.out.println ("المنفذ قيد الاستخدام") ؛ // أغلق نظام البرنامج. Exit (0) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } حاول {isStart = true ؛ بينما (isStart) {// ابدأ الاستماع Socket = Ss.Accept () ؛ System.out.println ("Connect Connect") ؛ // ابدأ عميل مؤشر ترابط العميل العميل = عميل جديد (Socket) ؛ موضوع جديد (عميل) .start () ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ } أخيرًا {// أغلق الخدمة ، حاول {ss.close () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }}} / ** * مؤشر ترابط العميل * * Author tuzongxun123 * * / Class Client يطرف Runnable {// Socket Socket Private Socket = null ؛ // دفق إدخال العميل datainputstream datainputStream = null ؛ isconnect boolean الخاص = false ؛ العميل العام (مقبس المقبس) {this.socket = socket ؛ حاول {isConnect = true ؛ // الحصول على دفق إدخال العميل datainputStream = جديد datainputStream (socket.getInputStream ()) ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }} Override public void run () {isConnect = true ؛ جرب {بينما (isConnect) {// اقرأ البيانات التي تم تمريرها بواسطة رسالة سلسلة العميل = datainputstream.readutf () ؛ System.out.println ("يقول العميل:" + رسالة) ؛ }} catch (eofexception e) {system.out.println ("client learled!") ؛ } catch (socketException e) {system.out.println ("العميل مغلق !!!") ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } أخيرًا {// أغلق المورد ذي الصلة Try {datainputStream.close () ؛ socket.close () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }}}}}يقدم ما سبق بشكل أساسي وظيفة استخدام مؤشرات الترابط لتمكين الخادم لتلقي طلبات متعددة الرفع. هنا ، يحتاج العميل إلى تلقي رسائل متعددة الرفع أثناء إعادة توجيه الرسائل إلى كل عميل متصل ، ويجب أن يكون العميل قادرًا على عرضها في منطقة عرض المحتوى ، وبالتالي تحقيق دردشة جماعية بسيطة عبر الإنترنت.
عند تطبيق إعادة توجيه العميل ، فإنه ليس أكثر من زيادة دفق الإخراج ؛ من قبل ، أرسل العميل فقط ولكن لم يستقبله ، لذلك يحتاج أيضًا إلى تغيير العميل لتلقي رسائل الخادم بطريقة دائرية ، لذلك يحتاج أيضًا إلى تنفيذ متعدد الخيوط.
عند تنفيذ هذه الوظيفة ، تذكرت عن طريق الخطأ وظيفة توليد رموز التحقق عشوائيًا ، لذلك كان لدي إلهام مفاجئ لإنشاء اسم بشكل عشوائي لكل عميل ، بحيث يبدو أنه عند الإخراج ، يبدو أكثر مثل الدردشة الجماعية ، ليس فقط إخراج الرسائل ، ولكن أيضًا يمكنه معرفة من هو.
بعد تنفيذ هذه الوظائف ، يمكنك بشكل أساسي إجراء دردشة جماعية عبر الإنترنت في نفس الوقت لعدة أشخاص. نظرًا لوجود طريقة رئيسية في الكود ، يمكنك جعل كل من الخادم والعميل في حزم جرة قابلة للتنفيذ. يمكنك الرجوع إلى منشور آخر في مدونة لي: استخدم Eclipse لإنشاء حزمة جرة قابلة للتنفيذ برنامج Java.
ثم انقر نقرًا مزدوجًا فوق ملف الجرة المقابلة على سطح المكتب لبدء الخادم والعميل ، ولم تعد بحاجة إلى الاعتماد على Eclipse لتشغيلها.
رمز العميل المعدل كما يلي:
حزمة الدردشة. استيراد java.awt.borderlayout ؛ استيراد java.awt.frame ؛ استيراد java.awt.textarea ؛ استيراد java.awt.textfield ؛ استيراد java.awt.event.actionevent ؛ استيراد java.awt.event.actionListener ؛ استيراد java.awt.event.windowadapter ؛ استيراد java.awt.event.windowevent ؛ استيراد java.io.datainputStream ؛ استيراد java.io.dataOutputStream ؛ استيراد java.io.ioException ؛ استيراد java.net.socket ؛ استيراد java.net.unknownhostexception ؛ استيراد java.util.random ؛ /** * خطوات عميل الدردشة عبر الإنترنت: * 1. إنشاء مخطط واجهة النافذة الرسومية*2. أضف حدثًا قريبًا للمخطط العائد*3. أضف مساحة إدخال ومنطقة عرض محتوى في المخطط التفصيلي*4. أضف حدث إرجاع النقل لمنطقة الإدخال*5. إنشاء اتصال خادم وأرسل البيانات * * Author Tuzongxun123 * */ فئة عامة ChatClient يمتد الإطار {/ ** * */ private Static Final Long SerialVersionuid = 1L ؛ // منطقة إدخال المستخدم الخاصة TextField Tftxt = new TextField () ؛ // منطقة عرض المحتوى textarea taste = new textarea () ؛ مقبس المقبس الخاص = فارغ ؛ // دفق إخراج البيانات DataOutputStream DataOutputStream = NULL ؛ // دفق إدخال البيانات الخاص datainputStream datainputStream = null ؛ isconnect boolean الخاص = false ؛ THELL TRECEIVE = مؤشر ترابط جديد (NEWSIVETHREAD ()) ؛ اسم السلسلة = "" ؛ public static void main (string [] args) {chatclient chatclient = new chatclient () ؛ chatclient.createName () ؛ chatclient.launcframe () ؛ } / ** * إنشاء نافذة رسومية بسيطة * * Author: tuzongxun * title: launcframe * param * return void * date 18 مايو ، 2016 9:57:00 am * throws * / public void launcframe () {setLocation (300 ، 200) ؛ this.setsize (200 ، 400) ؛ إضافة (tftxt ، borderlayout.south) ؛ إضافة (Tarea ، BorderLayout.north) ؛ // حدد الحجم الأمثل للإطار وفقًا للتخطيط في النافذة وفضل الحزمة المفضل لحزمة المكونات () ؛ . tftxt.addActionListener (new tflister ()) ؛ // قم بتعيين النافذة لرؤية setVisible (true) ؛ يتصل()؛ // ابدأ الموضوع الذي يقبل الرسالة treceive.start () ؛ } / ** * الاتصال بالخادم * * Author: Tuzongxun * title: connect * param * @return * date 18 مايو ، 2016 9:56:49 AM * @throws * / public void connect () {try {// إنشاء sentike connective setock = 127.0.0.0.1 ، 8888) ؛ // احصل على دفق إخراج العميل dataOutputStream = جديد dataoutputStream (socket.getOutputStream ()) ؛ datainputStream = جديد datainputStream (socket.getInputStream ()) ؛ System.out.println ("الاتصال بالخادم") ؛ iSconnect = صحيح ؛ } catch (unknownHostException e) {E.PrintStackTrace () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }} // إنشاء اسم العميل العشوائي العشوائي createName () {string [] str1 = {"a" ، "b" ، "c" ، "d" ، "e" ، "f" ، "g" ، "h" ، "i" ، "j" ، "j" ، "k" ، "l" ، "m" ، "n" ، "o" ، "p" ، " "W" ، "X" ، "Y" ، "Z" ، "1" ، "2" ، "3" ، "4" ، "5" ، "6" ، "7" ، "8" ، "9" ، "0" ، "A" ، "B" ، "C" ، "C" ، "P" ، "Q" ، "R" ، "S" ، "T" ، "U" ، "V" ، "W" ، "X" ، "y" ، "z"} ؛ ران عشوائي = جديد عشوائي () ؛ لـ (int i = 0 ؛ i <6 ؛ i ++) {// long num = math.Round (math.random () * (str1.length - 0)+0) ؛ // int n = (int) num ؛ int n = run.nextint (str1.length) ؛ if (n <str1.length) {string str = str1 [n] ؛ name = name + str ؛ system.out.println (name) ؛ } آخر {i-- ؛ يكمل؛ }} this.settitle (name) ؛ } / ** * أغلق موارد العميل * * Author: Tuzongxun * title: disconnect * param * @return * date 18 مايو ، 2016 9:57:46 am * athrows * / public void disonnect () {try {isConnect = false ؛ // Stop Thread Treceive.join () ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ } أخيرًا {try {if (dataOutputStream! = null) {dataOutputStream.close () ؛ } if (socket! = null) {socket.close () ؛ مقبس = فارغ ؛ }} catch (ioException e) {E.PrintStackTrace () ؛ }}} / ** * أرسل رسالة إلى الخادم * * author: tuzongxun * title: sendMessage * paramparam text * @return * @date 18 ، 2016 9:57:56 am * thhrows * / private void sendmessage (text string) {try {dataoutream.writeutf ( DataOutputStream.flush () ؛ } catch (ioException e1) {e1.printStackTrace () ؛ }} / ** * منطقة إدخال النافذة الرسومية النقل الاستماع لحدث الإرجاع * * Author Tuzongxun123 * * / private class tflister actionListener {Override public void ActionPerformed (Actionevent e) {String text = tftxt.gettext (). trim () ؛ // مسح معلومات منطقة الإدخال tftxt.settext ("") ؛ // إرسال البيانات إلى الخادم بعد الضغط على النقل إلى SendMessage (نص) ؛ }} فئة خاصة stencivethRead تنفذ Runnable {Override public void run () {try {while (isConnect) {string message = datainputstream.readutf () ؛ system.out.println (message) ؛ String txt = safy.getText () ؛ if (txt! = null &&! ". } saM.settext (message) ؛ }} catch (ioException e) {E.PrintStackTrace () ؛ }}}} رمز الخادم المعدل كما يلي:
حزمة الدردشة. استيراد java.io.datainputStream ؛ استيراد java.io.dataOutputStream ؛ استيراد java.io.eofexception ؛ استيراد java.io.ioException ؛ استيراد java.net.bindexception ؛ استيراد java.net.serversocket ؛ استيراد java.net.socket ؛ استيراد java.net.socketException ؛ استيراد java.util.arraylist ؛ استيراد java.util.list ؛ /** * يستخدم Java مكونات Socket و AWT ومتعددة الخيوط ببساطة لتنفيذ خادم وظيفة الدردشة عبر الإنترنت: * ينفذ الخادم أن معلومات العميل المستلمة يتم إعادة توجيهها إلى جميع العملاء المتصلين ، ويسمح للعميل بقراءة هذه المعلومات وعرضها في منطقة عرض المحتوى. * * author tuzongxun123 * */ public class chatserver {public static void main (string [] args) {new chatserver (). start () ؛ } // ما إذا كان الخادم قد بدأ بنجاح في Boolean isStart = false ؛ // Server Socket ServerSocket SS = NULL ؛ // مقبس العميل المقبس الخاص = فارغ ؛ // حفظ قائمة مجموعة العميل <Client> العملاء = جديد ArrayList <Plient> () ؛ public void start () {try {// ابدأ الخادم ss = new serversocket (8888) ؛ } catch (bindException e) {system.out.println ("المنفذ قيد الاستخدام") ؛ // أغلق نظام البرنامج. Exit (0) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } حاول {isStart = true ؛ بينما (isStart) {// ابدأ مقبس الاستماع = ss.accept () ؛ System.out.println ("Connect Connect") ؛ // ابدأ عميل عميل مؤشر ترابط العميل = عميل جديد (Socket) ؛ موضوع جديد (عميل) .start () ؛ العملاء. add (client) ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ } أخيرًا {// أغلق الخدمة ، حاول {ss.close () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }}} / ** * مؤشر ترابط العميل * * Author tuzongxun123 * * / عميل الفئة الخاصة يطرف Runnable {// Socket Socket Private Socket = null ؛ // دفق إدخال العميل datainputstream datainputStream = null ؛ // إخراج العميل دفق البيانات dataoutputstream الخاصة = null ؛ isconnect boolean الخاص = false ؛ العميل العام (مقبس المقبس) {this.socket = socket ؛ حاول {isConnect = true ؛ // الحصول على دفق إدخال العميل datainputStream = جديد datainputStream (socket.getInputStream ()) ؛ // احصل على دفق إخراج العميل dataOutputStream = جديد dataoutputStream (socket.getOutputStream ()) ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }} / ** * Bulk Send (إلى الأمام) بيانات إلى العميل * * Author: tuzongxun * title: sendMessagetOclients * param @param message * @return date 18 ، 2016 11:28:10 am * / / public void sendmessagetoclients (string message) } catch (socketException e) {} catch (ioException e) {e.printStackTrace () ؛ }} Override public void run () {isConnect = true ؛ العميل C = فارغ ؛ جرب {بينما (isConnect) {// اقرأ البيانات التي تم تمريرها بواسطة رسالة سلسلة العميل = datainputstream.readutf () ؛ System.out.println ("يقول العميل:" + رسالة) ؛ لـ (int i = 0 ؛ i <clients.size () ؛ i ++) {c = clients.get (i) ؛ C.SendMessageToclients (رسالة) ؛ }}} catch (eofexception e) {system.out.println ("client leable!") ؛ } catch (socketException e) {if (c! = null) {clients.remove (c) ؛ } system.out.println ("العميل مغلق !!!") ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } أخيرًا {// أغلق المورد ذي الصلة ، حاول {if (datainputStream! = null) {datainputStream.close () ؛ } if (socket! = null) {socket.close () ؛ مقبس = فارغ ؛ }} catch (ioException e) {E.PrintStackTrace () ؛ }}}}}}}}}}}}}}}}}}}}}دعنا نقدمها لك أولاً ، ثم قم بتحديثها لك إذا كان هناك أي محتوى جديد.
فيما يتعلق بتحقيق وظيفة الدردشة عبر الإنترنت ، يمكنك أيضًا الرجوع إلى المقالات التالية للتعلم:
تنفذ Java مشاركة وظيفة غرفة الدردشة TCPSOCKET بسيطة
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع ، وآمل أن تتمكن من الاستمرار في الانتباه إلى محتوى أكثر إثارة من Wulin.com.