المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : ارسآل النصوص بين الكلينت و السرفر مع الإندي, ؟


AL-MOB4RM3G
03-09-2009, 07:51 AM
السلام عليكم ورحمة الله

اخوآني الكرآم,, تمكنت وبعد جهد جهيد بفضل الله من عمل السرفر يتصل بألكلينت باستعمال الإندي,,

وفي المرفقات الملفين الذي اعمل عليهما,,,

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

الذي اود عمله هو كيف ارسل نص من الكلينت الى السرفر ؟؟؟ يعني اكتبه في الإديت ومن ثم اضغط على زر فيظهر في الميمو للسرفر,, وكذلك العكس, يعني ان ارسل من السرفر نص الى الميمو في الكلينت,,,

جزآكم الله خيرا وبارك الله لكم,,
سبحآن الله قد حآولت ولكن لم اجد شي يناسب لحد الآن,,

طبعا الذي اوده هو في الإندي 10 وليس 9 ,,,
استخدمت دلفي 2010 في هذا المشروع,,

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

AL-MOB4RM3G
05-09-2009, 04:22 PM
بسم الله,,

اخوآني الكرام,, ها قد بدئ الطريق بالنسبة لي مع الإندي ولكن هناك كثير من الحفر,, والله المستعان,,

تمكنت بفضل الله من احرآز تقدم وهو ارسآل النصوص من الكلينتس الى السرفر ,,, ولكن اخوآني الكرآم,,

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

+ انه مثآل جيد جدا لكل مبتدئ ان يبدئ مع الإندي,,

بإتظآركم بارك الله لكم

صورة,, من برنآمجي الذي هو 3 في وآحد :laugh:

http://i30.tinypic.com/i3x9h4.jpg

AL-MOB4RM3G
06-09-2009, 02:58 PM
طيب اخوآني الكرام,, يبدوا اننا نفتقد خبير Indy في المنتدى,, :cryss: ربما اصبح انا في المستقبل ان شاء الله,,

على كل حال لن استسلم مهما كانت هذه العمليّة صعبة,, :laugh:

اخوآني الكرام,,

آمر يحيّرني مع هذه المكونات وهو,,

الذي فهمته من التعآمل مع الإندي فإنه يفتح اتصآل مع الخآدم ,, وبعدها يرسل او يستقبل البيانات ومن ثم يغلق الإتصآل,, هل فهمي للتعآمل مع الإندي صحيح ؟

طيب,, ان كان كذلك,,
كيف ممكن ان ارسل نص من الخآدم الى كل العملآء المتصلين معي في الخآدم ان كان العملآء اصلا يغلقون الإتصآل بعد فتحه,,

ان شاء الله السؤآل وآضح ؟

بارك الله لكم وجزآكم خيرا والسلام عليكم ورحمة الله

o15s19
08-09-2009, 11:14 AM
السلام عليكم

بالنسبة لهذه الحالة لديك حلين حسب معرفتي

الحل الأول القديم
هو ببسطة وضع مكونات السرفر و الكلينت في كل من السرفر و الكلينت
تابع معي
بفرض S سرفر و c1 كلينت و c2 كلينت أخر
نضع في كل من S و c1 , c2 مكونين سرفر و كلينت و الارسال يتم بالشكل التالي
بالبداية كل الكلينت c1 , c2 يتصلون بالسرفر و يتم الارسل بشكل روتيني من عميل لخادم
و إذا اردنا ارسال من الخادم للعمليل يقوم الخادم S بالتصال بواسطة مكون العميل الذي لديه بمكون الخادم الموجود في العميل c1 و إذا اردنا لمجموعمن الاجهزة يعني S يريد ارسال ل c1 , c2 هنا نقوم بعمل حلقة تقوم بالاتصال بمكون الخادم الموجود بالعميل c1 ثم تقوم بقطع الاتصال معه و ثم تتصل بمكون الخادم الموجود بالعميل c2 و هكذا تتم العملية بشكل سليم تماما

o15s19
08-09-2009, 11:43 AM
الحل الثاني الجديد المتطور

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

هو ببساطة انشاء thread في الكلينت يقوم باستقبال الطلبات من السرفر سواء كانت عبارة عن String أو Stream و نضع به حدث Execute بالاضافة للكلاس المسؤول عن المزامنة و هذا هو الكود

