تشرح هذه المقالة الكود التفصيلي لبرمجة مقبس Java لتنفيذ خدمة تحية بسيطة للرجوع إليها. المحتوى المحدد كما يلي
جانب الخادم:
تطبيق أبسط خدمة Hello ، قم بطباعة عنوان IP العميل إلى وحدة التحكم ، وإرسال سلسلة من الأحرف (Hello ، Java Socket) إلى أي عميل متصل وأغلق الاتصال بالعميل. انتظر وصول طلب اتصال العميل التالي.
عميل:
قم بتنفيذ أبسط مقبس للاتصال بخادم Hello ، ويقبل بيانات البايت المرسلة من الخادم وطباعة المحتوى إلى وحدة التحكم.
نصائح رئيسية:
نظرًا لأن Java يوفر الكثير من واجهات برمجة تطبيقات دفق المدخلات والمخرجات ، فإن العديد من المبتدئين يتعرضون لبرمجة مقبس Java ، ولأنهم يفتقرون إلى فهم طبيعة اتصالات الشبكة ، فإنهم يقبلون مباشرة تدفقات بايت Socket بواسطة READLINE (). ومع ذلك ، نظرًا لأن الطرف الإرسال لا يرسل /r /n ، فلا يمكن قراءة البيانات. هذا هو الخطأ الأكثر شيوعا. تتضمن بعض الأخطاء الشائعة الأخرى تهيئة المخزن المؤقت القبول ، مما يؤدي إلى شخصيات مشوهة ، ولم يتم إعادة تجميعها وفقًا لعدد البايتات التي تلقاها القراءة ، مما يؤدي إلى استثناء من البيانات المستلمة. لذلك يوضح المدونة ما الذي يتم إرساله بواسطة Byte و Holored by Byte. هذا مفهوم مهم للغاية ومبدأ في برمجة الشبكة. اسمح لطريقة دفق الإدخال println () وطريقة دفق الإخراج القراءة () الانتقال إلى الجحيم. لا يعني ذلك أنه ليس من السهل استخدامه ، لكنني أقترح عليك عدم استخدامه لأن هؤلاء سوف يعيقون فهمك وفهمك لجوهر برمجة الشبكة. أيضًا ، أود أن أقوم بتدوين ملاحظة خاصة: أحيانًا لا يكون Flush () ضروريًا إلا إذا كنت تستخدم دفق الإدخال والمخرجات المخزنة للقراءة وكتابة البايت.
رمز من جانب الخادم:
حزمة com.gloomyfish.socket.tutorial.two ؛ استيراد java.io.dataOutputStream ؛ استيراد java.io.ioException ؛ استيراد java.net.serversocket ؛ استيراد java.net.socket ؛ الطبقة العامة HelloService يمتد الموضوع Public HelloService (int port) يلقي ioException {serversocket = new ServersOcket (port) ؛ } public void run () {try {while (true) {system.out.println ("Waiting for client on port" + serverSocket.getLocalPort ()) ؛ COOKET CLIENT = SERVersOCKE.ACCEPT () ؛ // blocked & في انتظار Socket Socket.out.println ("فقط متصل بـ" + client.getRemotesocketAddress ()) ؛ DataOutputStream DOS = جديد DataOutputStream (client.getOutputStream ()) ؛ Byte [] Hello = "Hello ، Java Socket" .getBytes () ؛ dos.write (مرحبًا ، 0 ، hello.length) ؛ dos.close () ؛ client.close () ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ }} public static void main (string [] args) {try {HelloService service = new HelloService (9999) ؛ service.start () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }}} يستمع الخادم على المنفذ 9999 وينتظر الاتصال ، ويستخدم مؤشر ترابط Java لتحقيق بدء تشغيل من جانب الخادم.
رمز العميل كما يلي:
حزمة com.gloomyfish.socket.tutorial.two ؛ استيراد java.io.datainputStream ؛ استيراد java.io.ioException ؛ استيراد java.net.inetsocketaddress ؛ استيراد java.net.socketaddress ؛ استيراد java.net.socketaddress ؛ الطبقة العامة helloclient {private int clientnumber ؛ عنوان المقبس الخاص ؛ Helloclient العامة (int clientNum) {clientNum = clientNum ؛ } public void setupclients (String ServerHostName ، int port) يلقي ioException {address = new inetsocketaddress (serverHostName ، port) ؛ لـ (int i = 0 ؛ i <clientnumber ؛ i ++) {system.out.println () ؛ System.out.println ("بدء العميل رقم" + (i + 1)) ؛ مأخذ التوصيل = مقبس جديد () ؛ Socket.connect (العنوان) ؛ datainputStream Bufferreader = جديد datainputStream (socket.getInputStream ()) ؛ Byte [] cbuff = new byte [256] ؛ char [] charbuff = new Char [256] ؛ حجم int = 0 ؛ بينما ((size = bufferedReader.Read (cbuff))> 0) {convertbytetochar (cbuff ، charbuff ، size) ؛ System.out.println (Charbuff) ؛ } bufferedReader.Close () ؛ socket.close () ؛ }} private void convertbytetochar (byte [] cbuff ، char [] charbuff ، int size) {for (int i = 0 ؛ i <charbuff.length ؛ i ++) {if (i <size) {charbuff [i] = (char) cbuff [i] ؛ } آخر {charbuff [i] = '' ؛ }}} main public static void (string [] args) {try {helloclient client = new Helloclient (10) ؛ client.setupclients ("LocalHost" ، 9999) ؛ } catch (ioException e) {E.PrintStackTrace () ؛ }}} ابدأ 10 عملاء للاتصال بجانب الخادم ، وبعد تلقي تحية الخادم ، يغلق العميل الاتصال.
نصيحة خاصة: تأكد من تهيئة Charbuff العازلة
نتائج تشغيل البرنامج:
ما سبق هو كل شيء عن هذا المقال ، آمل أن يكون مفيدًا لتعلم الجميع.