• 0
تامر وحيد

استفسار بشان برمجه الشبكات

سؤال

انا عندي برنامج مكون من كلينت و سيرفر واقوم بارسال الاوامر كالتالي

client>server>client

ولفعل ذلك استخدم لوب في السيرفر كالتالي

for i:=0 to Server.Socket.ActiveConnections-1 do

لكي اجد الكلينت المطلوب

وهذا الامر انا اري انه بطيء هل يوجد شيء يجعلني اصل للكلينت مباشره بدون هذه الدوره

وماذا تفعل برامج الشبكات الكبيره كالياهو مثلا هل يصنع دوره في رايكم ليجد مستخدم من ضمن الملاين الي علي السيرفر؟؟

0

شارك هذا الرد


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

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

  • 0

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

الحل الامثل :

اولا : تحتاج لانشاء عنصر Object لكل مستخدم يقوم بالاتصال بالسيرفر وهو عنصر يحمل Socket الخاصة بالمستخدم المنشأ بعض البيانات مثل اسم المستخدم كلمة المرور

وحالة المستخدم هل هو مستوفي شروط المتابعة ام لا Authenticated .... الخ .

داخل هذا العنصر تضع دالة الاستماع لرسائل النظام System Messages وبهذا سيكون من السهل الوصول لاي عضو او جميعهم في لمح البصر بمجرد ارسال رسالة نظام من خلال الدالة SendMessage تصل لكافة المتصلين في ان واحد والمستخدم المستهدف هو من يرد علي الرسالة ويتفعل معها حسب المطلوب .

مثال عن انشاء قناة اتصال .


unit Unit2;

interface
uses ComCtrls,ScktComp;

Type


TClientPool = Class (TObject)
Private
ClientSocketLink : TCustomWinSocket ;
FClientName : String ;
FAuthenticated : Boolean ;

Public
constructor Create (ClientSocket : TCustomWinSocket);
destructor Destroy ; override ;


published

Property ClientName : String Read FClientName Write FClientName ;
property Authenticated : Boolean Read FAuthenticated write FAuthenticated default False;
//...... etc( properties)
End;


implementation


constructor TClientPool.Create (ClientSocket : TCustomWinSocket);
begin
inherited Create ;

ClientSocketLink := ClientSocket ;

end;
destructor TClientPool.Destroy ;
begin

ClientSocketLink := nil;

inherited Destroy ;
end;



end.

ويتم عمل خصائص لكل شيئ يخص المتصل للتعامل معها في اي مكان في النظام .

تحياتي

تم تعديل بواسطه prof_1982
2

شارك هذا الرد


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

هل من الممكن ان توضح اكثر كيفيه استخدام هذه الطريقه هل من الممكن برنامج صغير يوضح معالجه الرسائل اذا تكرمت

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

شارك هذا الرد


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

حاضر من عيوني الليلة ان شاء الله اكتب مثال عملي علي ذلك .

0

شارك هذا الرد


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

شكرا جدا يا باشا و منتظر المثال علي احر من الجمر

0

شارك هذا الرد


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

السلام عليكم

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

تحياتي لك

CLientServer_AT.rar

0

شارك هذا الرد


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

شكرا يا باشا علي المثال انا من امبارح عمال اقري في البرمجه الغرضيه ورسائل النظام و الوراثه علشان احاول اوصل للموضوع

شكرا علي المثال

0

شارك هذا الرد


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

شكرا المثال جميل جدا

وانا كنت قربت اجيبه بفضل فكرتك طبعا بس مكنتش عارف استقبل رسايل النظام

شكرا علي المثال جدا

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

شارك هذا الرد


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

العفوا اخي با رك الله فيك .

0

شارك هذا الرد


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

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

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