type
TReadResponse= class(TThread)
protected
FConn: TIdTCPConnection;
procedure Execute; override;
public
constructor Create(AConn: TIdTCPConnection); reintroduce;

end;

TWriteResponse = class(TIdSync)
protected
Atext: AnsiString;
procedure DoSynchronize; override;
public
constructor Create(const AResponse: AnsiString);
class procedure AddResponse(const AResponse: AnsiString);

end;

هذا هو الكود المسؤول عن بناء Thread
constructor TReadResponse.Create(AConn: TIdTCPConnection);
begin
FConn := AConn;
inherited Create(False);
end;

و هذا الكود هو المسؤول عن استقبال الطلبات من السرفر
procedure TReadResponse.Execute;
begin
while not Terminated and FConn.Connected do
begin
TWriteResponse.AddResponse(FConn.IOHandler.ReadLn( '',enUTF8));
end;
end;

و هذا الكود مسؤول عن عمل بناء كلاس المزامنة لاحظ أن الطلبات ستنتقل للسترنغ AText

constructor TWriteResponse.Create(const AResponse: AnsiString);
begin
AText := AResponse;
inherited Create;
end;

و هذا الكود مسؤول عن بدء عملية المزامنة

class procedure TWriteResponse.AddResponse (const AResponse: AnsiString);
begin
with Create(AResponse) do try
Synchronize;
finally
Free;
end;
end;

و بالنهاية ستجد أن الامر وصل إلى الاجراء DoSynchronize و فيه تستطيع وضع ما تشاء من أوامر مثل الاجراء onExecute في السرفر
و هذا جزء من الكود
procedure TWriteResponse.DoSynchronize;
begin
ShowMessage(AText);
end;

و هنا انتهينا من اعداد الكلاينت مع ملاحظة أنه بحال اردنا أن نستقبل Stream فالأمر يتم مباشرة من خلال مكون الكلاينت
IdTCPClient1.IOHandler.ReadStream(MStream)

طبعا هنا نسأل انفسنا سؤال لماذا لم نقم بهذه العملية ببساطة من أجل استقبال السترنغ و الجواب ايضا ببساطة لأنه لا نعرف متى سيأتي الطلب من الخادم و لكن يمكننا مثلا من أجل استقبال الستريم بارسال رسالة من الخادم تعلم العميل بأن Stream سيأتي مثلا

