الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

برنامج محادثة بدون خادم

رائج
بدأه Dr.Robert في 25 فبراير 2010 · 71 رد · 6,672 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

اقدم لك اليوم برنامج من تصميمي وهو عبارة عن مشروع فصلي خلال احد سنوات دراستي في كلية الهندسة.

وقد قمت بتطويرة مؤخرا بغرض نشرة كبرنامج مجاني.

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

فكرة البرنامج غير جديدة بالمرة , ولكنني قمت بإضافة بعض المميزات.

البرنامج عبارةعن برنامج محادثة كتابية عامة وخاصة يعمل بدون برنامج خادم server-less مع بعض الخصائص الأخرى مثل تبادل الملفات.

شكرا لكم وبإنتظار آراءكم :)

4

بحثت عن قلمي البارحة فلم أجدة!

...............

لم أجد سوى لوحة المفاتيح هذة

.............

تتطلع إلي بشفقة..

.............

أكاد أسمعها .. تقول (ألم يسمع بGoogle ؟!؟؟)

#2

طيب يا ريت توضح لنا الية عمل البرنامج يا مازن لو سمحت !!!

تم تعديل هذه المشاركة بواسطة MKSoft في 25 فبراير 2010 في 17:45

1▲ 1
#3

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

اقتباس
طيب يا ريت توضح لنا الية عمل البرنامج يا مازن لو سمحت !!!

+1

ما فهمته أنه لو كان لدينا ثلاثة أجهزة كمبيوتر ، يمكن أن نثبت برنامجك في كل جهاز .. ويمكن أن يكتشف كل برنامج المستخدمين الاخرين العاملين على نفس البورت .

يعني أصبح كأنه peer-to-peer ؟

عذراً ، فمعلوماتي قليلة ، وأتطلع لتوضيح أكثر ، والمعذرة ان كان الموضوع ليس للأسئلة ، تستطيع تتجاهلها :)

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#4
اقتباس
طيب يا ريت توضح لنا الية عمل البرنامج يا مازن لو سمحت !!!

إن شاء الله ,اول ما اتأكد من انة يعمل جيدا واليتة سليمة100% . حتى لا ادخلك في متاهات مع برنامج غير جاهز. :lol:

اقتباس

ما فهمته أنه لو كان لدينا ثلاثة أجهزة كمبيوتر ، يمكن أن نثبت برنامجك في كل جهاز .. ويمكن أن يكتشف كل برنامج المستخدمين الاخرين العاملين على نفس البورت .

يعني أصبح كأنه peer-to-peer ؟

هذة هي فكرة البرنامج بكل بساطة :)

بالأمكان استخدامة على اي شبكة تقريبا.

اكبر نطاق جربتة هو نطاق الأجهزة التي تستخدم نفس موفر الأنترنت او التي لها نفس قناع الشبكة الفرعي subnet mask ولم اجربة في نطاق اكبر , يعني ممكن تتخاطب مع المستخدمين في نفس الدولة.ولا اعلم بإمكانية التخاطب من دولة لدولة او الأجهزة التي تفصل بينها routers .

تحياتي

بحثت عن قلمي البارحة فلم أجدة!

...............

لم أجد سوى لوحة المفاتيح هذة

.............

تتطلع إلي بشفقة..

.............

أكاد أسمعها .. تقول (ألم يسمع بGoogle ؟!؟؟)

#5

سؤال ، هل تستخدم الـ RMI ؟؟

إذا كان نعم ،، فكيف تقوم بارسال ملف لكلاينت ؟؟ هل تستخدم الـ RMIIO

إذا كان نعم ،، الم يحدث معك أي مشاكل بخصوص هذه المكتبة !!!!!!

:lol:

صــفــر

#6
cIs.Falcon كتب:

سؤال ، هل تستخدم الـ RMI ؟؟

إذا كان نعم ،، فكيف تقوم بارسال ملف لكلاينت ؟؟ هل تستخدم الـ RMIIO

إذا كان نعم ،، الم يحدث معك أي مشاكل بخصوص هذه المكتبة !!!!!!

:lol:

لا لم استخدم RMI ولا اي مكتبة متعلقة بها .

سأتكلم عن الية البرنامج قريبا جدا بالتفصيل بعد التأكد من خلوة من المشاكل (وهذا وعد :lol: )

