delphi4arab منتديات دلفي للعرب

نسخة كاملة : ارسآل النصوص بين الكلينت و السرفر مع الإندي, ؟
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
الصفحات : 1 2 3 4
السلام عليكم من جديد,,

اخوآني الكرام,, هناك بعض التقدم لكنه ليس كبير,,

اولا وقبل ان ابدئ اود ان اشكر الأخ o15s19 عل ما قدمه لي من امور,, فقد ساعدني كثيرا بارك الله له,,
وجزآه الله عنّي كل خير,, لكن الأحوال والله المستعان, ابتعد الأخ العزيز لأسباب اسأل الله ان ان ييسر له,,

فصرت الآن وحيدا :kick:

على كل حال,
البرنآمج يرسل الآن من الكلينت الى السرفر,, و يمكن ايضا ارسآل النّص من السرفر الى الكلينت في الحدث,, onExecute

بقي ان ارسل النص من السرفر الى كل الكلينتس,,

هذا وجدته في منتدى الأخ عروة,,
إقتباس :كمثال
اذا كنت تستخدم بروتوكول tcp (يتميز بانه موثوق وهو مسؤول عن ضمان وصول البيانات بصورة صحيحة دون تدخل المبرمج , عيبه انه لايرسل الا من جهاز لجهاز واحد فقط ولا يمكنه ان يرسل الى مجموعة اجهزة دفعه واحده) ولنفرض أن البرنامج بسيط ليس فيه غرف محادثة بل هو غرفة واحده مثلا (اي اي زبون يرسل رساله سوف يرى هذه الرسالة كل الاعضاء الآخرين المتصلين)
في هذه الحالة كمثال مبسط يمكن الانطلاق منه :
في حدث onexecute لمكون indy server يتم التقاط الرسالة من الزبون والقيام بارسالها لكل الزبائن الآخرين المتصلين (بحلقة for مثلا) وهذا يتطلب حفظ الconnections لكل زبون متصل في مصفوفة مثلا

- كلما اتصل زبون اخزن معلومات اتصاله في مصفوفة , وبالتالي يصبح لدي لائحة بالمتصلين حاليا
- كلما ارسل زبون رساله يتم ارسالها لكل اللائحة من الزبائن المتصلين

طبعا هذه طريقة مبسطة جدا ولكن القصد هو البدء لا أكثر

سؤآلي اخوآني الكرام بالتحديد عن هذه
إقتباس :وهذا يتطلب حفظ الconnections لكل زبون متصل في مصفوفة مثلا

كيف تتم ؟
وكيف احفظ الكونكشن بارك الله لكم

على كل حال, السورس في المرفقات الآن, بارك الله بكم
طيب اخوآني الكرام,, :bye1:

لعلّي اقسم المشوآر الى اقسآم,,

اولا,,

إقتباس :- كلما اتصل زبون اخزن معلومات اتصاله في مصفوفة , وبالتالي يصبح لدي لائحة بالمتصلين حاليا

ما هي المعلومات التي احتاج لتخزينها,, هل يكفي الأيبي ؟
ام يحتاج اخزن معلوات اكثر مثل البورت او معلومات اخرى ؟

بارك الله لكم
أخي أهم شي تخزن الأي بي الخاص بالجهاز لانه عن طريقة يمكنك فعل كل شئ و الفكرة
عندما يتصل العميل بالخادم نقوم بادخال أي بي الجهاز إلى مصفوفة Array أو إلى ListStrings أو كما تحب و عندما ينقطع الاتصال مع العميل نحذفه مثلا من المصفوفة أو نقوم بشئ أخر

تخزين معلومات أخرى حسب الرغبة مثلا البورت الذي يتصل منه العميل أو Thread أو Context الخاص بالعميل من أجل ارسال الرسالة له و يتم ذلك من خلال TList مثلا

كل ذلك حسب متطلباتك أخي الكريم
و أي سؤال أخر انا جاهز
الله يبارك فيكم اخي ويرفع قدركم,,

اذا بقي هناك امرين 2 لم اعرفهم بعد,,

1. بعد تخزين الأيبي و الأمور الأخرى,,

ما هو امر الأرسآل من السرفر الى الكلينت ؟
يعني يعمل كونكت السرفر مع الكلينت وبعدها يعمل writeLn ويرسل ال String ,,

ما هو هذا الأمر,,

2. في الكلينت, كيف يعرف الكلينت انه وصل الآن string ؟
هل يجب ان يكون هناك تايمر يعمل readLn مثلا ؟

بارك الله فيكم وجزآك الله خيرا,,
وآشكرك اخي الكريم o15s19 على جهودك وتعبك معي :bye1:

والسلام عليكم ورحمة الله
AL-MOB4RM3G كتب :ما هو امر الأرسآل من السرفر الى الكلينت ؟
يعني يعمل كونكت السرفر مع الكلينت وبعدها يعمل writeLn ويرسل ال String ,,

ذا الأمر بسيط كل ما عليك فعله هو معرة ال Context أو ال Thread الخاص بالجهاز و عندها الأم بسيط و هو

كود :
Context.Connection.IOHandler.WriteLn

و يجب التأكير على موضوع ال Context أو Thread الخاص بالكلاينت لأنه و بدونه لا يمكنك ارسال الرسالة له في هذا النوع من الاتصال (طبعا في بروتوكول UDP يمكنك عمل BroadCast للمسج الذي تريده حتى و إن كنت لا تعرف من هو المتصل معاك و هذا يفيد في حالات عرض صورة جماعية لمجموعة من الاجهزة أو فيديو أو صوت لأنه بهذه الحالة لن تتكفل عنا ارسال رسالة خاصة لكل جهاز ............. انتهت الاضافة)
نعود لل TCP
فعند معرفة Context فاكتب الامر السابق و ستجد أن السرفر أصبح يرسل للكلينت و للتجربة ارسل رسالة للكلينت ترحب به مثلا أول ما يتصل الكلاينت بالسرفر فهنا اأمر يكون؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

صحيح
بحدث OnConnect (بالسرفر) اكتب التالي و ستجد أن الامر يعمل:

كود :
Acontext.Connection.IOHandle.WriteLN('أهلا بك')

طبعا التفسير هنا هو أن Context الكلاينت هو Acontext و ستجدها معرفة تلقائيا عند ادخال الحدث OnConnect على برنامجك

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

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

اخي الكريم,,

إقتباس :ذا الأمر بسيط كل ما عليك فعله هو معرة ال Context أو ال Thread الخاص بالجهاز و عندها الأم بسيط و هو

إقتباس :نعود لل TCP
فعند معرفة Context فاكتب الامر السابق

ما المقصود بمعرفة ال Context اخي؟ وكيف يتم ذلك؟ هل تقصت معرفة الأي بي للكلينت ام ماذا بارك الله لك؟

إقتباس :Acontext.Connection.IOHandle.WriteLN('أهلا بك')

إقتباس :المشكلة الثانية هي كيف سيقرأ الكلاينت هذا الأمر القادم من السرفر و الحل

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

ملحوظة جرب الامور الاسهل فالأصعب

نعم,, اخي, هذا قد جربته انا من قبل وليست لي مشكلة بها,

المشكلة التي انا فيها الآن هي ليست ارسآل النصوص بين الكلينت و السرفر,,
فهذا قد تم بنجآح ولله الحمد,

وكذلك العكس,, ففي الحدث 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; 

لكن هناك خلل في الكود هذا

PHP كود :
AContext(form1.ListBox1.Items[int]).Connection.IOHandler.WriteLn('hello'); 

ورسآلة الخلل عندي هنا هي,,

إقتباس :[DCC Error] Qserver.pas(142): E2066 Missing operator or semicolon

هل من اقترآح بارك الله لكم ؟

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

هذه,,, انتهيت منها ولله الحمد,,

الآن انا في هذه النقطة
إقتباس :و ثم نقوم بزيادة عدد الكلاينتس و بعدها نطور الكود

وجزآكم الله خيرا اخي الحبيب على تعبك معي وإرشآدي و تعليمي,,
والسلام عليكم ورحمة الله

:bye1:
اخوآني ما رئيكم الآن ؟ :laugh:

هذا الكود,,

PHP كود :
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:
إقتباس :لا استطيع ان اقرأ الكود الذي في الأعلى الّى بوآحد من الكلينتس المتصلين,,

هل لهذا علآقة بأن كل Clients يعملون على لوكال هوست LocalHost ؟ :unsure:

بارك الله لكم
إقتباس :لكن ماذا لو كان هناك كلينت وآحد متصل ؟
يحدث خلل والله اعلم,, <------------ حسب التجربة,

إقتباس :لا استطيع ان اقرأ الكود الذي في الأعلى الّى بوآحد من الكلينتس المتصلين,,

هل من اقترآح بارك الله لكم ؟

إقتباس :هل لهذا علآقة بأن كل clients يعملون على لوكال هوست localhost ؟

هههه, اتعرفون ما كانت المشكلة ؟؟ :oops:

لحظوا الكود التآلي,,

PHP كود :
ac := Threads[1]; 

يجب ان يكون

PHP كود :
ac := Threads[I]; 

,, :monster2: الحمد لله حلّت المشكلة ولله الحمد,,

شكرا كثيرا اخي الكريم o15s19

بارك الله لك ونفه الله بك وغفر لنا ولك,

والسلام عليكم ورحمة الله
على فكرة انظر بالصفحة السابقة بأول رد لي على مشاركتك و ستلاحظ أنك وصلت للكود الذي وضعته و لكن وصولك هذا افضل لانك الان على ما اظن فهمت فكرة الاتصال و الارسال بين السرفر و الكلاينت في بروتوكول tcp
و حتى فكرة التايمر تجد أني أشرت لها

فهل هنا بعد مشكلة أم انحل كل الأمر و اصبحت ترسل بين الكلاينت و السرفر بدوون مشاكل و باللغة العربية؟؟؟؟
الصفحات : 1 2 3 4