تتضمن نماذج تطبيقات الشبكة بشكل أساسي ما يلي:
www (شبكة الويب العالمية) هو نظام لتصفح المعلومات يعتمد على نموذج العميل/الخادم، ويعتمد على لغة HTML وبروتوكول HTTP، ويمكنه توفير خدمات الإنترنت المتنوعة. يتم وضع معلومات الشبكة في مواقع مختلفة على المضيف، ويستخدم خادم www روابط النص التشعبي لربط المعلومات المختلفة. يعد عميل www (المتصفح) مسؤولاً عن إنشاء اتصال مع الخادم، وإرسال الطلبات إلى الخادم، ومعالجة الوسائط التشعبية بتنسيق HTML، وتوفير واجهة مستخدم رسومية (GUI)، وعرض المعلومات، وما إلى ذلك.
في وضع عمل العميل/الخادم، من جانب الخادم، كن مستعدًا لقبول الاتصالات من أجهزة كمبيوتر عميلة متعددة. ولتحقيق هذه الغاية، بالإضافة إلى استخدام عناوين IP لتحديد أجهزة الكمبيوتر على الإنترنت، يتم أيضًا تقديم أرقام المنافذ لتحديد الخيوط التي تخدم خدمات الخلفية على جانب الخادم. يسمى الجمع بين رقم المنفذ وعنوان IP بمقبس الشبكة.
عند تنفيذ وضع C/S في لغة Java، يتم تقسيم المقابس إلى فئتين:
يوفر جهاز الخادم خدمات لجهاز العميل من خلال المنافذ (عناوين الإدخال/الإخراج للناقل)؛ ويوفر جهاز الخادم العديد من الخدمات المختلفة في نفس الوقت على منافذه المختلفة. يصل العميل إلى منفذ معين من الخادم ويطلب من الخادم أن يخدمه من خلال هذا المنفذ. اللوائح: أرقام المنافذ من 0 إلى 1023 مخصصة للاستخدام الحصري للنظام. على سبيل المثال، بروتوكول HTTP موجود على المنفذ 80 وبروتوكول telnet موجود على المنفذ 23. يتم استخدام المنافذ 1024~65535 بواسطة التطبيقات.
عندما يحتاج برنامج العميل وبرنامج الخادم إلى الاتصال، يمكن استخدام فئة المقبس لتأسيس اتصال مأخذ التوصيل. فكر في اتصال مأخذ التوصيل كمكالمة هاتفية: في البداية يقوم برنامج العميل بإنشاء المكالمة، ويستمع برنامج الخادم بعد اكتمال المكالمة، ويمكن لأي من الطرفين التحدث في أي وقت.
هناك طريقتان اختياريتان لتحقيق الاتصال بين الطرفين: مقبس التدفق ومقبس مخطط البيانات:
ينشئ مقبس الدفق قناة اتصال بين برنامج العميل وبرنامج الخادم. يمكن لكل مقبس إجراء عمليات القراءة والكتابة. بالنسبة لأي من الطرفين، فإن عملية جلسة الاتصال مع الطرف الآخر هي:
قم بإنشاء اتصال بالمقبس، واحصل على تدفقات الإدخال/الإخراج، وقراءة/كتابة البيانات، وأغلق المقبس (قم بتمزيق الاتصال) بعد اكتمال الاتصال.
باستخدام مُنشئ المقبس، يمكن إنشاء كائن مأخذ توصيل من جانب العميل إلى الخادم:
المقبس (مضيف سلسلة، منفذ int): المضيف هو عنوان IP الخاص بالخادم، والمنفذ هو رقم المنفذ، ويتم الاتفاق عليهما مسبقًا.
على سبيل المثال الكود:
حاول { المقبس mySocket = جديد المقبس("http://www.weixueyuan.net" ,1860);
ثم استخدم طريقة getInputStream () للحصول على دفق الإدخال، واستخدم دفق الإدخال هذا لقراءة المعلومات التي وضعها الخادم في "السطر"؛ واستخدم طريقة getOutputStream () للحصول على دفق الإخراج، واستخدم دفق الإخراج هذا لـ كتابة المعلومات إلى "الخط".
باستخدام مُنشئ ServerSocket، يمكنك إنشاء كائن مقبس خادم على الخادم الذي يقبل مآخذ توصيل العميل:
ServerSocket (منفذ int): حدد رقم المنفذ وقم بإنشاء كائن ServerSocket. يجب أن يكون رقم المنفذ هو نفس رقم المنفذ الذي يطلبه العميل. للقيام بذلك، استخدم النموذج التالي من التعليمات البرمجية:
حاول { ServerSocket serverSocket = new ServerSocket(1860); }catch(IOException e){}
يستمع البرنامج من جانب الخادم إلى المنفذ المحدد. عند تلقي طلب خدمة من برنامج العميل، يقوم بإنشاء كائن مأخذ توصيل للتواصل مع برنامج العميل المقابل للمنفذ. على سبيل المثال، بعد تنفيذ التعليمات البرمجية أعلاه لإنشاء كائن مأخذ توصيل خادم وإنشاء كائن serverSocket، يمكن استخدام طريقة Accept () للحصول على كائن مأخذ التوصيل وتلقي المعلومات من برنامج العميل من مأخذ التوصيل mySocket. كما هو موضح في الكود التالي :
حاول {Socket sc = serverSocket.accept();//ac هو كائن مقبس}catch(IOException e){}
لإلغاء الخدمة، يمكنك إغلاق كائن المقبس sc:
sc.Close();
[مثال] تطبيق العميل في وضع C/S. هذا مثال بسيط على اتصال مأخذ التوصيل المتدفق من جانب العميل، ويوضح الكود كيفية كتابة البرنامج من جانب العميل. في المثال، يقوم برنامج العميل بتقديم طلب إلى المنفذ 4441 لمضيف الخادم. بعد إنشاء الاتصال، يكمل القراءة والكتابة إلى الخادم.
import java.io.*;import java.net.*;public class Client{ public static void main(String args[]){ String s = null;Socket mySocket; = new المقبس("localhost",4441 in = new DataInputStream(mySocket.getInputStream()); DataOutputStream(mySocket.getOutputStream()); out.writeUTF("خادم جيد!"); while(true){ s = in.readUTF(); if(s==null)break; ); } mySocket.Close(); }catch(IOException e){ System.out.println("لا يمكن الاتصال");
[مثال] تطبيق من جانب الخادم يتوافق مع تطبيق من جانب العميل. يستمع البرنامج على المنفذ 4441. عند اكتشاف طلب العميل، يتم إنشاء سلسلة تحتوي على "العميل، مرحبًا، أنا الخادم" وإخراجها إلى العميل.
import java.io.*;import java.net.*;public class Server{ public static void main(String args[]){ ServerSocket server = null; String s = null; DataOutputStream out = null; in = null; حاول{ server = new ServerSocket(4441); }catch(IOException e1){ system.out.println("ERROR:" +e1); } حاول{ you = server.accept(); in = new DataInputStream(you.getInputStream()); out = new DataOutputStream(you.getOutputStream()); ); if(s!=null)break; } out.writeUTF("مرحبًا أيها العميل، أنا الخادم"); هـ){System.out.println("خطأ:"+e);} }}
من أجل إطلاق العنان لقدرة الكمبيوتر على العمل المتوازي، يمكن إكمال عمل توصيل المقبس بواسطة خيط واحد. عندما يطلب العميل من الخادم تقديم الخدمات، أو عندما يتلقى الخادم طلب خدمة العميل، فإنه يبدأ خيطًا مخصصًا لإكمال اتصالات المعلومات، وينشئ دفق إدخال وإخراج في هذا الخيط، ويكمل تبادل المعلومات بين العميل والخادم الخادم.
[مثال] برنامج العميل الذي يضع اتصال مأخذ التوصيل يعمل على سلسلة رسائل. تحتوي الواجهة على زر إرسال رسالة ومربع نص ومنطقة نص. يقوم تطبيق العميل أولاً بإنشاء اتصال مأخذ توصيل بالخادم. استخدم دفق إدخال البيانات لقراءة المعلومات التي وضعها الخادم في السطر بشكل متكرر، وعرض المعلومات المستلمة في منطقة النص. إذا كانت المعلومات المستردة في وضع "النهاية"، فسيتم إغلاق اتصال المقبس وينتهي البرنامج. يمكن للمستخدم أيضًا إدخال المعلومات في مربع النص والضغط على زر إرسال المعلومات، ويستخدم برنامج العميل دفق إخراج البيانات لإرسال المحتوى الموجود في مربع النص إلى الخادم.
import java.net.*;import java.io.*;import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.applet.*;الفئة العامة Aclient توسع أدوات التطبيق الصغير Runnable,ActionListener{ JButton Button; JTextField textF; DataOutputStream out; public void init(){ setBackground(new Color(120,153,137)); setLayout(new BorderLayout()); new JButton("إرسال المعلومات"); 20,30); setSize(450,350); p.add(textF); p.add(button); add(textA,"Center"); add(p,"South"); new Switch(this.getCodeBase().getHost(),4441); in = new DataInputStream(socket.getInputStream()); DataOutputStream(socket.getOutputStream()); }catch(IOException e){} if(thread==null){ thread = new Thread(this); public void run(){ String s = null while(true){ حاول{ s = in.readUTF() }catch(IOException e){} if(s.equals("End")){try{ مقبس.إغلاق();break }catch(IOException e){} }else texA.append(s + "/n" } } public void actionPerformed( ActionEvent e){ if(e.getSource()==button){ String s = textF.getText(); if(s! = null){ حاول{ out.writeUTF(s); }catch(IOException e1){} } else{ حاول{ out.writeUTF("يرجى التحدث" } Catch(IOException e1){} } } }}
[مثال] يستخدم البرنامج المحطة 4441 لإنشاء اتصال مأخذ توصيل مع العميل. بعد أن يتلقى الخادم طلب العميل، يقوم بإنشاء مؤشر ترابط بمقبس العميل ويبدأ تشغيله. إذا لم يكن هناك تطبيق للعميل، فاستمر في مراقبة تطبيقات العميل. يقوم مؤشر الترابط بإنشاء دفق بيانات الإدخال ودفق بيانات الإخراج وفقًا لمقبس العميل. يستخدم مؤشر الترابط لقراءة المعلومات التي يضعها العميل في السطر. إذا كانت المعلومات المستلمة هي "انتهى"، يرد الخادم "انتهى" ثم يغلق اتصال المقبس؛ وإلا فإنه يرد: "أنا الخادم الذي قلته لي"، والمعلومات التي يتلقاها الخادم.
import java.net.*;import java.io.*;import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.applet.*;الفئة العامة Aclient توسع أدوات التطبيق الصغير Runnable,ActionListener{ JButton Button; JTextField textF; DataOutputStream out; public void init(){ setBackground(new Color(120,153,137)); setLayout(new BorderLayout()); new JButton("إرسال المعلومات"); 20,30); setSize(450,350); p.add(textF); p.add(button); add(textA,"Center"); add(p,"South"); new Switch(this.getCodeBase().getHost(),4441); in = new DataInputStream(socket.getInputStream()); DataOutputStream(socket.getOutputStream()); }catch(IOException e){} if(thread==null){ thread = new Thread(this); public void run(){ String s = null while(true){ حاول{ s = in.readUTF() }catch(IOException e){} if(s.equals("End")){try{ مقبس.إغلاق();break }catch(IOException e){} }else texA.append(s + "/n" } } public void actionPerformed( ActionEvent e){ if(e.getSource()==button){ String s = textF.getText(); if(s! = null){ حاول{ out.writeUTF(s); }catch(IOException e1){} } else{ حاول{ out.writeUTF("من فضلك تحدث"); }catch(IOException e1){} } } }}