تم تعديل هذه المشاركة بواسطة Dr.Robert في 26 فبراير 2010 في 16:08

1

بحثت عن قلمي البارحة فلم أجدة!

...............

لم أجد سوى لوحة المفاتيح هذة

.............

تتطلع إلي بشفقة..

.............

أكاد أسمعها .. تقول (ألم يسمع بGoogle ؟!؟؟)

#7

هل هو مفتوح الكود ؟!

#8
Speed_Of_Light كتب:

هل هو مفتوح الكود ؟!

ماعدا كود واجهات المستخدم, نعم البرنامج مفتوح المصدر. تفضل بمراجعة مواضيعي السابقة.

بحثت عن قلمي البارحة فلم أجدة!

...............

لم أجد سوى لوحة المفاتيح هذة

.............

تتطلع إلي بشفقة..

.............

أكاد أسمعها .. تقول (ألم يسمع بGoogle ؟!؟؟)

#9

أخ مازن

قمت بتحميل المرفق ولم أجد أي كود؟

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#10

بسم الله الرحمن الرحيم

آلية البرنامج:

يقوم البرنامج وعند التشغيل بفتح ثلاثة منافذ في الجهاز الذي يعمل علية:

-الاول للتنصت على البيانات المرسلة لهذا الجهاز فقط unicasts

-الثاني للتنصت على بيانات البث broadcasts

-الثالث للتنصت على طلبات الاتصال TCP

وايضا يقوم البرنامج ببث رسالة تطلب من الاجهزة المتلقية ارسال معلوماتها.

وبالتلي تقوم الاجهزة في المجموعة (التي يعمل عليها نفس البرنامج متنصتا على نفس عنوان ومنفذ البث) ببث معلوماتها.

معلومات كل جهاز تتضمن اسم المستخدم + ارقام المنافذ المستخدمة + عنوان الجهاز IP address

يقوم الجهاز مرسل الطلب بإستقبال تلك المعلومات وتخزينها كقاعدة بياناتة الخاصة . كما وتقوم الاجهزة الاخرى بتحديث قاعدة بياناتها بإضافة معلومات الجهاز الجديد.

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

يتم استخدام تلك المعلومات في قاعدة البيانات للتواصل مع بقية الاجهزة.

- المنفذ الاول لرسائل المحادثة الخاصة.

-المنفذ الثاني للرسائل العامة

-المنفذ الثالث لتبادل الملفات

وهذة هي الية البرنامج.

في الحقيقة هذة الألية هي ممثلة في class واحد فقط اسمة NetworkService من الحزمة التي تحدثت عنها في مواضيع سابقة.

ولقد قمت بتوضيح طريقة استخدامة كذلك.

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

وبإمكان المستخدم اضافة ميزة التشفير اليها لمزيد من الموثوقية او اي ميزة اخرى (تم مراعاة ذلك في التصميم).

قاعدة البيانات التي توفرها NetworkService بالإمكان استخدامها للتواصل مع اجهزة عن بعد وبأي صورة كانت .وما هذا البرنامج الا اختبار لذلك الclass و مثال عملي لما يمكن استخدامة فية. باقي البرنامج عبارة عن واجهات المستخدم لا اكثر .

ولقد قمت برفع الحزمة في موقع sourceforge (والشكرللأخ هويدي صاحب الإقتراح :) ). وهذا هوالرابط

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

تم تعديل هذه المشاركة بواسطة Dr.Robert في 27 فبراير 2010 في 20:54

1

بحثت عن قلمي البارحة فلم أجدة!

...............

لم أجد سوى لوحة المفاتيح هذة

.............

تتطلع إلي بشفقة..

.............

أكاد أسمعها .. تقول (ألم يسمع بGoogle ؟!؟؟)

#11

هل تقصد أن كل طرف يعتبر كلاينت وسيرفر بنفس الوقت بحيث أنه اذا تم الإتصال بأي طرف من هذه الأطراف يقوم بخزن بياناته وإرسالها لكل الأطراف المتصله بهذا الطرف وكأن كل الأطراف متصله بسيرفر واحد وهي في الحقيقه ان لكل طرف سيرفر خاص يعتبر كلاينت لطرف آخر أو بالأصح متصل بسيرفر آخر وهكذا... هذا قصدك؟!

