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

كلام في الشبكات

بدأه Dr.Robert في 13 فبراير 2010 · 31 رد · 3,096 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

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

قد يختلف موضوع برمجة الشبكات انة مهما تطورت الأدوات واللغات , فإن الهموم تظل نفسها.

وحتى "ادخل في المفيد" سأذكر مسألتين اساسيتين يخوض فيها مبرمج الشبكات المحترف وبشكل دائم وهي محل خلاف أزلي .

ارجو ان تصبروا علي , وسأحاول ان لا اطيل عليكم.

1-مسألة الThreads :

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

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

تقوم هذة الthread بخدمة عميل واحد فقط , حيث تستقبل الطلب منة request وتقوم بإرسال الرد لة response ثم تتبدد.

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

لكن تخيل 1000 عميل في نفس الوقت؟ هذا يعني 1000 thread ...تخيل 5000 عميل؟ هذا يعني 5000 thread ؟؟؟.. وماذا بعد؟...ستنهار JVM في النهاية !

وما الطريقة البديلة ؟؟

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

2- مسألة الMemory:

أبسط مثال لتأثير موضوع الذاكرة في تصميم برامج الشبكات هو التعامل مع DatagramSocket الخاصة ببروتوكول UDP , بإستخدام هذة الأداة فأنت ترسل \تستقبل البيانات بشكل مصفوفة من نوع byte أي buffer .

استخدام DatagramSocket بسيط جدا جدا... جميل!

اسأل نفسك السؤال التالي... عند التنصت على البيانات الواردة, هل يجب أن أستخدم buffer جديد في كل مرة؟ ام استخدم نفس الbuffer ؟؟ اذا كنت تعتقد أن الإجابة هينة.. فاقرأ التالي:

اذا كنت تستخدم buffer جديد في كل مرة , هذا يعني انك تستخدم مساحة جديدة في الذاكرة لكل packet تستلمة؟؟

هذا يعني أن الذاكرة ستظل مشغولة ببيانات لا فائدة منها.. وهذا هدر.

البعض يقول ((أنا ادرى ببرنامجي.. والبيانات التي ارسلها واستقبلها ليست كبيرة وغير مؤثرة وفي النهاية GarabageCollector سيقوم بدورة ويزيحها)).

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

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

والان لنعد لموضوعنا , قد يفضل البعض إستخدام buffer واحد , جميل جدا.

هذا يعني ان الThread المسؤولة عن التنصت يجب أن تنتظرحتى يتم معالجة البيانات في buffer قبل استبدالها. جميل جدا جدا... والان أسأل نفسك السؤال هذا (كثرت الأسئلة هة؟) كيف سيتم هذ؟؟

البعض قد يقول (( حسنا , الامر بسيط – سأجعل الThread المتنصتة تتزامن مع Thread أخرى تقوم بمعالجة البيانات , وبالتالي لن يتم استبدال البيانات في buffer إلا بعد معالجتها)).

والبعض قد يقول: (( بلا إنتظار بلا وجع قلب , سأجعل الThread المتنصتة تقوم هي نفسها بمعالجة البيانات التي تستلمها ..ولا تقول لي أن معالجة البيانات قد تستغرق وقتا فتفوت علينا اي بيانات واصلة جديدة..لأني أعرف "تماما" ما يقوم بة برنامجي "و الشبكة مالها دعوة هذة المرة!!")).

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

"ولكن" هناك مأخذ واحد عليهما (على الأقل عندي) .. تخيل حدوث خطأ -بعد الإستلام - في معالجة البيانات؟؟

نعم , نعم انت ادرى ولن تترك خطأ كهذا يحدث في برنامجك . "خذني على قد عقلي" و تخيل أن المعالجة تسببت في خطأ غير متوقع "مع بيانات معينة مثلا". فما النتيجة؟؟.. في الحالة الأولى ستنتظر الThread المسؤولة عن التنصت الى مالا نهاية. وفي الحالة الثانية ستتبدد!.

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

والأن بعد أن انتهينا من إستعراض المسألتين "صدقوني أختصرت قدر الإمكان".

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

خلاصة القول نحن-في هذة المرحلة- بحاجة لشيء "أكثر" من الشرح النظري والأمثلة "المدرسية" و اقل من البرامج الجاهزة المقيدة.

ليس في الشبكات وحسب ولكن في أي مجال برمجي أخر , وهل تعلم لماذا؟؟, لأن هذا هو السبيل " للإبتكار" و "الإبداع"

وتطوير برامج ونظم تحمل بصمة المبرمج العربي الخاصة , وتتوقف عن "إعادة اختراع العجلة!" و تبدأ في "البناء" وليس "إعادة البناء" , هذا هو مبدأي الذي انام واصحو علية منذ سنوات.

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

وها أنذا بدأت بنفسي واضع خبرتي المتواضعة في يد الجميع.

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

وأشكر القاريء الصبور, فعندما ابدأ الكتابة لا أتوقف!

والله من وراء القصد.

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

3

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

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

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

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

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

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

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

#2

الاخ الكريم دكتور مازن

مقالة رائعة جدا و هو موضوع مهم جدا فعلا الاتصال بأكثر من جهاز

لدي سؤال هل استخدمت الخزمة nio في الحزمة التى صممتها ؟؟

و شكرا لك على هذه المقالة الرائعة ( بلا مجاملات )

سبـــــحــــان الله و بحمده سبحان الله العظيم

403100468.gif

#3
sameh mahmoud كتب:

الاخ الكريم دكتور مازن

مقالة رائعة جدا و هو موضوع مهم جدا فعلا الاتصال بأكثر من جهاز

لدي سؤال هل استخدمت الخزمة nio في الحزمة التى صممتها ؟؟

و شكرا لك على هذه المقالة الرائعة ( بلا مجاملات )

اشكرك على الرد وعلى قوة ملاحظتك , وبالنسبة للحزمة المستخمة فأنا استخدمت حزمة ادنى (lower-level) وهي io .

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

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

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

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

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

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

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

#4

لا يمكن اعتبار io حزمة أقرب إلى العتاد lower level من nio !

وخاصة أن الأخيرة natively implemented ، وهي أسرع من الأولى:

اقتباس

The new I/O (NIO) APIs introduced in v 1.4 provide new features and improved performance in the areas of buffer management, scalable network and file I/O, character-set support, and regular-expression matching.

http://java.sun.com/j2se/1.4.2/docs/guide/nio/index.html

تم تعديل هذه المشاركة بواسطة Speed_Of_Light في 14 فبراير 2010 في 00:29

#5

ليست كل عبارة lower level توحي عتاد

نتيجة لتطوير الاشياء نستطيع الاطلاق على الاشياء البدايئة lower level

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

لصاحب الموضوع

شكرا على الثرثرة المفيدة :P

موضوع تبادل الخبرات موضوع جدا رائع اخي الكريم وبالفعل مفيد

اريد ان اقترح عليك موضوع ..ما رأيك بان تتحف القسم بمشروع شبكي نعمل عليه كاعضاء جميعا وليكن فريد من نوعه

وان نتعمق اكثر بادوات اللغة وليكن موضوعنا عن voic ونقل الvoic على الشبكة (اعاني كثيرا من هذا المشروع هذه الايام لم يعطي نتائج جيدة لما كتبته :P )

انا كنت افكر بان ابدئه هنا لكي استفيد وافيد قليلا وخصوصا اني اعمل عليه حاليا

لكن خفت بان انشغل بشئ فجأ ولا استطيع الاكمال كصاحب موضوع (لانني كأم العروس فاضي ومشغول )

وضغوطات العمل الشبكية هي التي تمنعي

فأذا احببت ان تبدأ ستجد عون لك من عدة من الاعضاء واولهم انا كمبتدأ :wink:

فكر بالموضوع واذا اعتمدت فعليك بزر موضوع جدبد

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

الفكرة لن تكون عبارة عن voic IP .... لاننا سنتعب مبدئيا فيها وهناك خدمات يجب ان تتوفر في المشروع كمخدمات VoIP

اتكلم عن فكرة voic chat مثلا واستخدام بروتوكول RTP (Rial Time Protocol )

او ما شابه ...خطط للمشروع

وساكون معك على تواصل ....اذا ما صار شي :ph34r: بعون الله

بالتوفيق

1
#6
Speed_Of_Light كتب:

لا يمكن اعتبار io حزمة أقرب إلى العتاد lower level من nio !

وخاصة أن الأخيرة natively implemented ، وهي أسرع من الأولى:

http://java.sun.com/j2se/1.4.2/docs/guide/nio/index.html

الأخ Speed_of_light كلامك صحيح 100% , واعذرني على سوء التعبير فقد كنت اقصد- كما تفضل الاخ shado بالتوضيح مشكورا - حزمة بدائية اقل تطورا, والسبب في استخدامها بدل nio هو حاجتي للstream فقط ,اما بالنسبة للbuffering فقد استخدمت ادواتي الخاصة الملائمة للتصميم اكثر .

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

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

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

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

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

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

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

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

#7
اقتباس

اتكلم عن فكرة voic chat مثلا واستخدام بروتوكول RTP (Rial Time Protocol )

او ما شابه ...خطط للمشروع

وساكون معك على تواصل ....اذا ما صار شي بعون الله

لماذا إعادة اختراع العجلة ؟!

http://www.google.com/search?hl=ar&q=voice+chat+java+opensouce&btnG=بحث!&lr=&aq=f&oq=

تم تعديل هذه المشاركة بواسطة Speed_Of_Light في 14 فبراير 2010 في 15:39

#8

يهيألي أن الموضوع الذي تتكلم عنه حضرتك يعمل تحت بند fault tolerance

عملية التزامن ليست بالعملية التي يستهان بها خصوصاً مع ضغط مثل الذي نتحدث عنه

أعتقد أن هناك حاجة للتفكير بحل آخر

على العموم الحل المقترح في النظم الموزعة الحديثة يسمى replica

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

تحياتي

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

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

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

728x90.png

#9

مارأيكم بنظام disconnected mode حيث عندما يريد جهاز أ ارسال رسالة الى الجهاز ب , يقوم أ بالاتصال بـ ب و من ثم يرسل له البيانات المطلوبة , ثم يقوم أ بغلق الاتصال مع ب بعد ان يرسال ب اشارة تمام الوصول الى أ

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

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

ياريت السادة الخبراء يفيدونا في هذه الفكرة البسيطة

تم تعديل هذه المشاركة بواسطة sameh mahmoud في 15 فبراير 2010 في 08:35

سبـــــحــــان الله و بحمده سبحان الله العظيم

403100468.gif

#10
sameh mahmoud كتب:

مارأيكم بنظام disconnected mode حيث عندما يريد جهاز أ ارسال رسالة الى الجهاز ب , يقوم أ بالاتصال بـ ب و من ثم يرسل له البيانات المطلوبة , ثم يقوم أ بغلق الاتصال مع ب بعد ان يرسال ب اشارة تمام الوصول الى أ

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

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

ياريت السادة الخبراء يفيدونا في هذه الفكرة البسيطة

الذي تتكلم عنة هو بالضبط ما يقوم بة بروتوكول TCP

ولا أعتقد بوجود Application protocol يقوم بالإحتفاظ بالإتصال بدون استخدام . شيء طبيعي من السيرفر انة يقطع الإتصال اول ما ينتهي الconversation مع الclient ,هكذا تعمل بروتوكولات http,ftp,dns,soap (والتي هي قائمة على TCP اساسا)

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

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

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

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

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

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

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

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

#11

اعذرونى على المداخلة بهذا الرد

" هو انا ليه مش فاهمة حاجة من اللى حضراتكم بتقولوه"؟

00020309t.gif

1958_1963.gif
#12

مش فاهمة ايش بالضبط يا إسراء

فرق الخبرة والبرمجة هو السبب

لا تظنين أنك ستصبحين بين يوم وليلة عالمة ذرة

الموضوع يحتاج إلى جهد كبير وعمل كثير

وكما أخبرتك سابقاً اجتهدي تصلي :)

تحياتي

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

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

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

728x90.png

#13

السلام عليكم

مقالة جميلة بلا شك اخي الكريم .. و لكنها زادت من حجم التساؤلات عندي بدلاً من ان تنقصها :)

انت تقول كلام جميل الا و هو ان الـ Threads لن تكون جديرة بالتعامل مع الطلبات الكثيرة على السيرفر ..

و هذا شيء صحيح اضيف عليه بطء منصبة الجافا نفسها ... و اذكر اننا في الفيجول بيسك كنا نقوم بعمل مصفوفة (متنسطات-مستمعات) و ان

