• 0
Dr.Robert

NetworkService API لمبرمجي الشبكات

سؤال

السلام عليكم ورحمة الله وبركاتة

موضوعي اليوم عن واجهة تطبيقات برمجية API قمت بتصميمها وتحمل اسم NetworkService

وهي خاصة لبرمجيات الشبكات المكتوبة بلغة JAVA..

برمجة الشبكات في لغات البرمجة الحديثة-منها الJAVA- لا تتطلب خبرة كبيرة من المبرمج في مفاهيم الشبكات

حتى أن الأدوات البرمجية المتوفرة غير معقدة الإستخدام أو الفهم. ومع التصميم السليم يستطيع المبرمج إنشاء برامج فعالة تعمل على الشبكة وفي وقت قصير.

بل ان التحدي الذي يواجهة المبرمج في هذا المجال هو في مسائل -في الغالب- لا علاقة لها بكيفية نقل البيانات او البروتوكولات المستخدمةاو دور الاجهزة من كروت الشبكة وغيرة أو حتى إستخدام الادوات البرمجية API .

تلك المسائل التي تشكل التحدي هي متعلقة بمفهومين رئيسيين وهما Multithreading وMemory optimization

معروف عن البرامج التي تكون multithreaded انها أسرع في التنفيذ من البرامج التي هي single-threaded ولكنها تستهلك الذاكرة بشكل اكبر,واذا لم يتم تصميمها بشكل سليم فإنها لا تعتبر برامج فعالة.

والعكس صحيح بالنسبة للبرامج ال single-threaded ,حيث أن استخدامها للذاكرة اكثر كفائة (مقارنة بالبرامج الmultithreaded المصممة بشكل رديء ) ولكنها ابطأ في التفيذ أوالإستجابة.

في برمجة الشبكات (أو بالأصح تطبيقات الكمبيوتر التي تستخدم الشبكات) فإنك تحتاج لإستخدام تقنية ال multithreading بسبب أن برنامجك- ببساطة- يتعامل مع بيئة خارجية (الشبكة) والتي هي خارج حدود سيطرتة.

فأنت لا تتحكم بحجم ولا بوقت وصول البيانات التي يفترض ببرنامجك أن يستقبلها ويعالجها(والتي قد تكون قادمة من مصدر واحد أو اكثر), ولا تتحكم بقدرة الشبكة على الإستجابة كلما حاول برنامجك إرسال بيانات ما وأمور كثيرة أخرى تتطلب من برنامجك القدرة على المعالجة المتوازية concurrent processing. وفي نفس الوقت عدم إستهلاك الذاكرة بلا طائل.

كما أن برامج الشبكات عادة ما تكون مصممة للعمل لساعات طويلة وفي ظروف متقلبة قد تتعرض لها الشبكة كما أن بعض هذة البرامج يجب أن يعمل ك"خدمة خلفية " أي غير مرئية للمستخدم وغير مؤثرة على أداء برامجة (في الأجهزة التي يتم مراقبتها اوالتحكم فيها عن بعد مثلا). ولذلك وإستنادا على هذا المفهوم تم تصميم هذة الأداة .

NetworkService او NS عبارة عن خلاصة جهد متواضع بعد فترة لا بأس بها امضيتها في مجال تصميم برامج

Server-Client والتي تعمل على الشبكات الخاصة.

تم تصميم هذة الأداة لتمكن المبرمج من إستغلال امكانات برمجة الشبكات الهائلة المتوفرة في لغة الJAVA وفق طرق مجربة ومحترفة.وهي تعمل كخدمة Service في بيئة multithreaded مصممة بعناية لتحافض على أداء عالى لأغراض مختلفة ولساعات طويلة مع استهلاك معقول لموارد الكمبيوتر. والأهم .. سهولة الإستخدام.