تم تعديل هذه المشاركة بواسطة M.Allaw في 27 فبراير 2010 في 21:56


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

myHeartOutStream = MAllaw.getHeart().getOutputStream();
myHeart = new HeartOutputStream(myHeartOutStream);

while(myHeart.isStillBeating())
myHeart.write("I ♥ Java");

#12

أخ مازن لو لم يكن لديك مانع نريد فقط أن نرى الآلية التي استخدمت بها الفئة Network service

أخذت نظرة سريعة على الحزمة

ومن النظرة الأولية يبدو لي أن هذا عمل سنين وعمل قوي ومضني في نفس الوقت

لكني أريد بعض الأمثلة على الحزمة حتى أتمكن من استخدامها في برامجي القادمة :)

من الملاحظة الأولية على الحزمة لاحظت أنك تستخدم الدالة finalize

وهذه الدالة غير مضمونة أبداً

والتعامل معها قد يكون مضراً أكثر من كونه مفيداً

كنت قرأت عن مشاكلها في كتاب effective java لكني لا أذكر شيئاً كالعادة

لاحظت في بعض الأحيان أنك تستخدم encapsulation وأحياناً أخرى لا تستخدمها

هل من سبب معين؟

تحياتي

تم تعديل هذه المشاركة بواسطة علاء الصالحي في 28 فبراير 2010 في 00:00

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#13
M.Allaw كتب:

هل تقصد أن كل طرف يعتبر كلاينت وسيرفر بنفس الوقت بحيث أنه اذا تم الإتصال بأي طرف من هذه الأطراف يقوم بخزن بياناته وإرسالها لكل الأطراف المتصله بهذا الطرف وكأن كل الأطراف متصله بسيرفر واحد وهي في الحقيقه ان لكل طرف سيرفر خاص يعتبر كلاينت لطرف آخر أو بالأصح متصل بسيرفر آخر وهكذا... هذا قصدك؟!

تتعرف الاطراف على الطرف الجديد عندما يقوم بإرسال طلب التعرف اليهم ,هذا الطلب يتم استقبالة من الجميع بدون وسيط (لأنة مرسل الى عنوان بث مشترك مع الجميع), هذا الطلب يجعل جميع الأطراف تبث معلوماتها ( كل طرف يبث معلوماتة فقط). وبالتالي جميع الأطراف تتعرف على الطرف الجديد وهو يتعرف عليهم.

لا يحدث اتصال فعلي بين الاطراف الا عند الحاجة (لإرسال ملف مثلا).

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

لا افضل مصطلح ان كل طرف عبارة عن client &server لأنة ليس server بالكامل او client بالكامل . المسألة اقرب ل peer-to-peer في نظري.

بحثت عن قلمي البارحة فلم أجدة!

...............

لم أجد سوى لوحة المفاتيح هذة

.............

تتطلع إلي بشفقة..

.............

أكاد أسمعها .. تقول (ألم يسمع بGoogle ؟!؟؟)

#14
علاء الصالحي كتب:

أخ مازن لو لم يكن لديك مانع نريد فقط أن نرى الآلية التي استخدمت بها الفئة Network service

أخذت نظرة سريعة على الحزمة

ومن النظرة الأولية يبدو لي أن هذا عمل سنين وعمل قوي ومضني في نفس الوقت

لكني أريد بعض الأمثلة على الحزمة حتى أتمكن من استخدامها في برامجي القادمة :)

من الملاحظة الأولية على الحزمة لاحظت أنك تستخدم الدالة finalize

وهذه الدالة غير مضمونة أبداً

والتعامل معها قد يكون مضراً أكثر من كونه مفيداً

كنت قرأت عن مشاكلها في كتاب effective java لكني لا أذكر شيئاً كالعادة

لاحظت في بعض الأحيان أنك تستخدم encapsulation وأحياناً أخرى لا تستخدمها

هل من سبب معين؟

تحياتي

اخي علاء :

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

العمل كان فعلا عمل مضني وعمل سنين ولم اكن اعلم هل سينتهي ام لا , ولكنة يستحق كل ثانية اذا كنت ستجد فية فائدة لبرامجك القادمة :)