العملية كانت عرضة للعمل ضغط على السيرفر في كل الاحوال

انت قلت : خلاصة القول نحن-في هذة المرحلة- بحاجة لشيء "أكثر" من الشرح النظري والأمثلة "المدرسية" و اقل من البرامج الجاهزة المقيدة.

و كذلك اشرت الى انه هناك مقالات كثيرة حول هذه الحلول .. فهلا وضعت لي شيء (مقالة) ابدأ منه بداية الطريق في هذا الموضوع ؟؟

و في الاخير .. ارجوك لا تتوقف عن الكتابة ...

كل التوفيق ,,,

بنت اليمن

لا اله الا الله .. محمد رسول الله

(* ربِ اجعلني مقيم الصلاة و من ذريتي ، ربنا و تقبل دعـاء *)

يا حيّ يا قيـوم ... برحمتك استغيث ... اصلح لي شأني كله و لا تكلني الى نفسي طرفة عين

#14

يا إخوان الكلام جميل جدا ... وفعلا يفتح أمامنا أفقا جديدة للبحث .

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

#15

السلام عليكم ايها الأخوة جميعا

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

قد اكون تسببت بمزيد من التساؤلات اكثر من ان اقدم ردود , وذلك لأنة -ببساطة- لا يوجد حلول مدونة على ورقة او في كتاب او ماشابة.

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

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

امور مثل "التجربة - الملاحظة - البرهان" ستصبح -عندها - قائمة على اسس سليمة وستؤدي لنتائج مبهرة بالتأكيد.

ما كنت احاول ان اقوم بة - عندما قمت بتصميم تلك الحزمة - هو أن اصيغ حلول مناسبة "وإن لم تكن الأنسب" وحلول عامة "وإن لم تكن الأعم" .

يوم عن يوم , اكتشف ان الوصول للكمال (النظري) اصعب مما تصورت , لأني لو كنت انشيء برنامجا ذو مطاليب واهداف معينة لكنت انتهيت منة قبل فترة طويلة.

ولكنها - من المفترض - ان تكون ادوات عامة , صالحة لي ولك ولها وللجميع بغض النظر عن البرامج التي ننشئها.

ولذلك فررت ان اتوقف -على الاقل -عندما اكون راضيا عنها . ولكن مسألة ان اكون راضيا وان اصل للكمال النظري (تبدوان اشبة ببعض) اكثر مما تصورت :huh:

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

وإن شاء الله - اذا لنا عمر وعافية - سنناقش "كل صغيرة وكبيرة" في الحزمة , قريبا جدا. وسأضع لكم رؤيتي ,وسنصل لحلول مقنعة مع بعض لكل مسألة اثرتها في الموضوع "وحدة وحدة"

ومن يعلم , قد يتحقق اقتراح shado وMkSoft في النهاية

تم تعديل هذه المشاركة بواسطة Dr.Robert في 17 فبراير 2010 في 10:42

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

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

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

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

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

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

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

#16
Speed_Of_Light كتب:
Dr.Robert كتب:

ولا تعطيني برنامجا انت صنعتة بل اعطني الفرصة لأصنع واحدا "أفضل منة".

العجلة احيانا قد نحتاج لتغيرها لان الطريق قد يكون وعر :wink:

كلنا نعرف بادوات اللغة ...وانا قد قمت بنقل الصوت ...لكن هل تعرف انا وانت كيف نقل الى الان لم استوعب الفكرة :sleep:

المبرمج يجب ان يتجرد ويخرج من العالم الذي وضعه لنفسه ... يجب ان يعلم ما حوله

انا علي شخصيا اعشق الشبكات واحب ان اعرف ماذا يحصل في layers OSI قبل ان اعرف ماذا يحدث في package net

والمشروع الذي اطلبه ليس عبارة عن صنع برنامج والسلام عليكم

ما اريده نقاش كامل عن الفكرة

تحياتي

تم تعديل هذه المشاركة بواسطة shado في 17 فبراير 2010 في 20:41

#17

إذا أنت تتكلم عن برنامج يقدم "مثال تطبيقي" وليس صناعة برنامج "حقيقي"

إذا كان ذلك قصدك فأنا معك ...

اقتباس

... واحب ان اعرف ماذا يحصل في layers OSI قبل ان اعرف ماذا يحدث في package net