البرامج التي تستخدم هذة الأداة ستكون لها القدرة على التواصل في ما بينها عبر الشبكة بإستخدام بروتوكولات TCP وUDP بفعالية وبدون كتابة سطر واحد متعلق بالشبكات .

بإستخدام هذة الأداة تستطيع انشاء برامج تعمل ك client ,هذا الclient لة القدرة على التعرف على بقية الclients عبر الشبكة ومعرفة حالة كل واحد منهم (يعمل أم لا) ومن ثم إرسال وإستقبال البيانات إما على شكل رسائل نصية,أو

أي شكل أخر من أشكال البيانات.

البرنامج سيظل قادرا على الإستجابة بنفس الفعالية تقريبا سواء كان هناك بضعة clients اوحتى مئات (تمت تجربتها في ظروف مشابهة).

طبعا الأداة ليست كاملة فهي مازالت تحت التجربة ولا زالت قيد التطوير , وأود أن أشارك النسخة الأولى منها مع الزملاء مبرجي لغة JAVA (أو حتى مبرمجي أي لغة اخرى حيث يمكن أن يستفيدوا من الفكرة والتصميم).

وها أنا اضعها بين أيديكم مفتوحة المصدربالإضافة للJavadoc الخاص بها. ومع أنها مصممة لتكون سهلة الإستخدام وغير معقدة,فأنا على أتم إستعداد لمناقشة كيفية إستخدامها ووظيفة كل جزء فيها. وتقبلوا مني فائق إحترامي لقبولي كعضو جديد في منتداكم الرائع ...(واعذروني لكثرة إستخدام مصطلحات بالإنجليزية) والله من وراء القصد.

9

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

14 إجابة على هذا السؤال .

  • 0

شكرا و أهلا بك.

ممكن مثال على الإستعمال؟

تم تعديل بواسطه herch
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

سأحاول شرح أساسيات استخدام NS بأختصار حتى لا يكون هناك أي لبس عند الزملاء.

NS عبارة عن خدمة تقوم بفتح ثلاثة منافذ على الجهاز الذي تعمل فية , اثنان لرسائل UDP وواحد لTCP للتنصت على طلبات الإتصال للجهاز.

اولا من أجل ان تستخدم NS يجب ان تقوم ب implementation ل ClientInterface وهي عبارة عن interface خاصة للتنصت على الرسائل الخاصة\العامة وطلبات الإتصال القادمة للجهاز وكذلك رسائل النظام ورسائل الخطأ.

في هذا المثال سأستخدم System.in لعرض الرسائل


public void publicMessageReceived(String msg, ClientID from) {
System.out.println(from.name() + " says:" + msg);
}
public void privateMessageReceived(String msg, ClientID from) {
System.out.println(from.name() + " says:" + msg);
}
public void clientConnected(SocketStreamRW connection) {
System.out.println(connection.getClientID().name() + " has connected!");
try {
connection.write("hello!");

Object msg = connection.read();

System.out.println(connection.getClientID().name() + "says:" + msg);
} catch (IOException ex) {
} finally {
connection.close();
}}
public void errMessage(String error, String from) {
System.out.println("Error:" + error + " occurred in:" + from);
}

public void infMessage(String info, String from) {
System.out.println(from + "-->" + info);
}
}
public class MyInterface implements ClientInterface {

بعد ذلك أقوم بإنشاء نسخة جديدة من NetworkService class :

NetworkService networkService=new NetworkService(new MyInterface()).

ثم أقوم بتسجيل ClientStateChangeListener للتنصت على حالة الاعضاء المتواجدين على الشبكة:



public void clientStateChanged(ClientStateChangeEvent evt) {
switch (evt.getNewState()) {
case ClientStateChangeEvent.ON:
System.out.println(evt.getClient().name() + " has logged in!");
break;
case ClientStateChangeEvent.OFF:
System.out.println(evt.getClient().name() + " has logged off!");
}

}
});
networkService.addClientStateChangeListener(new ClientStateChangeListener() {

خصائص الحدث ClientStateChangeEvent هي كالتالي:

ClientStateChangeEvent.getClientID() - ClientID خاص بالعضو الذي تسبب في إطلاق الحدث.

ClientStateChangeEvent.getOldState() – حالة العضو قبل إطلاق الحدث

ClientStateChangeEvent.getOldState() – حالة العضو الحالية

ClientStateChangeEvent.getDesc()- وصف للحدث (غير مستخدم حاليا).

بالإضافة لتنبية المستخدم , تستطيع استخدام هذا التنصت لإنشاء قائمة بالأعضاء ليستخدمها برنامجك لاحقا.

وأخيرا قم بتشغيل الخدمة , ويفضل الإنتظار بعدها قليلا ريثما يتم البحث عن بقية الأعضاء عبر الشبكة كما هو موضح أدناة:

try {
networkService.startService();
Random gen = new Random();
while (networkService.isSilentCollecting()) {
Thread.sleep(gen.nextInt(500));
} catch (InterruptedException ex) {
}catch(IOException ex){
System.exit(0);
}
}

انتهينا!!..

لإرسال رسالة عامة (لجميع الأعضاء) :

networkService.broadcast(String);

لإرسال رسالة لعضو معين:

networkService.sendMessage(ClientID,String);

تستطيع الحصول على ClientID الخاص بالعضو من خلال التنصت على حالة الأعضاء كما هو موضح اعلاه , او من خلال networkService.getClientIDsTable() وهي عبارة عن HashTable يحتوي على ClientIDs الخاص بجميع اللأعضاء المتواجدين حاليا.

لإنشاء اتصال TCP مع عضو:

networkService.connect(ClientID);

للعمل بشكل متخف (بدون الظهور لبقية الأعضاء):

netowrkService.setHidden(true);

للعودة للظهور:

netowrkService.setHidden(false);

واخيرا لا تنس إيقاف الخدمة بعد الإنتهاء من الإستخدام:


System.exit(0);
netowrkService.stopService();

ارجو أن اكون وفقت في شرح اساسيات الإستخدام. ودمتم بود.

تم تعديل بواسطه herch
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مجهوود رائع الصراحة

بالبداية ارجوا منك عدم الانقطاع عن المنتدى ومحاولة التقدم في تطوير الحزمة

انا شخصيا ساحاول ان ابحث بالكثير في الحزمة عسى ان اجد شئ مفيد وساجد ان شالله

من شرحك المبسط للحزمة اضن بانها ستوفر علينا الكثير في موضوع برمجة الشبكات والابتعاد عن استخدام بعض التقنيات في الجافا كــ RMI

, وخصوصا في تركيزك على موضوع multithreaded فيها !!

لم اقلبها جيدا الى الان

لكن عندما رايت الموضوع جدي !!

خطرر ببالي سؤال فورا عند تكلمك عن موضوع client & server

هل هي تدعم الموضوع الشبكي فقط في نقل البيانات فقط كــ text and file

ام هناك ميزات اخرى كــ voic chat

او نقل الصورة

اضن انها ستساعد في بعض الاعمال التي اقوم بها شبكيا :)

ساتفرغ من كل التزاماتي للتمحص فيها قليلا

احسنت عملا !

بالتوفيق

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

الأ خ shado اشكرك على دعمك, واتمنى ان تجد في الحزمة ما يفيدك.

وبالنسبة لمسألة الصوت والصورة فهي فكرة جيدة :) وان شاء الله سأ درس إمكانية إضافتها للحزمة حيث انها الان لنقل البيانات بصورة بسيطة فقط.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

1-تم إضافة class جديد للحزمة بإسم ServerService وهو عبارة عن اداة لإنشاء برامج سيرفر غير مكلفة وقوية في نفس الوقت ,

تم استخدام نفس المفهوم تقريبا الذي تقوم علية برامج السيرفر المحترمة , ولكن هنا بدون اي تقييد على المبرمج (أنظر للjavadoc الخاص بها لتعرف ماذا اعني).

