نظرًا لأنني بحاجة إلى إنشاء تصميم دورة شبكة الكمبيوتر الشبكة ولا أريد القيام بأسلاك الشبكة أو تكوين جهاز توجيه LAN ، وما إلى ذلك ، قررت أخيرًا استخدام Socket لكتابة غرفة دردشة LAN استنادًا إلى Java:
لمزيد من المعلومات حول المقبس والبرمجة الشبكات ، يرجى الرجوع إلى مقالتي الأخرى: البرمجة المستندة إلى Java Socket
يعتمد البرنامج على بنية C/S ، أي وضع خادم العميل.
الخادم:
IP الافتراضي هو IP الأصلي
يحتاج كلا الطرفين إلى تحديد رقم المنفذ لتعيين الحد الأقصى لعدد الأشخاص المتصلين. يمكن بدء الواجهة وإغلاقها لعرض المستخدم والاسم عبر الإنترنت (لم يتم عرض هذه الوحدة هنا)
عميل:
تحتاج إلى تعيين عنوان IP الخادم يدويًا (LAN)
قم بتعيين رقم المنفذ يدويًا وأدخل الاسم لتوصيل واجهة تشغيل البرنامج على النحو التالي:
الخادم:
عميل:
سأقوم بتحميل الكود المحدد في النهاية.
هناك العديد من أوجه القصور في البرامج ، مثل:
لا يوجد تحسين تقاطع مع قاعدة البيانات: يمكن تخزين جميع المستخدمين في قاعدة البيانات ، ويمكن أيضًا وضع سجلات الدردشة في قاعدة البيانات. لم يتم تنفيذ تحسين الدردشة الفردي: لا يزال هناك العديد من أوجه القصور في طريقة إعادة تعريف الدردشة الفردية. إذا كنت مهتمًا به ، عد ودرسها ببطء.
فيما يلي ثلاثة رموز للبرنامج:
user.java
مستخدم الفئة العامة { / *** فئة معلومات المستخدم* تستخدم لتسجيل المعلومات الشخصية للمستخدم: الاسم و IP* / اسم السلسلة الخاصة ؛ سلسلة IP الخاصة ؛ المستخدم العام (اسم السلسلة ، سلسلة IP) {this.name = name ؛ this.ip = ip ؛ } السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ } السلسلة العامة getip () {return ip ؛ } public void setip (string ip) {this.ip = ip ؛ }}server_more.java
استيراد java.awt.borderlayout ؛ استيراد java.awt.color ؛ استيراد java.awt.gridlayout ؛ استيراد java.awt.toolkit ؛ استيراد java.awt.event.actionevent ؛ import java.io.bufferedreader ؛ استيراد java.io.ioException ؛ استيراد java.io.inputstreamreader javax.swing.defaultlistmodel ؛ استيراد javax.swing.jbutton ؛ استيراد javax.swing.jframe ؛ استيراد javax.swing.jlabel ؛ استيراد javax.swing.jlist javax.swing.jsplitpane ؛ import javax.swing.jtextarea ؛ import javax.swing.jtextfield ؛ import javax.swing.border.titledborder ؛ public class server_more {private jframe frame ؛ jtextarea المحتوى الخاص ؛ // Text Field Private JTextfield TXT_Message ؛ // المستخدمة لعرض معلومات النص jtextfield txt_max ؛ // قم بتعيين الحد الأقصى لعدد الأشخاص المتصلين بـ JTextfield TXT_PORT ؛ // تعيين رقم المنفذ الخاص jbutton btn_start ؛ // Start Button Private JButton BTN_STOP ؛ // disconnect button private jbutton btn_send ؛ // إرسال زر jpanel northpanel الخاص ؛ // North Panel Private JPanel Southpanel ؛ // South Panel Private JScrollpane RightPanel ؛ // غادر شريط التمرير الخاص JScrollpane LeftPanel ؛ // Right Scroll Bar Private JSplitpane Centerplit ؛ // Split Line Private Jlist stist. // مكون فردي خاص defaultListModel listModel ؛ ServerSocket Serversocket ؛ ServerThread ServerThread الخاص ؛ عملاء ArrayList الخاص <ClientThRead> ؛ منطقية خاصة isStart = false ؛ // الطريقة الرئيسية ، إدخال تنفيذ البرنامج العام الثابت الفراغ الرئيسي (سلسلة [] args) {new server_more () ؛ }. يعود؛ } if (clients.size () == 0) {joptionpane.showmessagedialog (الإطار ، "لا يوجد مستخدم على الإنترنت ، لا يمكن إرسال الرسائل!" ، "خطأ" ، joptionpane.error_message) ؛ يعود؛ } string message = txt_message.getText (). trim () ؛ if (message == null || message.equals ("")) {joptionpane.showmessagedialog (الإطار ، "الرسالة لا يمكن أن تكون فارغة!" ، "خطأ" ، joptionpane.error_message) ؛ يعود؛ } sendServerMessage (message) ؛ // mass server message contentarea.append ("server:" + txt_message.getText () + "/r/n") ؛ txt_message.settext (null) ؛ } // إنشاء طريقة الإسقاط public server_more () {frame = new JFrame ("server") ؛ // قم بتغيير أيقونة jframe: //frame.seticOnimage(toolkit.getDefaultToolkit().createImage(client.class.getResource("qq.png "))) ؛ //frame.seticonimage(toolkit.getDefaultToolkit().createImage(server.class.getResource("qq.png "))) ؛ contentArea = new JTextarea () ؛ contentarea.setedable (false) ؛ contentarea.setForeGround (color.blue) ؛ txt_message = new JTextField () ؛ txt_max = new JTextField ("30") ؛ txt_port = new jtextfield ("6666") ؛ btn_start = new jbutton ("start") ؛ btn_stop = new jbutton ("stop") ؛ btn_send = new jbutton ("send") ؛ btn_stop.setEnabled (false) ؛ listModel = new DefaultListModel () ؛ userList = new JList (listModel) ؛ Southpanel = New JPanel (New BorderLayout ()) ؛ Southpanel.setBorder (جديد بعنوان ("كتابة رسالة")) ؛ southpanel.add (txt_message ، "center") ؛ southpanel.add (btn_send ، "east") ؛ LeftPanel = New JScrollPane (قائمة المستخدمين) ؛ LeftPanel.setBorder (جديد بعنوان ("مستخدم عبر الإنترنت")) ؛ RightPanel = new jscrollpane (contentarea) ؛ RightPanel.setBorder (جديد بعنوان ("منطقة عرض الرسائل")) ؛ CenterPlit = New JSplitPane (jsplitpane.horizontal_split ، LeftPanel ، rightpanel) ؛ Centerplit.setDividerLocation (100) ؛ Northpanel = new jpanel () ؛ Northpanel.setLayout (New GridLayout (1 ، 6)) ؛ Northpanel.Add (New Jlabel ("الحد الأعلى")) ؛ northpanel.add (txt_max) ؛ Northpanel.add (New Jlabel ("Port")) ؛ northpanel.add (txt_port) ؛ northpanel.add (btn_start) ؛ northpanel.add (btn_stop) ؛ northpanel.setBorder (جديد بعنوان ("معلومات التكوين")) ؛ frame.setLayout (New BorderLayout ()) ؛ Frame.Add (Northpanel ، "North") ؛ Frame.Add (CenterPlit ، "Center") ؛ Frame.Add (Southpanel ، "South") ؛ Frame.Setsize (600 ، 400) ؛ //frame.setsizeizize(toolkit.getDefaultToolkit (). getScreensize ()) ؛ // تعيين شاشة ملء الشاشة int screen_width = toolkit.getDefaultToolkit (). getScreensize (). العرض ؛ int screen_height = toolkit.getDefaultToolkit (). getScreensize (). الارتفاع ؛ frame.setLocation ((screen_width - frame.getWidth ()) / 2 ، (screen_height - frame.getheight ()) / 2) ؛ frame.setVisible (صحيح) ؛ // الحدث عند إغلاق Frame.AdDwIndOwListener (New WindowAdapter () {public void windowclosing (windowevent e) {if (isStart) {closeServer () ؛ // أغلق server} system.exit (0) ؛ // OPROMPHING}}) ؛ // event txt_message.addActionListener (new ActionListener () {public void actionperformed (ActionEvent e) {send () ؛}}) ؛ // Event BTN_SEND.AddActionListener (New ActionListener () {public void actionperformed (ActionEvent arg0) {send () ؛}}) ؛ // الحدث BTN_START.AddActeRender (new ActionListener () {public void actionperformed (Actionevent e) {if (isStart) {joptionpane.showmessagedialog (frame ، "الخادم بالفعل في حالة البدء ، لا تبدأ بشكل متكرر!" ، "joptionpane.error_mess) ؛ max = integer.parseint (txt_max.gettext () ؛ integer.parseint (txt_port.gettext () ؛ PORT + "/R/N") ؛ txt_max.setEnabled (false) ؛ txt_port.setEnabled (false) ؛ btn_stop.setEnabled (true) ؛ } catch (استثناء exc) {joptionpane.showmessagedialog (الإطار ، exc.getMessage () ، "خطأ" ، joptionpane.error_message) ؛ }}}) ؛ // Event BTN_STOP.AddActionListener (New ActionListener () {public void actionperformed (ActionEvent e) {if (! isStart) {joptionpane.showmessagedialog (frame ، "الخادم لم يبدأ بعد ، لا حاجة إلى التوقف!" ، "خطأ" ، joptionpane.error_message) ؛ BTN_START.SETENTER (TRUE) ؛ joptionpane.showmessagedialog (الإطار ، "استثناء عندما يتم إيقاف الخادم!" ، "خطأ" ، joptionpane.error_message) ؛ }. ServersOcket = ServersOcket (منفذ) ؛ serverTherD = new ServerThRead (ServersOcket ، Max) ؛ serverthread.start () ؛ isStart = صحيح ؛ } catch (bindException e) {isStart = false ؛ رمي BindException جديد ("تم احتلال رقم المنفذ ، يرجى تغييره!") ؛ } catch (استثناء e1) {e1.printstacktrace () ؛ isStart = false ؛ رمي bindexception جديد ("ابدأ استثناء الخادم!") ؛ }} // أغلق serversuppressWarnings ("deprecation") public void closteserver () {try {if (serverthread! = null) serverThread.stop () ؛ // إيقاف مؤشر ترابط الخادم (int i = clients.size ()-1 ؛ clients.get (i) .getWriter (). العملاء. get (i) .getWriter (). // reper the Resource Clients.get (i) .stop () ؛ // إيقاف هذا الموضوع الذي يخدم عملاء العميل. العملاء. العملاء. get (i) .socket.close () ؛ العملاء. remove (i) ؛ } if (serversoCKET! = null) {serversocket.close () ؛ // أغلق اتصال خادم-side} listmodel.removeallelements () ؛ // مسح قائمة المستخدم isStart = false ؛ } catch (ioException e) {E.PrintStackTrace () ؛ isStart = صحيح ؛ }} // message bulk server message public void sendServerMessage (string message) {for (int i = clients.size ()-1 ؛ i> = 0 ؛ i--) {clients.get (i) .getWriter (). println ("server:" + message + " العملاء. get (i) .getWriter (). }} // Server Thread Class Class ServerThread يمتد Thread {serversocket serversite ؛ private int max ؛ // العدد العلوي للأشخاص // طريقة إنشاء خادم خادم ServerThread (Serversocket STERVESCTOCKE ، int MAX) this.max = max ؛ } public void run () {بينما (true) {// استمر في انتظار ارتباط العميل ، حاول {socket socket = serversocket.accept () ؛ if (clients.size () == max) {// إذا تم الوصول إلى الحد الأقصى لعدد الأشخاص bufferreader r = جديد bufferreader (inputstreamreader جديد (socket.getInputStream ())) ؛ printWriter w = new printWriter (Socket .getOutputStream ()) ؛ // تلقي معلومات المستخدم الأساسية من سلسلة العميل inf = readline () ؛ StringTokenizer st = new StringTokenizer (inf ، "@") ؛ مستخدم المستخدم = مستخدم جديد (st.nextToken () ، st.nextToken ()) ؛ . W.Flush () ؛ // إطلاق المورد R.Close () ؛ W.Close () ؛ socket.close () ؛ يكمل؛ } clientTherThread Client = new ClientThRead (Socket) ؛ client.start () ؛ // ابدأ مؤشرات الترابط لعملاء خدمة العميل هذه. listmodel.addelement (client.getuser (). getName ()) ؛ // تحديث قائمة المحتوى عبر الإنترنت. } catch (ioException e) {E.PrintStackTrace () ؛ }}}}}. قارئ Bufferrederer الخاص ؛ كاتب printwriter الخاص مستخدم خاص للمستخدم ؛ Public BufferedReader GetReader () {return reader ؛ } printwriter public GetWriter () {return constr ؛ } المستخدم العام getUser () {return user ؛ } // Constructor of Client Thread Public ClientThRead (Socket Socket) {try {this.socket = socket ؛ reader = جديد bufferedReader (new inputStreamReader (Socket .getInputStream ())) ؛ كاتب = new printWriter (socket.getOutputStream ()) ؛ // تلقي معلومات المستخدم الأساسية من سلسلة العميل inf = reader.ReadLine () ؛ StringTokenizer st = new StringTokenizer (inf ، "@") ؛ المستخدم = مستخدم جديد (st.nextToken () ، St.NextToken ()) ؛ // ردود الفعل اتصالات اتصال معلومات الكاتب. الكاتب. flush () ؛ // ردود الفعل إلى معلومات المستخدم الحالية عبر الإنترنت إذا (client.size ()> 0) {String temp = "" ؛ لـ (int i = clients.size ()-1 ؛ i> = 0 ؛ i--) {temp + = (clients.get (i) .getuser (). } writer.println ("userList@" + clients.size () + "@" + temp) ؛ الكاتب. flush () ؛ }. العملاء. get (i) .getWriter (). }} catch (ioException e) {E.PrintStackTrace () ؛ }} suppressWarnings ("deprecation") public void run () {// تلقي رسائل مستمرة من العميل للمعالجة. رسالة سلسلة = فارغة ؛ بينما (صحيح) {try {message = reader.ReadLine () ؛ // تلقي رسائل العميل if (message.equals ("close")) // command Onlofline {contentarea.append (this.getuser (). getName () + this.getuser (). // افصل وإصدار الموارد reader.close () ؛ الكاتب. socket.close () ؛ // أرسل الأمر غير المتصل بالمستخدم إلى جميع المستخدمين عبر الإنترنت لـ (int i = clients.size ()-1 ؛ i> = 0 ؛ i--) {clients.get (i) .getWriter (). العملاء. get (i) .getWriter (). } listModel.RemoveElement (user.getName ()) ؛ // تحديث القائمة عبر الإنترنت // حذف مؤشر ترابط خدمة العميل هذا لـ (int i = clients.size ()-1 ؛ i> = 0 ؛ clients.remove (i) ؛ // حذف مؤشر ترابط خدمة المستخدم temp.stop () ؛ // إيقاف تشغيل مؤشر ترابط الخدمة هذا ؛ }}} else {dispathermessage (message) ؛ // forward message}} catch (ioException e) {E.PrintStackTrace () ؛ }}} // message message public void dispathermessage (string message) {StringTokenizer stringtokenizer = new StringTokenizer (message ، "@") ؛ String Source = StringTokenizer.nextToken () ؛ string owner = stringtokenizer.nextToken () ؛ content string = stringTokenizer.nextToken () ؛ Message = source + ":" + content ؛ contentarea.append (رسالة + "/r/n") ؛ if (owner.equals ("all")) {// bulk for (int i = clients.size ()-1 ؛ i> = 0 ؛ i--) {client.get (i) .getWriter (). العملاء. get (i) .getWriter (). }}}}}}}client_more.java
استيراد java.awt.borderlayout ؛ استيراد java.awt.color ؛ استيراد java.awt.gridlayout ؛ استيراد java.awt.toolkit ؛ استيراد java.awt.event.actionevent ؛ import java.io.bufferedreader ؛ استيراد java.io.ioException ؛ استيراد java.io.inputstreamreader javax.swing.jbutton ؛ import javax.swing.jframe ؛ import javax.swing.jlabel ؛ import javax.swing.jlist ؛ import javax.swing.joptionpane javax.swing.jtextarea ؛ import javax.swing.jtextfield ؛ import javax.swing.border.titledborder ؛ public client_more {private jframe frame ؛ قائمة مستخدم JLILD الخاصة ؛ خاص JTextarea Textarea ؛ خاص JTextfield Textfield ؛ Private JTextfield TXT_PORT ؛ Private JTextfield TXT_HOSTIP ؛ Private JTextfield txt_name ؛ الخاص jbutton btn_start ؛ الخاص jbutton btn_stop ؛ الخاص jbutton btn_send ؛ الخاص jpanel northpanel ؛ الخاص jpanel southpanel ؛ jscrollpane jscrollpane rightscroll ؛ jscrollpane الخاص لليسارول ؛ jsplitpane الخاص conterSplit ؛ Private DefaultListModel ListModel ؛ isconnection isconnection = false ؛ مقبس المقبس الخاص ؛ كاتب printwriter الخاص قارئ Bufferrederer الخاص ؛ MessagethRead MessagethRead الخاص ؛ // الخيط المسؤول عن استلام الرسائل خريطة خاصة <سلسلة ، user> OnlineUsers = new hashmap <string ، user> () ؛ }. يعود؛ } string message = textfield.getText (). trim () ؛ if (message == null || message.equals ("")) {joptionpane.showmessagedialog (الإطار ، "الرسالة لا يمكن أن تكون فارغة!" ، "خطأ" ، joptionpane.error_message) ؛ يعود؛ } sendMessage (frame.getTitle () + "@" + "all" + "@" ‘ + message) ؛ textfield.settext (null) ؛ } // constructor public client_more () {textarea = new jtextarea () ؛ textarea.setedable (false) ؛ textarea.setForeGround (color.blue) ؛ TextField = New JTextField () ؛ txt_port = new jtextfield ("6666") ؛ txt_hostip = new JTextField ("127.0.0.1") ؛ txt_name = new JTextField ("Wu Chengqian") ؛ btn_start = new jbutton ("connection") ؛ btn_stop = new jbutton ("disconnect") ؛ btn_send = new jbutton ("send") ؛ listModel = new DefaultListModel () ؛ userList = new JList (listModel) ؛ Northpanel = new jpanel () ؛ Northpanel.setLayout (New GridLayout (1 ، 7)) ؛ Northpanel.add (New Jlabel ("Port")) ؛ northpanel.add (txt_port) ؛ Northpanel.add (New Jlabel ("Server IP")) ؛ northpanel.add (txt_hostip) ؛ Northpanel.add (New Jlabel ("name")) ؛ northpanel.add (txt_name) ؛ northpanel.add (btn_start) ؛ northpanel.add (btn_stop) ؛ northpanel.setBorder (جديد بعنوان ("معلومات الاتصال")) ؛ حقوق jscrollpane new jscrollpane (textarea) ؛ حقوق Croll.setBorder (جديد بعنوان ("منطقة عرض الرسائل")) ؛ LeftScroll = New JScrollPane (قائمة المستخدمين) ؛ LeftScroll.setBorder (جديد بعنوان ("مستخدم عبر الإنترنت")) ؛ Southpanel = New JPanel (New BorderLayout ()) ؛ Southpanel.add (Textfield ، "Center") ؛ southpanel.add (btn_send ، "east") ؛ Southpanel.setBorder (جديد بعنوان ("كتابة رسالة")) ؛ CenterPlit = New JSplitPane (jsplitpane.horizontal_split ، LeftScroll ، fervaleCroll) ؛ Centerplit.setDividerLocation (100) ؛ الإطار = JFRAME الجديد ("العميل") ؛ // قم بتغيير أيقونة jframe: // frame.seticonimage (toolkit.getDefaultToolkit (). createImage (client.class.getResource ("qq.png"))) ؛ frame.setLayout (New BorderLayout ()) ؛ Frame.Add (Northpanel ، "North") ؛ Frame.Add (CenterPlit ، "Center") ؛ Frame.Add (Southpanel ، "South") ؛ Frame.Setsize (600 ، 400) ؛ int screen_width = toolkit.getDefaultToolkit (). getScreensize (). العرض ؛ int screen_height = toolkit.getDefaultToolkit (). getScreensize (). الارتفاع ؛ frame.setLocation ((screen_width - frame.getWidth ()) / 2 ، (screen_height - frame.getheight ()) / 2) ؛ frame.setVisible (صحيح) ؛ // الحدث عند الضغط على إدخال مربع النص لكتابة رسالة TextField.AddActionerener (New ActionListener () {public void actionperformed (ActionEvent arg0) {send () ؛}}) ؛ // Event BTN_SEND.AddActionListener (New ActionListener () {public void actionperformed (ActionEvent e) {send () ؛}}) ؛ // الحدث BTN_START.AddActeRender (جديد actionListener () {public void actionperformed (ActionEvent e) {int port ؛ if (isConnected) {joptionpane.showmessagedialog (frame ، "إنه بالفعل على الاتصال ، لا تكرر الاتصال!" ، "joptionpane.err_mage) ؛ integer.parseint (txt_port.gettext () لا يمكن أن يكون abseip.equals ("استثناء جديد" ("اسم". joptionpane.showmessagedialog (الإطار ، exc.getMessage () ، "خطأ" ، joptionpane.error_message) ؛ // الحدث btn_stop.addActionListener (new ActionListener () {public void actionperformed (actionevent e) {if (! isConnected) {joptionpane.showmessagedialog (frame ، "إنه بالفعل في حالة مفصولة ، لا تفصل بشكل متكرر!" ، "error" ، joptionpane CloseConnection () ؛ // افصل (Flag == false) {استثناء جديد ("استثناء عند فصله!") ؛ }}}) ؛ // الحدث عند إغلاق Frame.AdDwIndOwListener (New WindowAdapter () {public void windowclosing (windowevent e) {if (isConnected) {closeConnection () ؛ // أغلق connection} system.exit (0) ؛ }/ ** * الاتصال بالخادم * * param port * param hostip * param name */ public boolean connectServer (int port ، string hostip ، اسم السلسلة) {// connect the server try {socket = new socite (hostip ، port) ؛ // إنشاء اتصال بناءً على رقم المنفذ والخادم IP للكاتب = new printwriter reader = جديد bufferedReader (new inputStreamReader (Socket .getInputStream ())) ؛ // إرسال المعلومات الأساسية لمستخدم العميل (اسم المستخدم وعنوان IP) SendMessage (name + "@" + socket.getlocaladdress (). toString ()) ؛ // افتح مؤشر الترابط لتلقي الرسائل messagethread = new messagethread (reader ، textarea) ؛ messagethread.start () ؛ isConnected = true ؛ // تم توصيله للعودة الحقيقية ؛ } catch (استثناء e) {textarea.append ("الخادم مع رقم المنفذ:" + port + "عنوان IP:" + hostip + "فشل!" + "/r/n") ؛ iSconnected = false ؛ // return false on غير متصل ؛ }} / ** * إرسال رسالة * * param message * / public void sendMessage (سلسلة رسالة) {constr.println (message) ؛ الكاتب. flush () ؛ }/ *** يقوم العميل بإغلاق الاتصال بنشاط*/ suppresswarnings ("الإهمال") المتواصل المنطقي المتزامن العام () {try {sendMessage ("Close") ؛ // إرسال أمر disconnect إلى server messagethread.stop () ؛ } if (الكاتب! = null) {constr.close () ؛ } if (socket! = null) {socket.close () ؛ } isConnected = false ؛ العودة صحيح. } catch (ioException e1) {e1.printStackTrace () ؛ isConnected = صحيح ؛ العودة كاذبة }} // thread التي تتلقى باستمرار رسائل فئة messagethread يمتد مؤشر الترابط {private bufferreader reader ؛ خاص JTextarea Textarea ؛ // طريقة بناء لاستلام مؤشر ترابط الرسائل العام messagethread (قارئ BufferedReader ، Jtextarea textarea) {this.reader = reader ؛ this.textarea = textarea ؛ } // إغلاق Connection بشكل سلبي متزامن Void closeCon () يلقي الاستثناء {// مسح المستخدم stilemodel.removeallelements () ؛ // أغلق الاتصال بشكل سلبي وأصدر المورد if (reader! = null) {reader.close () ؛ } if (الكاتب! = null) {constr.close () ؛ } if (socket! = null) {socket.close () ؛ } isConnected = false ؛ // تعديل الحالة لفصل} public void run () {string message = "" ؛ بينما (صحيح) {try {message = reader.ReadLine () ؛ StringTokenizer StringTokenizer = new StringTokenizer (Message ، "/@") ؛ string command = stringtokenizer.nextToken () ؛ // command if (command.equals ("close")) // command command {textarea.append ("Server Abour!/r/n") ؛ CloseCon () ؛ // أغلق بشكل سلبي إرجاع الاتصال ؛ // End Thread} آخر if (command.equals ("add")) {// يقوم بعض المستخدمين بتحديث قائمة username = "" ؛ سلسلة userip = "" ؛ if ((username = stringtokenizer.nextToken ())! = null && (userip = stringtokenizer.nextToken ())! = null) {user user = new user (username ، userip) ؛ inhollyusers.put (اسم المستخدم ، المستخدم) ؛ listmodel.addelement (اسم المستخدم) ؛ }} آخر if (command.equals ("delete")) {// بعض المستخدمين يقللون من قائمة قائمة القائمة عبر الإنترنت = stringtokenizer.nextToken () ؛ مستخدم المستخدم = (مستخدم) OnlineUsers.get (اسم المستخدم) ؛ inhollyusers.remove (user) ؛ ListModel.RemoveElement (اسم المستخدم) ؛ } if if (command.equals ("userlist")) {// تحميل قائمة المستخدم عبر الإنترنت int size = integer .parseint (stringtokenizer.nextToken ()) ؛ سلسلة المستخدم = خالية ؛ userip string = null ؛ لـ (int i = 0 ؛ i <size ؛ i ++) {username = stringtokenizer.nextToken () ؛ userip = stringtokenizer.nextToken () ؛ مستخدم المستخدم = مستخدم جديد (اسم المستخدم ، userip) ؛ inhollyusers.put (اسم المستخدم ، المستخدم) ؛ listmodel.addelement (اسم المستخدم) ؛ }} آخر إذا (command.equals ("max")) {// وصل عدد الأشخاص إلى الحد الأعلى textarea.append (stringtokenizer.nextToken () + stringtokenizer.nextToken () + "/r/n") ؛ CloseCon () ؛ // أغلق بشكل سلبي connection joptionpane.showmessagedialog (الإطار ، "المخزن المؤقت الخادم ممتلئ!" ، "خطأ" ، joptionpane.error_message) ؛ return ؛ // end thread} else {// normal message textarea.append (message + "/r/n") ؛ }} catch (ioException e) {E.PrintStackTrace () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ }}}}}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.