سؤال حول Indy (إرسال/إستقبال البيانات)
#1
السلام عليكم ورحمة الله وبركاتة

كنت قد اكتشف المكون Indy IRC وقمت بعمل برنامجين (Client/Server)

حيث يقوم الكلينت بالإتصال بالسيرفر .. وتتم عملية إرسال وإستقبال البيانات
لكني لم استطع جعل السيرفر يرسل البيانات إلى الكلينت.

وهذا تطبيقي على X4

السؤال هنا كيف اجعل السيرفر يرسل إلى الكلينت المتصل به ؟:confused:


الملفات المرفقة
.rar   Test.rar (الحجم : 200.93 ك ب / التحميلات : 124)
الرد
#2
فكرة الـ irc تختلف عن اتصال العادي
يتم عمل اتصال اشبه ما يكون بالغرف بتصل عليها الـ clients و اي شي يكتب في تلك العرف يرسل الى جميع متصلين من client في الغرفة
لا ادري ادا يمكن للـ server ارسال ام يكتفي بالمعالجة الاتصال و غرف و امورها و رسائل فيهاا

الافضل استعمال برتكول الام لكل هدا tcp و معروف ك tidtcpserver - tidtcpclient
.:: مبرمج شوارع ::.
الرد
#3
حاولت ان اطبق ذلك من خلال tidtcpserver - tidtcpclient ونفس النتيجة .. لا أعرف ماهي الطريقة لجعل Server يستطيع إرسال بيانات إلى Clients

واعتقد ان Indy IRC هي نفس المكون الرئيسي Indy TCP وإنما فقط مضافه لها بعض الخصائص الخاصة بالغرف الجماعية وخصائصها ..
الرد
#4
من جهة سيرفر في بيئة الاندي هنالك نمطين من الاستقبال التلقائي للبيانات

1 - عبر الاوامر المسيرة بالاحداث command handler
2 - عبر حلقة يتم استقبال فيها البيانات المرسلة execute loop

اما ارسال فيكون عبر دوال write ln -wrtite string - write integer - write stream

* ممكن اسقبال بيانات عبر دوال ايضاا read ln -read string - read integer - read stream

اما الـ client ف فقط بالدوال
.:: مبرمج شوارع ::.
الرد
#5
طيب إذا تكرمت بمثال للسيريفر عن :
1 - عبر حلقة يتم استقبال فيها البيانات المرسلة execute loop
2 - الارسال عبر دوال wrtite string - write integer - write stream
الرد
#6
السلام عليكم ورحمة الله وبركاتة
أكتشفت طريقة إرسال البيانات إلى Clients ... وهي من خلال الكود التالي :
PHP كود :
procedure TForm1.Button3Click(Sender: TObject);
var
  
Clients : TList;
  
i : Integer;
begin
  Memo1
.Lines.Add('You : ' + Edit1.Text);  
  if 
not Assigned(IdIRCServer1.Contexts) then Exit;

  
Clients := IdIRCServer1.Contexts.LockList;
  for 
i := 0 to IdIRCServer1.Contexts.Count-1 do
  try
    
TIdContext(Clients.Items[i]).Connection.Socket.Write(Edit1.Text);
  finally
    
IdIRCServer1.Contexts.UnlockList;
  
end;
end; 
الرد
#7
السلام عليكم ..

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

هل يعرف احدكم السبب ؟
الرد
#8
.. أعتقد أني حصلت على الحل , وهو أن المكون Indy له طريقة في التعامل مع البيانات المرسلة
حيث أن الدالة : ReadLn
PHP كود :
AContext.Connection.Socket.ReadLn() 
تعمل كتالي :
في البداية تتلقى البياانات
وبعد ذلك تتلقى بيانات آخرى تشير إلى أن السيرفر انتهى من أرسال البيانات .. وفي حالتي انا لم اضع البارمترات الخاصة بالدالة .. لذلك اصبحت ( ترسل البياانات مره بعد مره كما ذكرت ) لذلك توجب علي أن اضع بارمترت وهو عبارة عن String يشير إلى نهاية إرسال البيانات كتالي :
PHP كود :
procedure TForm2.IdIRC1AfterCommandHandler(ASender: TIdCmdTCPClient;
  
AContext: TIdContext);
var
  
Msg : string;
begin
  Msg 
:= AContext.Connection.Socket.ReadLn('//FinishedSending//');
  
Memo1.Lines.Add('Server 1: ' + Msg)
end; 
واضيف تلك العبارة "//FinishedSending//" إلى أمر ارسال البياانات بعدة إنتهائي من إرسال البيانات في السيرفر

هذا ما استنتجته .. والسلام عليكم
وشكرا لك أخي Houdini
الرد
#9
لماذا العربي يظهر على استفهمات والدلفي لايقبل الترميز
الرد
#10
همم فعلاً .. ربما لم اكتب الكود الخاص بالترميز UTF-8 .. وكذلك نستطيع حل المشكلة بعمل دالة تستبقل باايانات Stream وتحولة إلى String العربي Smile
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم