اولا وقبل ان ابدئ اود ان اشكر الأخ o15s19 عل ما قدمه لي من امور,, فقد ساعدني كثيرا بارك الله له,,
وجزآه الله عنّي كل خير,, لكن الأحوال والله المستعان, ابتعد الأخ العزيز لأسباب اسأل الله ان ان ييسر له,,
فصرت الآن وحيدا :kick:
على كل حال,
البرنآمج يرسل الآن من الكلينت الى السرفر,, و يمكن ايضا ارسآل النّص من السرفر الى الكلينت في الحدث,, onExecute
بقي ان ارسل النص من السرفر الى كل الكلينتس,,
هذا وجدته في منتدى الأخ عروة,,
إقتباس :كمثال
اذا كنت تستخدم بروتوكول tcp (يتميز بانه موثوق وهو مسؤول عن ضمان وصول البيانات بصورة صحيحة دون تدخل المبرمج , عيبه انه لايرسل الا من جهاز لجهاز واحد فقط ولا يمكنه ان يرسل الى مجموعة اجهزة دفعه واحده) ولنفرض أن البرنامج بسيط ليس فيه غرف محادثة بل هو غرفة واحده مثلا (اي اي زبون يرسل رساله سوف يرى هذه الرسالة كل الاعضاء الآخرين المتصلين)
في هذه الحالة كمثال مبسط يمكن الانطلاق منه :
في حدث onexecute لمكون indy server يتم التقاط الرسالة من الزبون والقيام بارسالها لكل الزبائن الآخرين المتصلين (بحلقة for مثلا) وهذا يتطلب حفظ الconnections لكل زبون متصل في مصفوفة مثلا
- كلما اتصل زبون اخزن معلومات اتصاله في مصفوفة , وبالتالي يصبح لدي لائحة بالمتصلين حاليا
- كلما ارسل زبون رساله يتم ارسالها لكل اللائحة من الزبائن المتصلين
طبعا هذه طريقة مبسطة جدا ولكن القصد هو البدء لا أكثر
سؤآلي اخوآني الكرام بالتحديد عن هذه
إقتباس :وهذا يتطلب حفظ الconnections لكل زبون متصل في مصفوفة مثلا
كيف تتم ؟
وكيف احفظ الكونكشن بارك الله لكم
على كل حال, السورس في المرفقات الآن, بارك الله بكم
فرّج همّ المهمومين يا الله
اللهم فك قيد اسرانا و اسرى المسلمين
أخي أهم شي تخزن الأي بي الخاص بالجهاز لانه عن طريقة يمكنك فعل كل شئ و الفكرة
عندما يتصل العميل بالخادم نقوم بادخال أي بي الجهاز إلى مصفوفة Array أو إلى ListStrings أو كما تحب و عندما ينقطع الاتصال مع العميل نحذفه مثلا من المصفوفة أو نقوم بشئ أخر
تخزين معلومات أخرى حسب الرغبة مثلا البورت الذي يتصل منه العميل أو Thread أو Context الخاص بالعميل من أجل ارسال الرسالة له و يتم ذلك من خلال TList مثلا
كل ذلك حسب متطلباتك أخي الكريم
و أي سؤال أخر انا جاهز
AL-MOB4RM3G كتب :ما هو امر الأرسآل من السرفر الى الكلينت ؟
يعني يعمل كونكت السرفر مع الكلينت وبعدها يعمل writeLn ويرسل ال String ,,
ذا الأمر بسيط كل ما عليك فعله هو معرة ال Context أو ال Thread الخاص بالجهاز و عندها الأم بسيط و هو
كود :
Context.Connection.IOHandler.WriteLn
و يجب التأكير على موضوع ال Context أو Thread الخاص بالكلاينت لأنه و بدونه لا يمكنك ارسال الرسالة له في هذا النوع من الاتصال (طبعا في بروتوكول UDP يمكنك عمل BroadCast للمسج الذي تريده حتى و إن كنت لا تعرف من هو المتصل معاك و هذا يفيد في حالات عرض صورة جماعية لمجموعة من الاجهزة أو فيديو أو صوت لأنه بهذه الحالة لن تتكفل عنا ارسال رسالة خاصة لكل جهاز ............. انتهت الاضافة)
نعود لل TCP
فعند معرفة Context فاكتب الامر السابق و ستجد أن السرفر أصبح يرسل للكلينت و للتجربة ارسل رسالة للكلينت ترحب به مثلا أول ما يتصل الكلاينت بالسرفر فهنا اأمر يكون؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
صحيح
بحدث OnConnect (بالسرفر) اكتب التالي و ستجد أن الامر يعمل:
كود :
Acontext.Connection.IOHandle.WriteLN('أهلا بك')
طبعا التفسير هنا هو أن Context الكلاينت هو Acontext و ستجدها معرفة تلقائيا عند ادخال الحدث OnConnect على برنامجك
المشكلة الثانية هي كيف سيقرأ الكلاينت هذا الأمر القادم من السرفر و الحل
قبل ما اكتب الحل جرب حلك أن و خبرني شو بصير معك(اقصد التايمر)
ملحوظة جرب الامور الاسهل فالأصعب يعني انت طبق هي المعلومات فقط على كلينت واحد و سرفر
و ثم نقوم بزيادة عدد الكلاينتس و بعدها نطور الكود
ملحوظة أسف على تأخري بالرد لأنو عندي امتحانات و اعذرني
إقتباس :المشكلة الثانية هي كيف سيقرأ الكلاينت هذا الأمر القادم من السرفر و الحل
إقتباس :قبل ما اكتب الحل جرب حلك أن و خبرني شو بصير معك(اقصد التايمر)
ملحوظة جرب الامور الاسهل فالأصعب
نعم,, اخي, هذا قد جربته انا من قبل وليست لي مشكلة بها,
المشكلة التي انا فيها الآن هي ليست ارسآل النصوص بين الكلينت و السرفر,,
فهذا قد تم بنجآح ولله الحمد,
وكذلك العكس,, ففي الحدث OnConnect وضعت الكود الذي وضعته حضرتك,, وقرئت من خلآل الكبينت في الرسآلة المرسلة اليه بعد الكود try و finaly
على كل حال مشكلتي حآليا مع عدة كلينتات وليس كلينت وآحد,,
بعد البحث في النت كثيرا,, وجدت هذا الكود,,
PHP كود :
isn't is just AContext.Connection.WriteLn('hi'); // or write() ? and to write to all, I think it's likethe standard Indy server. ie.
with IdTCPServer1.Threads.LockList do try for i := 0 to Count - 1 do begin TIdPeerThread(Items[i]).Connection.WriteLn('message to all'); end; finally IdTCPServer1.Threads.UnLockList; end;
وترجمته انا لننسخة الإندي 10 فأصبح,
PHP كود :
procedure TForm1.IdTCPServer1Connect(AContext: TIdContext); var sCommand: String; I: TList; int: integer; begin with idtcpserver1.Contexts.LockList do try begin for int := 0 to Count - 1 do begin AContext(form1.ListBox1.Items[int]).Connection.IOHandler.WriteLn('hello'); end; end; finally IdTcpServer1.Contexts.UnlockList; end; end;
procedure TForm1.Button4Click(Sender: TObject); var sCommand: String; i: integer; ac : TidContext; Threads: TList; begin Threads := IdTcpServer1.Contexts.LockList; for I := 0 to Threads.Count - 1 do begin ac := Threads[1]; ac.Connection.IOHandler.WriteLn('Hellow - This from server to all'); end; IdTcpServer1.Contexts.UnlockList; end;
لكن ماذا لو كان هناك كلينت وآحد متصل ؟
يحدث خلل والله اعلم,, <------------ حسب التجربة,
على كل حآل,, هذه خطوة الى الأمام ؟
لكن هناك تسآؤل,,
الأمر ReadLn,, كم مرّة يقرأ ؟؟؟
يعني ماذا لو تم ارسآل امرين من ال WriteLN هل ممكن ان اقرآها بوآحدة من ReadLN ؟؟
ام ان الأمر ReadLN يقرأ آخر رسآلة من ال WriteLN فقط ؟
لآن الذي يحدث معي هو,,
لا استطيع ان اقرأ الكود الذي في الأعلى الّى بوآحد من الكلينتس المتصلين,,
هل من اقترآح بارك الله لكم ؟
والسلام عليكم ورحمة الله :bye1:
فرّج همّ المهمومين يا الله
اللهم فك قيد اسرانا و اسرى المسلمين
على فكرة انظر بالصفحة السابقة بأول رد لي على مشاركتك و ستلاحظ أنك وصلت للكود الذي وضعته و لكن وصولك هذا افضل لانك الان على ما اظن فهمت فكرة الاتصال و الارسال بين السرفر و الكلاينت في بروتوكول tcp
و حتى فكرة التايمر تجد أني أشرت لها
فهل هنا بعد مشكلة أم انحل كل الأمر و اصبحت ترسل بين الكلاينت و السرفر بدوون مشاكل و باللغة العربية؟؟؟؟