توضح هذه المقالة تطبيق عميل بسيط من جانب الخادم لبرمجة شبكة Java. شاركها مع الجميع لتكون مرجعا لك. التفاصيل هي كما يلي:
في Java، نستخدم java.net.Socket والفئات المرتبطة به لإكمال الوظائف المتعلقة بالشبكة. فئة المقبس بسيطة للغاية وسهلة الاستخدام لأن تقنية Java تخفي العملية المعقدة لإنشاء اتصال بالشبكة وإرسال البيانات من خلال الاتصال. ما هو مذكور أدناه ينطبق فقط على بروتوكول TCP.
1. الاتصال بالخادم
يمكننا استخدام منشئ فئة المقبس لفتح مأخذ توصيل، مثل
المقبس sk = مقبس جديد("210.0.235.14",13);
من بينها، 210.0.235.14 هو كائن سلسلة عشرية منقط، يمثل عنوان IP (أو اسم المضيف) للمضيف الوجهة، ويمثل 13 المنفذ المعين 13 للاتصال بالمضيف الوجهة. 210.0.235.14 هنا هو خادم توقيت موجود في هونغ كونغ. المنفذ الافتراضي لخادم التوقيت هو 13 بشكل عام.
لاحظ أن البرنامج يحظر حتى يتصل بالخادم بنجاح.
بعد ذلك، يمكنك استخدام طريقة getInputStream() لفئة المقبس للحصول على كائن InputStream، ومن خلال هذا الكائن، يمكنك الحصول على المعلومات التي يرسلها إلينا المضيف الهدف:
InputStream inStream = sk.getInputStream();
وبالمثل، لإرسال البيانات إلى المضيف الهدف، يمكنك استدعاء طريقة getOutputStream() للحصول على كائن دفق الإخراج.
وظيفة المثال التالية هي الاتصال بخادم التوقيت وطباعة المعلومات التي تم إرجاعها إلى الإخراج القياسي:
حاول { المقبس sk = جديد المقبس ("210.0.235.14"، 13)؛ sk.setSoTimeout(3000); / طباعة البيانات إلى وحدة التحكم while(sc.hasNextLine()) { String str = sc.nextLine(); System.out.println("Output : " + str); } sk.إغلاق(); } Catch(SocketTimeoutException e) // استثناء المهلة { System.out.println("Time Out!") Catch(Exception e ) {e.printStackTrace() }
يمكن لأسلوب setSoTimeout () في التعليمات البرمجية تعيين المهلة، أي إذا لم تكتمل عمليات القراءة والكتابة بعد الوقت المحدد، فسيتم طرح JackTimeoutException، ويمكن إغلاق الاتصال عن طريق التقاط هذا الاستثناء.
هناك أيضًا مشكلة المهلة التي يجب حلها، وهي مُنشئ فئة المقبس.
مقبس جديد (المضيف، المنفذ)؛
سيتم حظره إلى أجل غير مسمى حتى يتم إنشاء اتصال بالمضيف الهدف بنجاح. وهذا بالتأكيد ليس ما نريده. يمكننا حل هذه المشكلة عن طريق الاتصال:
المقبس sk = new Socker();sk.connect(new InetSocketAddress(host,port),2000);// اضبط المهلة على ثانيتين
2. الحصول على عنوان المضيف
يمكن للأسلوب الثابت getByName (اسم المضيف) لفئة InetAddress إرجاع كائن InetAddress الذي يمثل عنوان مضيف. يحتوي هذا الكائن على تسلسل من 4 بايت، وهو عنوان IP الخاص بالمضيف. ثم اتصل بطريقة getHostAddress() لإرجاع كائن سلسلة يمثل عنوان IP.
عادةً ما تتوافق بعض أسماء المضيفين ذات حجم حركة المرور المرتفع مع عناوين IP متعددة لتحقيق موازنة التحميل. يمكننا الحصول على جميع عناوين المضيف عن طريق استدعاء الأسلوب getAllByName()، الذي يُرجع مصفوفة من كائنات InetAddress.
ما يلي هو برنامج صغير بسيط وتتمثل وظيفته في طباعة عنوان IP المحلي إذا لم يتم تعيين أي معلمات في سطر الأوامر. إذا تم تحديد اسم مضيف، فستتم طباعة كافة عناوين IP الخاصة بالمضيف:
package cls; import java.net.*; public class ShowIP { public static void main(String[] args) {try { if(args.length > 0) { String hostName = args[0]; ] addr = InetAddress.getAllByName(hostName); // احصل على كافة عناوين المضيف // طباعة الإخراج إلى وحدة التحكم for(InetAddress title : addr) { System.out.println(address.getHostAddress()); } } else { System.out.println(InetAddress.getLocalHost().getHostAddress()); }
3. برنامج من جانب الخادم
تستخدم التطبيقات من جانب الخادم فئة ServerSocket لإنشاء مأخذ توصيل وربطه بالمنفذ المحلي، مثل
ServerSocket sock = new ServerSocker(8000);
يسمح الأسلوب sock.accept() للبرنامج بانتظار الاتصال بشكل مستمر. لن تقوم هذه الطريقة إلا بإرجاع كائن مقبس يمثل اتصالًا جديدًا عندما يكون العميل متصلاً، أي أن هذه الطريقة سيتم حظرها.
من الضروري هنا بشكل عام فتح موضوع جديد لكل اتصال ليخدمه.
فيما يلي مثال كامل. ينتظر الخادم الاتصال عند المنفذ 8400. عند وصول اتصال، يتم فتح مؤشر ترابط جديد لخدمته وتتم كتابة معلومات الاتصال في ملف السجل:
package cls; import java.io.*; import java.net.*; import java.util.*; public class ServerDemo { /** * @param args */ public static void main(String[] args) {try { //ServerSocket servSocket = new ServerSocket(8000); ServerSocket servSocket = new ServerSocket(8400); while(true) { عميل المقبس = servSocket.accept(); ++amount; Date time = new Date(); .getHostAddress() + "Connected/n"; System.out.print(prompt); // معلومات الإخراج على وحدة التحكم ServerDemo.writeLog(prompt); // الكتابة إلى الملف // بدء موضوع جديد th = new Thread(new ServThread(client,amount)); th.start(); } } Catch(Exception e) { e.printStackTrace() } } // الكتابة إلى ملف السجل public static void writeLog(String str) { File logFile = new File("server-log.txt"); حاول { FileWriter out = new FileWriter(logFile,true); out.append(str); out. Close(); } Catch(Exception e) { e.printStackTrace(); عميل المقبس; { حاول { InputStream inStream = client.getInputStream(); OutputStream outStream = client.getOutputStream(); Scanner recv = new Scanner(inStream); new PrintWriter(outStream,true); بضع كلمات! [أدخل "وداعا" لإغلاق الاتصال]"); while(recv.hasNextLine()) { String str = recv.nextLine(); if(str.equals("bye")) { send.println("إلى اللقاء لاحقًا ~ ^-^");break; } send.println("هذا برنامج اختبار، وليس له وظائف بعد"); } Date time = new Date(); String Prompt = time.toString() + ": user" + ix + "th" + client.getInetAddress().getHostAddress() + "Disconnected/n"; / الكتابة إلى الملف client.Close(); } Catch(Exception e) { e.printStackTrace(); } } }
تم وضع هذا البرنامج على الخادم. يمكنك استخدام الأمر telnet Youthol.tk 8400 لتجربة نتائج تشغيل هذا البرنامج.
آمل أن تكون هذه المقالة مفيدة لبرمجة جافا للجميع.