حاولت ان اصيغ javadoc الخاص بالحزمة بحيث ان اجعل المبرمج "في الصورة" (في الغالب) ولا اجبرة على قراءة الكود حتى يعرف ما هذة الفئة اوما فائدتها .

ارجو ان تقرأ javadoc بالنسبة للفئة NetworkService وابتعد حاليا عن الكود. لتعرف فكرة الفئة اولا. ستحتاج للغوص في الكود فيما بعد اذا احتجت لتوسيع اليتها او تحسينها.

قم بقرائة javadoc الخاص بالفئة AbstractTask وقم بتجربتها لوحدها في مثال بسيط لتعرف الية المعالجة التي يعتمد عليها كل شيء في الحزمة , من معالجة البيانات الواردة\الصادرة والى اطلاق الاحداث event generation & notification .

فهم هذة الفئة بالذات سيسهل عليك فهم الية عمل الفئات التي تندرج ضمن الواجهة SocketListener interface وكذلك فهم نظام سواقة الأحداث الخاص بالفئة NetworkService بالنسبة للاحداث من نوع ClientStateChangeEvent وكذلك نظام معالجة البيانات مرسلة\مستقبلة.

بعد ذلك انتقل للفئة MessageListener وهي حالة خاصة من AbstractTask تستخدم كنظام معالجة البيانات (صادرة\واردة).

ستعرف في النهاية ان الفئة NetworkService ما هي إلا مجموعة SocketListeners تعمل في نفس الوقت وتستخدم نظام معالجة واحد للبيانات المستقبلة (MessageListener ) وهذا الأخير مرتبط بواجهة المستخدم ClientInterface (الهدف النهائي للبيانات الواردة ).

وايضا تستخدم نظام معالجة بيانات اخر (MessageListener ) للبيانات المرسلة وهذا الاخير مرتبط بالsockets مباشرة (الهدف النهائي للبيانات المرسلة).

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

و في نفس الوقت تأخد البيانات من المستخدم وتعالجها في طريقها للهدف النهائي الثاني.

العمليات التي تتم على البيانات في المرحلة المتوسطة وقبل الوصول للهدف النهائي هي بالكامل بيد المستخدم للفئة NetworkService فمثلا فك تشفير البيانات هي عملية متوسطة قبل الوصول الهدف النهائي الاول. وتشفير البيانات قبل الوصول للهدف النهائي الثاني

كل هذة العمليات المتوسطة يستطيع المستخدم اضافتها او بالأصح"تسجيلها" مع NetworkService وستصبح جزء من الية معالجة البيانات صادرة\واردة.

وفي هذة المسألة راجع الواجهة MessageHandler interface

------------------------------------------------------------------------------------------------

بالنسبة للدالة finalize فأنا لم اجد مفر من استخدامها , تحسبا لإهمال المبرمج في استدعاء NetworkService.stopService() او SocketListener.stopListening() .فأنا لا استطيع اجبارة على استدعائهم عند الفراغ من الإستخدام , ولذلك فأخر امل هو ان يقوم garbage collector بإستدعائها عبر finalize وتخليص موارد الجهاز. بالطبع وفي اغلب الأحيان المبرمج سيكون اكثر وعيا ولكني وضعتها تحسبا لأسوأ الاحوال.

اقتباس
لاحظت في بعض الأحيان أنك تستخدم encapsulation وأحياناً أخرى لا تستخدمها

هل من سبب معين؟

اعذرني فلم افهم قصدك في هذة النقطة.

وبالتوفيق للجميع.

تم تعديل هذه المشاركة بواسطة Dr.Robert في 28 فبراير 2010 في 02:11

بحثت عن قلمي البارحة فلم أجدة!

...............

لم أجد سوى لوحة المفاتيح هذة

.............

تتطلع إلي بشفقة..

.............

أكاد أسمعها .. تقول (ألم يسمع بGoogle ؟!؟؟)

#15

لدي تساؤل أخي ، وهو ما يحيّرني بصراحة ، ليس له علاقة مباشرة بالحزمة .

كيف تقوم بتجربة هذه الحزمة ( أو البرنامج في أول المشاركة ) ؟

هل تستخدم أكثر من جهاز .. وتربطهم بشبكة محلية أو شبكة الانترنت ؟

أم هل تستخدم " أجهزة عمل تخيلية " Virtualization " ، مثل VirtualBox ؟

حاولت تجربة مثالك لأعرف كيف يعمل ؟ ولكن أجد ان تطوير وتجربة هذه البرامج صعب ، اذا لم تكن تملك عدة أجهزة -( ثلاثة على الأقل مربوطة في شبكة واحدة (-

تم تعديل هذه المشاركة بواسطة الشمري في 28 فبراير 2010 في 04:55

logo1.png تطبيق طمأنينة ، نسخة بيتا على أندرويد

عبدالله الشمّري - Al-Shammari

CodingAlone.com

twitter @abshammeri

abshammeri AT gmail.com

github : abshammeri

#16

بصراحه عمل متقن أو مثلما يقولوا عندنا (شغل نظيف :) ) , بس ماحاولت توجد لهذا البرتكول أسم بحيث تقدر توثقه في الـIEEE smile.gif , مثلاً "PPP "Ping Pong Protocol happy.gif

ياليت لو تسوي UML يشرح الباكيج بحيث يقدر الكل يضيف أو يعدل أو حتى يشارك بمقترح أو فكره

لي عوده بأذن الله وأتمنى لك كل توفيق :)

تقبل مروري


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

myHeartOutStream = MAllaw.getHeart().getOutputStream();
myHeart = new HeartOutputStream(myHeartOutStream);

while(myHeart.isStillBeating())
myHeart.write("I ♥ Java");

#17
اقتباس
كيف تقوم بتجربة هذه الحزمة ( أو البرنامج في أول المشاركة ) ؟

اعتقد ان اسهل طريقة هي ان تجرب استخدام البرنامج مع صديق او اكثر عبر الانترنت (ويفضل اصدقاء في نفس البلد ويستخدموا نفس موفرخدمة الانترنت ).

او اذا كنت تستطيع الوصول لشبكة LAN كشبكة مكتب او معهد او حتى مقهى انترنت فهذا ممكن ايضا. انا عن نفسي قمت بتجربتة في معهد كنت ادرس فية وكذلك في مؤسسة كنت اعمل فيها .

اقتباس
مثلاً "PPP "Ping Pong Protocol

اسم روووعة :lol:

اقتراح جميل ولقد قمت بوضع المشروع في sourcefroge . نجاح او فشل المشروع سيحدد اي خطوة مقبلة , واعتقد ان على المشروع ان يثبت فائدتة اولا قبل اتخاذ اي خطوة جديدة . شكرا على الاقتراح :)

بالنسبة لUML فلا اجيدها للأسف :blush: , واعتقد ان javadoc مناسبة لحد ما . ووجود المشروع في sourcefroge يتيح مسألة النقاش وتقديم الاقتراحات والمشاركة ايضا في المشروع كمطورين.

تحياتي للجميع.

بحثت عن قلمي البارحة فلم أجدة!

...............

لم أجد سوى لوحة المفاتيح هذة

.............

تتطلع إلي بشفقة..

.............

أكاد أسمعها .. تقول (ألم يسمع بGoogle ؟!؟؟)

#18

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

المهم هذا مجرد بداية وانت شوف اذا تقدر تخرج مما قلته جمله مفيده أو مدخل لفكرة أكثر منطقية منها blush.gif

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

هذه ليست فكره جديده لكن شوف انت ايش ممكن تضيفه على هذه الفكره لأجل تخليها مبتكره <== لاتلومه سهراااااااااان huh.gif


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

myHeartOutStream = MAllaw.getHeart().getOutputStream();
myHeart = new HeartOutputStream(myHeartOutStream);

while(myHeart.isStillBeating())
myHeart.write("I ♥ Java");

#19

أخ مازن بالنسبة لموضوع encapsulation

في بعض الأحيان أجدك تجعل كل الحقول fields خاصين بالكائن private

مثل الفئة NetworkService

وفي فئات أخرى تتركها تحت نطاق الحزمة package

مثل الفئة McastPacketReceiver والفئة PacketReceiver

هل من سبب معين؟

أحب أن أؤكد أن هذا المفهوم من المفاهيم الأهم في برمجة الحزم

حيث يجعل التعامل مع الحقول يتم عن طريق بوابة موحدة (دوال خذ وهات set & get methods)

وهذا من شأنه أن يضمن لك أن يتم التعامل مع الجميع بطريقة واحدة

ويقلل من الأخطاء bugs في الحزمة بشكل كبير

كما يمنع تكرار مقاطع الشيفرة بشكل متكرر

ربما تكون استخدمته بشكل أساسي في الحزمة ونسيت فقط أن تجعل الحقول private

لكني أشدد على أن هذه النقطة تضمن عدم وقوع أخطاء في أي مكان

بالنسبة لي أريد أن أتعمق في فكرة الحزمة بشكل أساسي

بمعنى آخر أريد أن أعرف ما هي التطبيقات التي يمكنها أن تخدمني فيها

بدا واضحاً لي بشكل مبدئي أن الحزمة أقرب إلى اعتبارها protocol يعمل على تنظيم برمجيات peer to peer

لكني أريد أن أستوثق منك

هل ما فهمته صحيحاً أم لا؟ وإن كان لا يا حبذا لو توضح لي أكثر

أعتذر إن كنت قد تحدثت عن نفس النقطة مسبقاً فأنا كنت مشغول بعض الشيء بالدراسة والعمل ولم أكن أتابع

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#20
اقتباس
بس أظنها فكره غبيه لأنها مابتستفيد من فكرة تعريف عضو على باقي الأعضاء لأنهم طاقم واحد والعدد معروف والأشخاص معروفين وبث البيانات بين الأعضاء يكون للرسائل النصيه فقط وليست للملفات.

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

افكار ممتازة كعادتك :)

اخ علاء انا اعرف ما معنى encapsulation ولكن لم اعرف المقصدمن سؤالك.

بالنسبة للحقول default التي صلاحية دخولها من فئات الحزمة فقط , فهي وضعت بهذا الشكل عن عمد .

وهي متعلقة بوظائف تكاملية بين عدة فئات داخل الحزمة ولذلك هي ليست private ولا توجد لها setters & getters.

ما فهمتة انت صحيح 100% :) والحزمة متعلقة بتطبيقات peer-to-peer في غالبها.(رغم امكانية الاستفادة من بعض الفئات في بناء الخوادم)

تم تعديل هذه المشاركة بواسطة Dr.Robert في 1 مارس 2010 في 13:47

بحثت عن قلمي البارحة فلم أجدة!

...............

لم أجد سوى لوحة المفاتيح هذة

.............

تتطلع إلي بشفقة..

.............

أكاد أسمعها .. تقول (ألم يسمع بGoogle ؟!؟؟)

#21

احب ان اضيف ان تطبيقات الحزمة لا تقتصر على التخاطب بين المستخدمين فقط. ولكن التخاطب بين البرامج ايضا , يعني مثل RMI ,وفي هذة الحالة يحتاج المبرمج لتصميم بروتوكولة الخاص . وبالتالي يمكن استخدامها في تطبيقات مثل التحكم عن بعد اوالمراقبة وغيرها من تطبيقات distributed systems

بحثت عن قلمي البارحة فلم أجدة!

...............

لم أجد سوى لوحة المفاتيح هذة

.............

تتطلع إلي بشفقة..

.............

أكاد أسمعها .. تقول (ألم يسمع بGoogle ؟!؟؟)

#22
اقتباس

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

يهيألي أن حل المشكلة التي تتكلم عنها سيكون الحل الأفضل لها هو البرمجة باستخدام interface

أنت لديك واجهة للعمل المطلوب منك يجب عليك القيام ببنائها implementation

وهذا ما يسمونه API

لم أستطع الفهم أخ مازن

بالنسبة لموضوع encapsulation لو أمكن أن توضح كلامك بمثال من الحزمة

حتى أتمكن من الفهم بشكل أكبر

تحياتي

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

#23
اقتباس

لم أستطع الفهم أخ مازن

بالنسبة لموضوع encapsulation لو أمكن أن توضح كلامك بمثال من الحزمة

حتى أتمكن من الفهم بشكل أكبر

اخ علاء

أنظر للفئات التي تندرج تحت الواجهة SocketListener interface ستجد ان اغلب حقولها معرفة ك default يعني لا public ولا private ولا protected .يعني باللإمكان الوصول اليها من قبل فئات الحزمة فقط.ولا صلاحية للمستخدم عليها.