procedure TWriteResponse.DoSynchronize;
var MStream : TMemoryStream ;
begin
if Atext = 'File is Comming' then
begin
MStream := TMemoryStream.Create;
try
Form1.IdTCPClient1.IOHandler.ReadStream(MStream) ;
MStream.SaveToFile('c:\');
finally
MStream.Free ;
end;
end;
end;

طبعا يمكنك وضع مثلا Timer يقوم بالتحقق كل ثانية إذا كان هناك String قادم أو Stream و لكن Thread افضل بهذه الحالة

هكذا يكون انتهى قسم العميل و اصبح جاهزا لتلقي الأوامر من الخادم

ملحوظة
تجد أنني استخدم ال AnsiString و ال enUTF8 و ذلك ليتم نقل النصوص العربية بصورة صحيحة و بدون استفهامات؟؟؟؟؟؟؟؟؟

o15s19
08-09-2009, 12:00 PM
و الأن كيق سيرسل الخادم رسالة للعميل
الحل

نقوم ببساطة بإنشاء Class هو من TIdServerContext نسميه مثلا TMyContext
و نضيف له Ip و نضيف له الاجراء SendingMsg

type
TMyContext = class(TIdServerContext) // Create Class To Send From Server To Client
public
IP: String;
procedure SendingMsg(const IP: String; const AMsg: AnsiString);
procedure SendFile(const IP : String ; cPath : AnsiString ; LFile : Ansistring) ;
end;

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

procedure TMyContext.SendingMsg(const IP: String; const AMsg:AnsiString); //Send Message
var List: TList;
Context: TMyContext;
I: Integer;
begin
List := form7.IdTCPServer1.Contexts.LockList;
try
for I := 0 to List.Count-1 do
begin
Context := TMyContext(List[I]);
if Context.IP = IP then
begin
try
Context.Connection.IOHandler.WriteLn(AMsg,enUTF8);
except
end;
Exit;
end;
end;
finally
form7.IdTCPServer1.Contexts.UnlockList;
end;

end;


و لكن لحظة عندما نضع هذا الكود لا يتم الارسال لماذا
لأنه ببساطة ال Contrxt الخاص بمكون السرفر غير Context الخاص بنا و الحل

نقوم بتحويل ال Context الخاص بالسرفر لل MyContext عند انشاء Form

constructor TForm7.Create(AOwner: TComponent); // Convert Context For TCPServer To MyContext
begin
inherited Create(AOwner);
IdTCPServer1.ContextClass := TMyContext;
end;

و عندما يتصل أحد الأجهزة الكلاينت بالخادم الخاص بنا نقوم بإدخال معلوماته و خاصة IP ل MyContext

procedure TForm7.IdTCPServer1Connect(AContext: TIdContext); // When Client Connect Do
begin
MyContext := AContext ;
TMyContext(AContext).IP := TMyContext(AContext).Connection.Socket.Binding.Pee rIP;

و الأن إذا اردنا ارسال رسالة ستصبح التعليمة بالشكل التالي(حيث IP هو أي بي الجهاز المراد أن نرسل له الرسالة)
TMyContext(Form7.MyContext).SendingMsg(IP,'Hello') ;

و هكذا ستتم العملية بنجاح إن شاء الله

و أهلا بك أخي الكريم

o15s19
08-09-2009, 12:09 PM
طبعا هناك ملاحظة
إذا فرضنا أنك تريد ارسال طلب من الكلينت للخادم و استقبال النتيجة مباشرة فهنا لا داعي لكل هذه العملية
لأنه بعد اجرائية ارسال الطلب نضع مباشرة إجرائية استقبال و هذه هي الحال مثلا عندما يتصل الكلاينت يالخادم و يتحقق من أمر ما مثلا Password أو name أو غيره
يعني أن الكلاينت ينتظر الرد من السرفر مباشرة و إذا لم يأتي الرد خلال Timeout تتم عملية الفصل و لن ستقبل الكلاينت النتيجة
هنا طبعا الخادم سيرسل النتيجة مباشرة بعد استقبال الرسالة
و لكن إذا كان الأمر برنامج محادثة فهذا لا ينفع كما ذكرنا مسبقا

و السلام عليكم و رمضان مبارك

AL-MOB4RM3G
08-09-2009, 09:38 PM
بارك الله لك اخي الكريم بمشآركتك وجزآك الله كل خير,, وبآرك فيك وعليك وزآدك من فضله الله آمين,,

الخي الكريم,, اسعدتني كثيرا بمشآركتك,, وان شاء الله سأحآول تطبيقها,,

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

و الخيآر الثآني يبدوا اننه مخصص للمحترفين :unsure: لكن سأحآول ان شاء تعلى,,

وآكثر ما اعجبني اخي الكريم,, هي جملتك,,

ملحوظة
تجد أنني استخدم ال AnsiString و ال enUTF8 و ذلك ليتم نقل النصوص العربية بصورة صحيحة و بدون استفهامات؟؟؟؟؟؟؟؟؟

هذه احجبتني كثيرا,, ويكفي هذه حتى ابذل جهدا للوصول الى الهدف ان شاء الله تعلى,, + انني كنت ابحث عن هذا,, فجزآك ربي خير الجزآء,,

----------

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

تصوري لما كان سيحدث هو التآلي,,

اولاً,, هناك السرفر او الخآدم,,

يكون على جهآز,,

يتصل الكلينت او العميل بالخآدم,, ثم يتصل مثلا كلينت آخر بالخآدم حتى يصبح هناك مثلا 10 من العملآء منصلون بالخآدم,,

بعد ذلك يكتب احد العملآء نص,, فيرسل الى الخآدم وبعدها يقوم الخآدم بنشر النص الى بآقي العملآء,,

وتندهي المشكلة وكل شئ تمام وسهل و يسير,,

على كل حال,, خيرا ان شاء الله تعالى,,

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

o15s19
08-09-2009, 10:45 PM
بالنسبة للخيآر الأول اخي الكريم,, هل هو ينفع مع شآت كتآبي,, جمآعي؟



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

أهلا بك أخي الكريم و رمضان مبارك

AL-MOB4RM3G
09-09-2009, 03:39 PM
أنا طبقته لعمل شات من السرفر للكلينت و من الكلينت للسرفر و لكن لم أطوره ليصبح من الكلينت للكلينت بحيث يمر من خلال السرفر كما أنني لم أجرب برتوكولات أخرى مثل udp و التي على ما اعتقد تنفع بمثل هذه أمور
على كل حال أنا كنت ناوي أعمل برنامج شات جماعى و أنت شجعتني و إن شاء الله أباشر به غدا و نطوره سويا إذا أردت ذلك

أهلا بك أخي الكريم و رمضان مبارك

الله يبارك فيك اخي الكريم,, في الحقيقة فكرة رآئعة وانا سأكون اول المتآبعين لهذا البرنآمج,,

لو كنت استطيع المشآركة لما ترددت اخي الكريم,, لكن كما ترى,, فأنا لا اعرف شئ عن برمجة الكليت و السرفر وانا لا شئ يذكر امامك اخي الحبيب,, لكن ان كنت تريد عمل مثل هذا البرنآمج فسأكون اول من يحآول التعلم منه ان شاء الله,, + انني اشجعك كثيرا على هذا لآنني اود ان اتعلم هذا الشئ,, + انه لا يوجد كثير من المقآلات و الدروس عن الإندي 10, بالإضآفة الى الّغة العربية فهناك شبه سفر مقآلآت عن كيفية استخدآم الإندي 10,, لذلك اشجعك بقوة اخي الكريم,, :bye1:

حسنا,, ستبدئ غدا,, ؟ ان شاء الله
لا بئس,, على كل سأكون بإنتظآرك ان شاء الله ولا تنسى اخي الحبيب بعد اذنك ان تضع الخطوآت وآحدة تلوة الأخرى حتى افهم :oops:

الله يبارك فيك ويرفع قدرك في الدآرين, اللهم آمين,,
ان نويت ان تبدئ 100% اخبرني بارك الله لك ورفع قدرك وزآدك من علمه

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

AL-MOB4RM3G
27-09-2009, 09:55 AM
السلام عليكم من جديد,,

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

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

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

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

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

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

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

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

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

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

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

AL-MOB4RM3G
28-09-2009, 06:54 PM
طيب اخوآني الكرام,, :bye1:

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

اولا,,

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

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

بارك الله لكم

o15s19
29-09-2009, 05:03 AM
أخي أهم شي تخزن الأي بي الخاص بالجهاز لانه عن طريقة يمكنك فعل كل شئ و الفكرة
عندما يتصل العميل بالخادم نقوم بادخال أي بي الجهاز إلى مصفوفة Array أو إلى ListStrings أو كما تحب و عندما ينقطع الاتصال مع العميل نحذفه مثلا من المصفوفة أو نقوم بشئ أخر

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

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

AL-MOB4RM3G
29-09-2009, 09:47 AM
الله يبارك فيكم اخي ويرفع قدركم,,

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

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

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

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

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

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

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

o15s19
30-09-2009, 12:03 PM
ما هو امر الأرسآل من السرفر الى الكلينت ؟
يعني يعمل كونكت السرفر مع الكلينت وبعدها يعمل writeLn ويرسل ال String ,,



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

Context.Connection.IOHandler.WriteLn

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

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


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

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

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

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

AL-MOB4RM3G
30-09-2009, 06:08 PM
نعم, السلام عليكم من جديد,,

اخي الكريم,,

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

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

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

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

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

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

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

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

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

وكذلك العكس,, ففي الحدث OnConnect وضعت الكود الذي وضعته حضرتك,, وقرئت من خلآل الكبينت في الرسآلة المرسلة اليه بعد الكود try و finaly

على كل حال مشكلتي حآليا مع عدة كلينتات وليس كلينت وآحد,,

بعد البحث في النت كثيرا,, وجدت هذا الكود,,

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 فأصبح,

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;

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

AContext(form1.ListBox1.Items[int]).Connection.IOHandler.WriteLn('hello');

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

[DCC Error] Qserver.pas(142): E2066 Missing operator or semicolon

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

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

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

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

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

:bye1:

AL-MOB4RM3G
01-10-2009, 06:19 AM
اخوآني ما رئيكم الآن ؟ :laugh:

هذا الكود,,

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:

AL-MOB4RM3G
01-10-2009, 01:19 PM
لا استطيع ان اقرأ الكود الذي في الأعلى الّى بوآحد من الكلينتس المتصلين,,

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

بارك الله لكم

AL-MOB4RM3G
02-10-2009, 08:13 AM
لكن ماذا لو كان هناك كلينت وآحد متصل ؟
يحدث خلل والله اعلم,, <------------ حسب التجربة,

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

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

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

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

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

ac := Threads[1];

يجب ان يكون

ac := Threads[I];

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

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

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

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

o15s19
02-10-2009, 12:25 PM
على فكرة انظر بالصفحة السابقة بأول رد لي على مشاركتك و ستلاحظ أنك وصلت للكود الذي وضعته و لكن وصولك هذا افضل لانك الان على ما اظن فهمت فكرة الاتصال و الارسال بين السرفر و الكلاينت في بروتوكول tcp
و حتى فكرة التايمر تجد أني أشرت لها

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

AL-MOB4RM3G
02-10-2009, 06:44 PM
على فكرة انظر بالصفحة السابقة بأول رد لي على مشاركتك و ستلاحظ أنك وصلت للكود الذي وضعته و لكن وصولك هذا افضل لانك الان على ما اظن فهمت فكرة الاتصال و الارسال بين السرفر و الكلاينت في بروتوكول tcp
و حتى فكرة التايمر تجد أني أشرت لها

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

اهلا استآذي الحبيب,, :laugh:

نعم, تم حل المشاكل الأسآسيّة ولكن ليس كل المشآكل والله اعلم,
بالنسبة للعربية,, لم اعمل عليها ولكن غدا ان شاء الله سأحآول ان اكمل المشروع بعض الشئ
وأدخل التآيمر في المشروع + انني سأحآول ان شاء الله ان احل مشكلة العربيّة حتى لا يظهر على شكل ؟؟؟؟؟؟؟

على كل حال,, هذا للغد ان شاء الله,
فإن كان هناك ايّة سؤآل فسأضعه هنا ان شاء الله,,

اشكرك من كل قلبي اخي الحبيب, وأسئل الله ان ييسر امرنا و أمركم
والسلام عليكم ورحمة الله

o15s19
02-10-2009, 10:45 PM
اهلا استآذي الحبيب,, :laugh:


وأدخل التآيمر في المشروع + انني سأحآول ان شاء الله ان احل مشكلة العربيّة حتى لا يظهر على شكل ؟؟؟؟؟؟؟


الحمد لله على حل المشاكل

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

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


و السلام عليكم

AL-MOB4RM3G
03-10-2009, 01:07 PM
طيب حسنن اخي الكريم,,

اظن اني سأبدئ مع هذه, لآنّها تبدوا هي الأسهل ؟
ثانيا العربية كاملة اقصد الجمل و و الكلمات مع دمج عربي و انكليزي

اولا, ما الفرق بين الموآضع التي وضعت بها AnsiString و الموآضع التي بها enUTF8 ؟؟

ثانيا,, مثلا بعد الكود:
ReadLn(edit1.text , enUTF8)

لماذا يحدث خلل هنا ؟

هل يجب تعريفه بطريقة من الطرق ؟

[DCC Error] Qserver.pas(163): E2003 Undeclared identifier: 'enUTF8'

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

o15s19
03-10-2009, 10:11 PM
تعريف enUTF8 هو بوضع idglobal في قائمة Uses

جرب كل واحدة على حدى و خبرني شو بصير معك
يعني جرب مرة ارسل String بدون enUTF8 ك String عادية
و جرب ارسلها ك AnsiStrig
و جرب ارسلها ك String مع enUTF8
و جرب ارسلها ك AnsiString مع enUTF8

AL-MOB4RM3G
04-10-2009, 10:43 AM
نعم اخي الكريم,,
جربت هذا ,, و النتيجة,,

enUTF8 تدعم العربيّة بدون مشآكل والله الحمد,

Ansi String لا تدعم العربية ؟ لأن احرف عجيبة غريبة ظهرت بدل من علمآت السؤآل ,,,

ملآحظة,, الآن البرنآمج يرسل نصوص و شغآل تمام مع العربيّة ولكنني لم استخدم AnsiString في المشروع من الأصل,,

على كل حال,, عندما وضعت enUTF8 التي معرفة في IdGlobal كما ذكرت لي اخي الكريم مشي الحآل و كان البرنآمج يكتب بالعربيّة,, لكن في الشريط كتب لي ان استخدم TidTextencoding.UTF8
فستخدمتها ,, واظنها هي تعمل نفس الغرض ؟ لآن العربية كانت تمام ايضى,,,

-----------

الخطوة التآلية الآن هي,,

الاستغناء عن التايمر و استخدام thread (لانه افضل من التايمر و من اجل لا يعمل البرنامج Hang عند الاستقبال)

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

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

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

AL-MOB4RM3G
04-10-2009, 07:53 PM
نعم اخي الكريم,

للأسف لم تنجح معي المحآولة,,
وقد حآولت طول اليوم,

عموما ارسلت لك على الخآص السورس اخي الحبيب,
فإن كان لديك وقت, فلا بئس ان تلقي نظرة,

اشكرك مجددا
والسلام عليكم ورحمة الله

AL-MOB4RM3G
06-10-2009, 08:52 AM
نعم السلام عليكم من جديد,,

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

اولا وضعت هذه الأكوآد بعد قسم ايوسيس

type
TReadResponse= class(TThread)
protected
FConn: TIdTCPConnection;
procedure Execute; override;
public
constructor Create(AConn: TIdTCPConnection); reintroduce;

end;

TWriteResponse = class(TIdSync)
protected
Atext: AnsiString;
procedure DoSynchronize; override;
public
constructor Create(const AResponse: AnsiString);
class procedure AddResponse(const AResponse: AnsiString);

end;

وتحت قسم implementation وضعت الأكوآد التآلية,,

constructor TReadResponse.Create(AConn: TIdTCPConnection);
begin
FConn := AConn;
inherited Create(False);
end;

procedure TReadResponse.Execute;
begin
while not Terminated and FConn.Connected do
begin
TWriteResponse.AddResponse(FConn.IOHandler.ReadLn( '',TIdTextEncoding.UTF8));
end;
end;

constructor TWriteResponse.Create(const AResponse: AnsiString);
begin
AText := AResponse;
inherited Create;
end;

class procedure TWriteResponse.AddResponse (const AResponse: AnsiString);
begin
with Create(AResponse) do try
Synchronize;
finally
Free;
end;
end;

procedure TWriteResponse.DoSynchronize;
begin
//ShowMessage(AText);
//form1.richedit1.Lines.Add(IdTcpClient1.Socket.Read Ln(TidTextencoding.UTF8));
form1.richedit1.Lines.Add(AText);
end;

وكما هو الوآضح في آخر برسيدور فإنّي اود ان اكتب السترينج الذي يأتي من السيرفر
في ال RichEdit1

form1.richedit1.Lines.Add(AText);

نعم, هذا ما قمت به,,
هل من خطأ بارك الله بكم ؟ او هل من شئ نآقص في هذه الأكوآد ليتم ما اود عمله؟
علما انه لا يحدث شئ ,, ولا تضهر اية اخطآء عند
تنفيذ البرنآمج,,

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

o15s19
07-10-2009, 12:46 AM
السلام عليكم

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

1)هل اصبح الكلاينت يتلقى الرسائل بنجاح و بدون تايمر و بالعربي
2)هل الكود يقوم بحمل زاد على معالج الجهاز بمعنى برمجي هل يقوم ب Infinite Loop بالنسبة للكلاينت
3)هل يمكنك الاتصال بالسرفر و البقاء متصلا يعني لا يقوم السرفر بعمل Infinite Loop عندما يتصل الكلاينت بالسرفر و الذي يتظاهر بتعليق السرفر و عدم عمله إلا عندما ينفصل الكلاينت عن السرفر
4)هل فهمت معنى ال Thread في برنامج الكلاينت (كما وظائفه مثلا في bruteForcer )