2-تم تعديل خطأ منطقي في ConnectionListener

وجاري العمل لإضافة إمكانية التعامل مع الدفق (صوت,,صورة) , ولكن حتى يكون العمل متقنا , ارجو من الأخوة الإدلاء بملاحظاتهم بعد الإستخدام أو انشاء برامج تستخدم هذة الحزمة. (حتى لا يتم البناء على ما هو ضعيف اصلا :wink: ) ارجو من الإخوة المشرفين اطلاعي على طريقة تحديث المرفقات وشكرا.

تم تعديل بواسطه Dr.Robert
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بارك الله فيك يا أخي

لماذا لا تنشأ مشروع لهذه الحزمه في GoogleCode أو SourceFourge ؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ..

أخي Dr.Robert مشكور على المجهود المميز و الرائع فعلا .. ولقد قرأت المقدمة التي تفضلت بها , ووجدت فيها الكثير من الأمور الدافعة لإستخدام حزمتك بدلا عن استخدام الأسلوب المعتاد في Socket .

لكن هذا كان كلام نظري ,, لذلك أخي Robert , ممكن تعطينا مثال يوضح الفرق من حيث السهولة على الأقل بين استخدام حزمتك و بين الحزم الموجودة في الجافا.

وأكرر ثانية مجهود مبارك و رائع ,, و الله يوفقك.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكم ..

أخي Dr.Robert مشكور على المجهود المميز و الرائع فعلا .. ولقد قرأت المقدمة التي تفضلت بها , ووجدت فيها الكثير من الأمور الدافعة لإستخدام حزمتك بدلا عن استخدام الأسلوب المعتاد في Socket .

لكن هذا كان كلام نظري ,, لذلك أخي Robert , ممكن تعطينا مثال يوضح الفرق من حيث السهولة على الأقل بين استخدام حزمتك و بين الحزم الموجودة في الجافا.

وأكرر ثانية مجهود مبارك و رائع ,, و الله يوفقك.

اخي MkSoft أشكرك على مشاركتك وكنت أنوي إضافة رد هنا ولكن ولطول الموضوع , فضلت انشاء موضوع جديد اتكلم فية عن اشياء مهمة في -نظري- في موضوع الشبكات وعلاقة الحزمة بها..وبإنتظار ردك في الموضوع الجديد.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

هلا أمكن إعادة رفع الـ API مرة أخرى

لا أعرف أين ذهبت :(

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

قمت بإضافة الموضوع إلى المواضيع المميزة

برجاء أن تقوم بإضافة رابط الحزمة على source forge

تحياتي

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا يا اخ علاء

الرابط

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مجهوود رائع الصراحة

بالبداية ارجوا منك عدم الانقطاع عن المنتدى ومحاولة التقدم في تطوير الحزمة

انا شخصيا ساحاول ان ابحث بالكثير في الحزمة عسى ان اجد شئ مفيد وساجد ان شالله

من شرحك المبسط للحزمة اضن بانها ستوفر علينا الكثير في موضوع برمجة الشبكات والابتعاد عن استخدام بعض التقنيات في الجافا كــ RMI

, وخصوصا في تركيزك على موضوع multithreaded فيها !!

لم اقلبها جيدا الى الان

لكن عندما رايت الموضوع جدي !!

خطرر ببالي سؤال فورا عند تكلمك عن موضوع client & server

هل هي تدعم الموضوع الشبكي فقط في نقل البيانات فقط كــ text and file

ام هناك ميزات اخرى كــ voic chat

او نقل الصورة

اضن انها ستساعد في بعض الاعمال التي اقوم بها شبكيا :)

ساتفرغ من كل التزاماتي للتمحص فيها قليلا

احسنت عملا !

بالتوفيق

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرا أخي على هذا الجهد المبارك أرجو منك عمل مثال تطبيقي

:) :) :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .