ارسآل رسآئل الى اكثر من غرفة الى الكلينتس عن طريق الإندي ؟
#1
السلام عليكم ورحمة الله

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

اوآجه مشكلة والله المستعان,,

في الرآبط ادنى السورس + الكلينت و السرفر على شكل Exe

اود ان اعمل شات عن طريق الإندي لعدة غرف,

يعني سيكون هناك 3 شات رووم و ان كتب احد المتصلين في الغرفة 1 فلن يقرآ المكتوب الّى المتصلين في الغرفة 1 وهكذا,,

الذي يحدث معي ان المشكلة في حالة اكثر من غرفة في نفس الوقت,,

جربوا البرنامج بارك الله لكم,,

1. شغّل السرفر,,

2. ادخل 2 كلينتس او اكثر الى الغرفة 1,, كل شئ تمام, و الكونتاكت ليست يتم تطويره عادي و بالشكل المطلوب وهذا ما ****ه,,

3. ادخل مع ثالث كلينت الى الغرفة 2 في اثنآء وجود 2 من الكلينتس متصلين في الغرفة 1,,

4. ادخل برآبع كلينت الى الغرفة 2 وهنا يحدث الخلل,,
فقط رآبع كلينت يتم عمل ارسآل ال كونتاكت ليست له,, وهذه هي المشكلة,, الوآجب في هذه الحآلة ان يتم عمل update لكل المتصلين في الغرفة 2,,

السبب اظن انني اعرف,,
استخدم هذا الكود,,

PHP كود :
procedure TLogRoomSync.DoSynchronize;// Synchronization
var
  
StrItemNum, i, e, x : Integer;
  
Thread : Tlist;
  
ac : TidContext;
  
Str : Tstrings;
begin
if FRoomNumber = '0' then                      // Room 1
  
begin
    form1
.UserListBox_1.Items.Add(FUserName);
    
Str := Form1.UserListBox_1.Items;
    
ClientsIPList[0].Add(FUserIP);   //// Client IP Add To StringList
    
ClientsPortList[0].Add(FUserPort);
    
StrItemNum := 0;
  
end
else if FRoomNumber = '1' then                // Room 2
  
begin
    form1
.UserListBox_2.Items.Add(FUserName);
    
Str := Form1.UserListBox_2.Items;
    
ClientsIPList[1].Add(FUserIP);
    
ClientsPortList[1].Add(FUserPort);
    
StrItemNum := 1;
  
end
else if FRoomNumber = '2' then               // Room 3
  
begin
    form1
.UserListBox_3.Items.Add(FUserName);
    
Str := Form1.UserListBox_3.Items;
    
ClientsIPList[2].Add(FUserIP);
    
ClientsPortList[2].Add(FUserPort);
    
StrItemNum := 2;
  
end;

    
Thread:= form1.idtcpServer1.Contexts.LockList;
      
I := ClientsIPList[StrItemNum].Count - 1;  // Counts of Clients in specefik room
      
E := -1;
      for 
x := 0 to Thread.Count - 1 do        // ALL Connection With the IdTcpServer1
        
begin
          e 
:= e + 1;
          if 
e >= i then e := i;// + 1

          
ac:= Thread[x];
          If (
ac.Binding.PeerIP = ClientsIPList[StrItemNum].Strings[e]) and (IntToStr(ac.Binding.PeerPort) = ClientsPortList[StrItemNum].Strings[e])  then
          begin
            
//Showmessage('List Sent To: '+ ac.Binding.PeerIP+': '+ inttostr(ac.Binding.PeerPort));
            
ac.Connection.IOHandler.WriteLn('_CS_RoomUsersListSends');
            
ac.Connection.IOHandler.Write(Str, True,Tencoding.UTF8);
          
end;
        
end;
  
form1.idTcpServer1.Contexts.UnlockList;


end; 

وأظن ان الخلل يحدث مع المقآرنة في هذا السطر,
PHP كود :
If (ac.Binding.PeerIP = ClientsIPList[StrItemNum].Strings[e]) and (IntToStr(ac.Binding.PeerPort) = ClientsPortList[StrItemNum].Strings[e])  then 

كيف احلّ هذه المشكلة بارك الله لكم وجزآكم خيرا ,,

رآبط البرنآمج مع السورس هنا,
إقتباس :http://www.mediafire.com/?hnhnl2kzjno

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

اشكر الأخ o15s19 من كل قلبي :laugh:
فرّج همّ المهمومين يا الله
اللهم فك قيد اسرانا و اسرى المسلمين
الرد


الردود في هذا الموضوع
ارسآل رسآئل الى اكثر من غرفة الى الكلينتس عن طريق الإندي ؟ - بواسطة AL-MOB4RM3G - 28-12-2009, 10:12 AM

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


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