أنت بحاحة إلى قراءة كتاب بالشبكات ! ولا أظن أن نقاشاً "جافاوياً" يمكن أن يجيبك عن تساؤلاتك !

تم تعديل هذه المشاركة بواسطة Speed_Of_Light في 17 فبراير 2010 في 21:24

#18

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

الفرق بين "المثال التطبيقي" و "البرنامج الحقيقي " بإختصار :

ان الاول خاص بالمبرمج , والثاني خاص بالمستخدم.

في الاول نتعلم إستخدام الادوات , وفي الثاني نتعلم كيف نستغلها.

في الأول احب ان استخدم اكثر من طريقة و ادوات مختلفة لأتعلم اكثر , في الثاني اختار الأفضل لأبني او اساهم في "حل" لمشكلة ما (لذلك بعض الشركات تستخدم المصطلح solution لوصف برامجها).

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

يعني يظل المبرمج اسير "الطرق" و "الأساليب " التي يتقنها , وعندما تواجهة مشكلة , يهرع للبحث عن "ادوات وطرق وامثلة تطبيقية اخرى" بدلا من أن يسأل نفسة

السؤال التالي:

هل أنا - فعلا - على دراية تامة بالأدوات التي اجيد استخدامها ام لا؟ وهل عندي القدرة لتوظيفها لحل المشكلة ؟ بل هل امضيت فترة كافية لأختبر ما لدي أصلا؟ هل استفدت من كون اغلب حزم java الرئيسية مفتوحة المصدر؟

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

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

وفي النهاية يتكون عند المبرمج معرفة "سطحية" بأشياء كثييييييييييرة (لغات برمجة ,حزم , ادوات تطوير , تقنيات ), لا يحسن أستغلال 1% منها. :excl:

تم تعديل هذه المشاركة بواسطة Dr.Robert في 18 فبراير 2010 في 05:19

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

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

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

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

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

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

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

#19
اقتباس

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

أخ مازن لا أعتقد أن كلامك صحيح دائماً

على قدر العائد المادي أحدد ما هو الأفضل

أعطني على برنامج مئة دولار

وأعطني على نفس البرنامج ألف دولار

وسترى الفرق

لا أتكلم من وجهة برمجية بحتة ولن أغشك

لكني أريد كسب عيشي ولن أقضي حياتي أصنع لك برنامجاً بالأدوات الأفضل لتدفع لي مبلغ بخس

بالنسبة لموضوع العجلة وإعادة صناعتها

لي مقال في هذا الشأن كتبته بعدما تفكرت في الموضوع جيداً

لا تخترع العجلة

تحياتي

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

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

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

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

728x90.png

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

أخ مازن لا أعتقد أن كلامك صحيح دائماً

على قدر العائد المادي أحدد ما هو الأفضل

أعطني على برنامج مئة دولار

وأعطني على نفس البرنامج ألف دولار

وسترى الفرق

لا أتكلم من وجهة برمجية بحتة ولن أغشك

لكني أريد كسب عيشي ولن أقضي حياتي أصنع لك برنامجاً بالأدوات الأفضل لتدفع لي مبلغ بخس

بالنسبة لموضوع العجلة وإعادة صناعتها

لي مقال في هذا الشأن كتبته بعدما تفكرت في الموضوع جيداً

لا تخترع العجلة

تحياتي

اخي علاء ما قصدتة هو متوافق تماما 100% مع ما تقولة (المستخدم اولا واخيرا ,متطلباتة + مواردة) وعلى قدر مايريد سيرى نتيجة

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

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

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

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

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

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

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

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

#21

@ علاء الصالحي

الحقائق التي كتبنها بمقالتك عين العقل ...لا بد من اعادة اختراع لعجلة جديدة

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

لكن لكل انسان مزاج يجب ان نداريه

البرمجة بالنهاية كسب رزق ويجب ان تداري زبونك ..واياك ان تحاول ان تقنعه بعجلة موجودة مسبقا ...تأكد لن يرجع لك

@Speed

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

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

بالتوفيق

تم تعديل هذه المشاركة بواسطة shado في 18 فبراير 2010 في 18:56

#22

المشكلة أن زبونك أحياناً لا يريد أن يدفع أًصلاً

أو يريد أن يدفع ملاليم

لذا أنت مضطر كي تكسب رزقك أن تسايره على مايريد

على كل أؤيدك كثيراً في موضوع العجلة والزبون

لكني أختلف معك في الرؤيا كلما قللت من إنتاج عجلات جديدة واستخدمت عجلات قديمة

كلما حصلت انخفضت تكلفة سيارتك

بالتالي كثر الزبائن الخاصين بك

تحياتي

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

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

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

728x90.png

#23

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

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

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

الاولى في الخوادم و على اهمية الثانية في التنصت للبيانات.

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

المعالجة المتوازية في الخادم

تكلمت في الموضوع السابق عن هذة المسألة وكيف أن طريقة إستخدام Thread لكل عميل هي مكلفة للغاية.

قبل أن اتطرق للإسلوب البديل, سأتكلم عن ابسط حوار يتم بين العميل و الخادم (اياً كانت بنيتة الداخلية ) بشكل مختصر:

العميل هو من يقوم عادة بإنشاء الإتصال بالخادم , ثم يقوم بإرسال الطلب request .

يستلم الخادم الطلب ويقوم بمعالجتة ثم يقوم بإرسال الرد response.

يقوم العميل بمعالجة الرد او النتيجة , ثم يقوم بإرسال طلب اخر او يغلق الإتصال.

بعد وصول الرد للعميل وقبل اغلاق الإتصال ستلاحظ أن العميل يحتفظ الى حد ما بموارد على الخادم , هذة الموارد مهما كانت – هي خاصة بذلك العميل ولن تتحرر إلا بعد أن يغلق الإتصال أو تنتهي مدتة. وحقيقة أن الخادم يعمل على عتاد "جبار" يقوم بمعالجة الطلبات و إرسال الردود بسرعة كبيرة جدا , وحقيقة أن العضو غالبا ما يقضي وقتا في معالجة البيانات القادمة الية من الخادم اكبر من الوقت الذي يقضية في تكوين طلبات جديدة , تجعل تلك الموارد غير مستخدمة - ربما - اغلب وقت الإتصال. لذلك فإن مسألة توزيع الموارد مسألة هامة.

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

بالإضافة لكون هذة الطريقة مكلفة وغير عملية كما تحدثت سابقا , فهي ايضا – في نظري- توزيع خاطيء لموارد الخادم.

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

الأداة ServerService :

هذة الأداة هي خاصة ببناء برامج الخادم ,وتقوم بجزء اساسي من عمل الخادم وهو التنصت على الإتصالات وقراءة الطلبات الواردة.

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

معالجة الطلبات قد تتم بشكل متتالي او متوازي , المهم أنها ستتم "عند الطلب" وليس "عند الإتصال".

لتفاصيل الأداة اقرأ المزيد عن هذا الموضوع في المدونة

كفائةالذاكرة:

في الحزمة NetworkService وفي مسألة التنصت على DatagramPackets فأنا استخدمت buffer واحدة فقط .

مسألة التنصت ومعالجة البيانات تتمان في معالجات منفصلة , وضحت سابقا أن مسألة التزامن قد تؤدي لتعطيل القدرة على التنصت , لذلك أستخدمت فكرة جميلة جدا موجود في Java واستعنت بالواجهات Future & Callable .

اقرأ الJavaDoc الخاص بالتالي لتعرف ماذا اقصد:

MessageListener class

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

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

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

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

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

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

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

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

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

#24

سؤال للأخ مازن ..

ألا تعمل ما يسمى بـ WebService , بحل العديد من المشاكل السابقة , بدلا من تعقيدات Thread ومشاكلها و زوبعات Socket .

هناك تقنية في .NET تسمى Windows Comunication Foundation WCF , تدعم الكلام السابق , حتى أن ما يكروسوفت تزود مبرمجيها بتلك التكنولوجيا و تفضلها عن Socket .

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

تحياتي.

#25

إذا أردت لبرنامجك الأداء العالي

انسى موضوع RMI Corba webservice

واستخدم socket بدون تفكير

بالطبع socket بالطريقة الصحيحة وليس socket بطريقة خيط واحد يقوم بكل شيء

تمكن منها جيداً ثم انطلق

أما لو أردت أن تحقق مفاهيم dependability و scalability فعليك بغير socket

تحياتي

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

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

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

728x90.png

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