هذه الحقول يجب ان لا تتاح للتعديل من قبل المستخدم لحساسيتها, بعد انشاء الغرض وتحديد قيمها من constructor .

عند استخدام الفئة NetworkService تلك الحقول قابلة للتعديل مع ضوابط.

الفئة NetworkService مرنة اكثر وتسمح للمستخدم بإعادةتعيين تلك الحقول مثل مثل كرت الشبكة المستخدم ارقام المنافذ وغيرها.

وتعديلها عبر NetworkService يقلل نسبة حدوث اخطاء في تلك الفئات لأنة لا يتم "على مزاج المستخدم :P " ولكن في وقت مناسب فقط وهو عندما تكون تلك SocketListeners متوقفة عن العمل وبالتالي نقلل نسبة حدوث الخطأ الناتج عن اهمال المستخدم. لذلك تجد ان NetworkService تضع ضوابط للمستخدم في مسألة الوصول لتلك الحقول , هذة الضوابط غير موجودة في SocketListeners ولذلك فإن الحقول encapsulated.

انظر للدالة Init() وهي دالة private في NetworkService.

قد تقول ولماذا لا تضع مثل هذة الضوابط في SocketListeners مباشرة:

- اولا ستزيد من تعقيد الكودالخاص بتلك الفئات.

- ثانيا لعدم منطقية اتاحة تلك الحقول اساسا في ذلك السياق .

_________________________________________________

سأضع سؤال مهم وسأجيب عنة

لماذا قد احتاج الى تصميم بروتوكول عندما استخدم الفئة NetworkService في بناء البرامج متعددة الاطراف distributed system ؟ وما علاقة هذا البروتوكول بالبروتوكول المستخدم داخل الفئة؟

- البروتوكول المستخدم في NetworkService class هو بروتوكول خاص بالتعرف على الأطراف فقط, وكذلك مسؤول عن حصر مسألة تبادل البيانات بين تلك الاطراف فقط (نوع من ال authentication ) .

لا علاقة لهذا البروتوكول بالبروتوكول التخاطبي بين الأطراف.

البروتوكول الذي ستستخدمة للتخاطب سيعمل "محمولا" على البروتوكول السابق.

يعني مثل TCP/IP ,حيث ان البروتوكول المحمول (TCP) مسؤول عن نقل البيانات من منفذ الى منفذ port to port .

والبروتوكول الحامل (IP ) مسؤول عن نقل تلك البيانات من جهاز لجهاز end to end.

وفي حالتنا هذة فإن البروتوكول الذي ستستخدمة (سواء استخدمت بروتوكول معروف او قمت بتصميم واحد جديد) هو لنقل البيانات من معالجة الى معالجة اخرى process to process ,

والبروتوكول الداخلي للفئة NetworkService هو مسؤول عن نقل تلك البيانات من طرف لطرف peer to peer.

لذلك فإن العلاقة تكاملية كما ترى .

بالنسبة لRMI فإن "كل شيء جاهز :P " ومسألة البروتوكولات معزولة عن المستخدم تماما , لذلك فإن استخداماتها قد تكون محدودة في عالم الشبكات.

بحثت عن قلمي البارحة فلم أجدة!

...............

لم أجد سوى لوحة المفاتيح هذة

.............

تتطلع إلي بشفقة..

.............

أكاد أسمعها .. تقول (ألم يسمع بGoogle ؟!؟؟)

#24
اقتباس
يهيألي أن حل المشكلة التي تتكلم عنها سيكون الحل الأفضل لها هو البرمجة باستخدام interface

أنت لديك واجهة للعمل المطلوب منك يجب عليك القيام ببنائها implementation

وهذا ما يسمونه API

ممكن توضحلي أكثر ياعلاء؟ في اي نقطه بالضبط سأحتاج لأستخدامها؟

بالنسبه لفكرة المشروع نفسه , كيف تراها؟


HeartOutputStream myHeart;
OutputStream myHeartOutStream;

myHeartOutStream = MAllaw.getHeart().getOutputStream();
myHeart = new HeartOutputStream(myHeartOutStream);

while(myHeart.isStillBeating())
myHeart.write("I ♥ Java");