منتظر اجابتك

AL-MOB4RM3G
07-10-2009, 10:00 AM
نعم اخي الكريم,

بانسبة للأجوبة,,
1. لا, وهنا هي المشكلة رغم انني وضعت الأكوآد الصحيحة والله اعلم,
2. لا, لم الآحظ هذا
3. في الحقيقة لم افهل هذا السؤآل جيدا.
4. نعم فهمت هذا, المعنى هو انه في الكلينت يفتح ثريد خاص بعمليّة التنصط,, يراقب ان كان هناك اية تكست او شئ مرسل من السرفر حتى يستقبله,,

بارك الله لك اخي الكريم, وآسف على اتعآبك معي,
لكن منكم نستفيد اخي الحبيب,,

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

AL-MOB4RM3G
10-10-2009, 04:42 PM
نعم اخوآني الكرام,

السلام عليكم من جديد,,

في الحقيقة اخوآني لا ارى اية فرق بين الكود الذي كتبته وبين كود الآخ o15s19 في اول مشآركة,,

بالإضآفة الى ذلك,, هناك هذا الدرس,,

من هنا,, (http://www.devarticles.com/c/a/Delphi-Kylix/A-Real-World-Client-Server-Application-in-Delphi/)

وفيه ايضى شرح نفس الشئ,, ومع ذلك لم ارى ايّة فرق,,

وهنا ايضى,, وآضحة وضوح الشمس,, ليس هناك اية فرق (http://www.delphipages.com/articles/the_client_for_an_internet_access_control_applicat ion-11205.html)

هل من فكرة بارك الله فيكم ؟

AL-MOB4RM3G
07-11-2009, 06:12 PM
السلام عليكم ورحمة الله

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

المشكلة هي انني اود ان استخدم الثريد Thread في استقبال ال Strings من السرفر,

لكن لم اتمن من هذا بعد, رغم المسآعدة الذي قدمها لي الآخ الكريم o15s19 يسّر الله امرنا وآمره,,

على كل حال, في المرفقات مشروع صغير,,

1. بعد تشغيل السرفر,, قم بالضغظ على زر التشغيل,,

افتح الكلينت وضغط على كلمة الدخول,, هنا,, يتم الإتصال بالسرفر,, ويتم ارسآل المعلموات التي في

edit3.text وبعدها سيتقبلها السرفر ويرسلها لكل الكلينتس المستصلين,,

وهنا المشكلة,, في كيفية الإستقال من طرف الكلينتس,,

اود منكم مسآعدة بارك الله لكم, لآنني على وشك اليئس مع هذه المشكلة,,

اكثر من ثلآثة اسآبيع ولا فآئدة,, يعني لو يتكرم احد الإخوة ويعمل سورس صغير يكون شغّال,, او يكمل نقطة

الإستقبال في هذا المشروع المرفق,, وآكون له من الشآكرين

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

o15s19
07-11-2009, 06:45 PM
و الله أنت ببالي أخي الكريم اليوم إن شاء الله تنحل مشكلتك بعد ما حدثت برنامج التحكم الخاص بي كاملا بحمد الله

o15s19
07-11-2009, 07:47 PM
و الأن ما رأيك بهذا الدواء لهذا الداء

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

انتبه للملاحظات الموجودة في السورس كود

سلامي لك أخي الكريم

AL-MOB4RM3G
08-11-2009, 07:38 AM
اخي وأستآذي الحبيب o15s19, لا يسعني الّى ان اقول لك بارك الله فيك وجزآك الله عنّي كل خير,,

في الحقيقة البرنآمج الذي عملته حل المشكلة ولله الحمد,, و الملآحظات التي وضعتها وضحة جداّ,

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

حتى في المشآركة السآبقة, نسيت ان ارفق البرنآمج

على كل حال, في المرفقات مشروع صغير,,

وهذا أكيد بسبب المشكلة التي كنت انا بها,,

فبارك الله فيك وجزآك الله كل خير, ورفع الله قدرك وأعلى شئنك

وسأدعوا لك كثيرا ان شاء الله, والسلام عليكم ورحمة الله