#25
اقتباس
أنظر للفئات التي تندرج تحت الواجهة SocketListener interface ستجد ان اغلب حقولها معرفة ك default يعني لا public ولا private ولا protected .يعني باللإمكان الوصول اليها من قبل فئات الحزمة فقط.ولا صلاحية للمستخدم عليها.

أخ مازن أنا لا أتكلم هنا عن أخطاء المستخدمين للحزمة وإنما أتكلم عن أخطاء المطورين للحزمة (لنقل أن الموضوع مقتصر عليك حالياً)

سأعطيك مثال بسيط

لنقل لدينا متغير x هذا المتغير موجود في الفئة X وتقوم بتغيير قيمته في الفئة Y و Z

عندما بدأت في برمجة الحزمة

كانت الحزمة كنت تعتقد أن عملية تغيير قيمة المتغير x مجرد جملة

variable x=5

بعد أن تعمقت كثيراً في الحزمة وفكرت جيداً في منطقها

وجدت أن القيمة حتى تتغير يجب أن تكون القيمة أكبر من 5

جميل جداً ستقول لي أبحث عن كل تواجد لـ x وأقوم بتغييره

سأقول لك ما الذي سيحصل لو أنك نسيت مكاناً معيناً

أووووووووووووووه هذا bug لعين لكي تكتشفه ستضيع وقتاً لا أول له ولا آخر

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

سأقول لك لماذا تضطر للقيام بهذا كل مرة

ماذا سيحصل لو أنك نسيت في إحدى المرات

لنفترض جدلاً أنك لن تنسى وأن الموضوع مئة في المئة

ماذا عن متغير تتغير قيمته في عشرة فئات

يااااااااااااااااااااااه عملية مملة جداً

لنفترض جدلاً أن هذا كله لم يحصل وأنك لن تمل ولن تنسى

(وأقول جدلاً لأني كثير النسيان وملول لأبعد الحدود)

فما الذي سيحصل لو توسعت الحزمة أكثر وأردت أن توظف موظف يساعدك في تطوير بعض الجزئيات من الحزمة

هل تعتقد أنك تضمن هذا الموظف بنفس القدر الذي تضمن به نفسك

كل هذا لن يكون في حسبانك لو أنك خصصت دالة تقوم بعملية set لهذا المتغير

وإذا كنت لا تريد لهذه الدالة أن تظهر لمستخدم الحزمة

اجعل الدالة من النوع package وإذا كنت لا تريد للدالة أن تخرج خارج الفئة اجعلها private

على كل يبقى الأمر عائد لك فالحزمة حزمتك والرأي رأيك

لكني أوصي وبشدة بهذا الموضوع

بالنسبة للأخ محمد علاو

سأوضح لك الموضوع بمثال

أنا وأنت نريد أن نعمل على على برنامج موظفين

سنقوم في البداية بتحديد الفئات الأساسية

بمعنى آخر وضع خطوط عريضة للبرنامج

بعد ذلك سنفكر في محتويات كل دالة بهكذا نخرج بأسماء الدوال والخواص لكل فئة

ونكتب Interface يصف آلية العمل ما بين الفئات المختلفة مع توثيق لعمل كل دالة في الفئة

ثم بعد هذا سنحدد لكل منا مجموعة من الواجهات عليه أن يقوم بعملية بنائها

يقوم كل منا ببناء الفئات الخاصة به بمعزل عن الآخرين

ثم نقوم بعمل جلسة مراجعة لكل الفئات التي قمنا بكتابتها ونرى هل فعلاً يوجد تضاد بين ما كتبناه جميعاً

أو يوجد نوع من عدم الفهم أو غياب بعض النقاط

بعد هذا يقوم كل منا بفحص الدوال التي قام بكتابتها عن طريق TestCases

يكتبها لكل حالة

وبهذا نكون أنهينا البرنامج ككل

ربما الفكرة التي اقترحتها تصلح في مرحلة المراجعة وما بعدها

تحياتي

تم تعديل هذه المشاركة بواسطة علاء الصالحي في 1 مارس 2010 في 23:09

حزمة المحرك الإصدارة 0.8

أي أحد يجد أني ظلمته فليراسلني

وبإذن الله لو كان له حق سيأخذه

728x90.png

مواضيع مشابهة