Iphones
هل تريد التفاعل مع هذه المساهمة؟ كل ما عليك هو إنشاء حساب جديد ببضع خطوات أو تسجيل الدخول للمتابعة.

صمم برنامج شات جماعي بنفسك رائع جدا اتفنن في الفيجوال

اذهب الى الأسفل

صمم برنامج شات جماعي بنفسك رائع جدا اتفنن في الفيجوال Empty صمم برنامج شات جماعي بنفسك رائع جدا اتفنن في الفيجوال

مُساهمة من طرف nabil الأربعاء أبريل 25, 2007 12:44 pm

بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته
----------------------------------------------
كثير من الأعضاء حاولوا يعملوا برنامج هاكر ونجحوا واللي يعتمد على خادم / عميل

وحاولوا يعملوا برنامج محادثة ونجحوا بنفس الفكرة ...

لكن ماذا لو فكرنا بصنع برنامج محادثة جماعي ؟؟

أنا بقلكم القصة بسيطة جدا وإنشاء الله راح يفهمها الكل بدون أية مشاكل

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

ولكن سيتميز برنامج الخادم هنا بوجود مصفوفة من أدوات الـ winsock وطبعا لازم يكون مستواك

البرمجي متقدم شوي حتى تفهم كل الشغل ..

طيب يالله نبدأ الشغل ..

بسم الله ...

افتح مشروع جديد

و أضف 11 أدوات Winsock إلى المشروع وبعدها روح على خاصية index لكل من هذه الأدواة

ورقمها من الـ 0 إلى الـ 10. ، بعدين غير أسم كل الأدواة واجعله Wsk .

طيب حاليا ... أضف :

تكست اجعل اسمها txtlist وغير خاصية Multiline = true , Scrollbars = vertical

تكست اخرى باسم txtsend

تكست اخرى باسم txtname ليوضع فيها اسم المشترك...

ليست باسم lstusers ليوضع بها اسماء الموجودين في المحادثة.

ليبل lblstat

command1 نجعل خاصية الـ caption له " أرسل ".

تكست اخرى باسم num لنضع بها عدد الموجودين.


تمام ، الآن رتبهم بالشكل المناسب كما في الصورة :


صمم برنامج شات جماعي بنفسك رائع جدا اتفنن في الفيجوال 99267f9526


الآن يجب علينا أن نأخذ أداة وينسوك من الـ 11 وينسوك اللي اسمها wsk(0) لنعمل عن طريقها

حلقة بحيث كلما يوصل إتصال جديد من عميل جديد تقوم وينسوك من الـ 10 الباقيين باستلام الإتصال.

لذا لو كان عندنا عميل واحد بس كان الكود عندنا هيك :

كود:
wsk(0).close
wsk(0).Accept requestID
أما نحن لدينا 11 عميل لذا سنكتب الكود التالي :

كود:
Dim I As Integer
For I = 1 To 10
If wsk(I).State = 0 Then
wsk(I).Accept requestID
Exit For
End If
Next
وهنا عملنا حلقة من الـ 1 إلى الـ 10 لنتفحص فيها حال الوينسوكات الـ 10 وأول واحدة سيقابلها البرنامج حالتها 0 يعني غير متصلة ستقبل الإتصال مباشرة وتصبح حالتها 7.وتنتهي الحلقة صمم برنامج شات جماعي بنفسك رائع جدا اتفنن في الفيجوال Wink

وطبعا هذا الكود السابق في الحدث : ConnectionRequest لأي واحدة من الوينسوكات لأنهم مصفوفة صمم برنامج شات جماعي بنفسك رائع جدا اتفنن في الفيجوال Eek لذا فعملنا سهل وبسيط إنشاء الله ...

طيب نكتب في الفورم لود الكود التالي العادي :

كود:
wsk(0).Close
wsk(0).LocalPort = 9000
wsk(0).Listen
طيب ..

بفرض نحن فاتحين برنامج الخادم وقام أحد عملاء البرنامج بالإتصال بالخادم لذا يجب أن نعلم الخادم

والعملاء الباقين بأنه دخل العميل فلان تمام ؟

يبقى عندما يتصل العميل بالخادم يعني بالحدث connect عند العميل يرسل رسالة هي newuser معها اسم العميل الجديد

هلء يا جماعة لازم توصل هذه الرسالة إلى الخادم إلى الحدث Data arrival وبعدين يضيف الإسم إلى الـ lstusers وبعدين نعمل حلقة لهذه اللست بدالة جديدة ونرسل قائمة الأسماء الموجودة في الـ lstusers
لكل العملاء المتصلين ...

وهيك بنكون خلصنا هذه الفكرة نظرياً ..

نبدأ بالعملي صمم برنامج شات جماعي بنفسك رائع جدا اتفنن في الفيجوال Eek

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

مثلا :

كود:
text1.text= ****(1234,2)
راح يكون الناتج 12

أما الدالة Mid فتأخذ حد من الأحرف مثلا من الحرف الثامن وحتى نهاية النص ...

كود:
text1.text = Mid(12345,2)
راح يكون الناتج 345

طيب نحن لما توصلنا الرسايل من الـعميل شو راح نعمل ؟؟

راح نكتب الكود التالي :
كود:
'--------------------------------------------------
Dim Cmd As String
Dim Msg As String
Dim S As String
Dim I As Integer

wsk(Index).GetData S

Cmd = ****(S, 7)
Msg = Mid(S, 8)
'--------------------------------------------------
ولاحظ هنا أهمية الدالتين **** و Mid حيث أصبح عندنا المتغير cmd يمثل الأمر الذي سيأتي من العملاء مثل newuser مثلاً
أما المتغير Msg سيمثل الرسالة العملية اللي ستظهر للمستخدم مثل رسائل المحادثة ( السلام عليكم ، وعليكم ... ).. صمم برنامج شات جماعي بنفسك رائع جدا اتفنن في الفيجوال Biggrin

طيب الآن نكمل الكود بالتالي :
كود:
Select Case Cmd
Case "newmssg"
txtlist.Text = txtlist.Text + vbNewLine + vbNewLine + Msg
txtlist.SelStart = Len(txtlist)

هنا فتحنا قاعدة Select case لكل من الرسائل ( الأوامر ) الواصلة من العملاء
وهنا أول رسالة newmssg حسب الكود نضيف البيانات الواردة إلى تكست المحادثة
والسطر الرابع في الكود كلكم بتعرفوه صمم برنامج شات جماعي بنفسك رائع جدا اتفنن في الفيجوال Biggrin
نكمل الكود بالحلقة التالية :
كود:
For I = 1 To 10
If wsk(I).State = 7 Then
wsk(I).SendData "message" + Msg
DoEvents
End If
Next
حيث تفحصنا الوينسوكات العشرة وشفنا أي منها متصل خليه يرسل للعميل المتصل معه هذه الرسالة ( بما أن الشات جماعي فكل المتصلين يجب أن تظهر عندهم نفس الرسالة ).
نضيف أيضا بعده الكود :
كود:
Case "newuser"
lblstat.Caption = "آخر مستخدم دخل للمحادثة هو : " + Msg
lstUsers.AddItem Msg
For I = 1 To 10
If wsk(I).State = 7 Then
wsk(I).SendData "mssgbox" + txtname.Text
wait1
wsk(I).SendData "newlist" & Getlist
End If
Next

والكود السابق على ما أظن مهمته معروفة وهي :

1ـ وضع آخر مستخدم دخل للمحادثة في ليبل واضافته لليست الموجودين
2ـ عمل حلقة لمعرفة ادواة الوينسوك المتصلة وارسال :
أولا : اسم الخادم الموجود في الـ txtname
ثانيا: ارسال القائمة الجديدة لكل العملاء بعد إضافة المستخدم الجديد لها.

لكن لاحظ أننا هنا اخترعنا دالتين اثنين :

1ـ دالة wait1 ، للإنتظار قليلا ووضعتها أنا هنا للفصل بين الأمرين mssgbox , newlist واللي عنده طريقة أخرى للفصل بين الأوامر لا يبخل علينا صمم برنامج شات جماعي بنفسك رائع جدا اتفنن في الفيجوال Biggrin

2ـ دالة Getlist حيث أننا كنا نريد أن نرسل القائمة الجديدة من المستخدمين ألى العملاء المتصلين
لذلك لا يمكننا أن نرسل الأسماء الموجودة في القائمة إلى بعمل حلقة لها والفصل بينها بالعلامة #
وعندما تصل هذه الرسالة إلى كل عميل يقوم بالفصل بين الأسماء (split( ثم يضيفها إلى ليست الموجودين عنده ...

يعني نضيف الكود التالي للتصريحات العامة في المشروع :


كود:
Private Sub wait1()
Dim T As Single
T = Timer
Do Until (Timer - T >= 1)
DoEvents
Loop
End Sub
Private Function Getlist() As String
Dim S As String
Dim I As Integer
S = ""
For I = 0 To lstUsers.ListCount - 1
S = S + "#" + lstUsers.List(I)
Next
Getlist = Mid(S, 2)
End Function

ولا تنسا في تغلق الـ select case في الداتا ارايفال

بالـ End Select


ضع في كلا الحدثين close و Error الكود :
كود:
wsk(0).Close
wsk(0).LocalPort = 9000
wsk(0).Listen
txtname.Locked = False
في زر أرسل الرسالة ضع الكود :


كود:
Dim f As Integer
txtlist.Text = txtlist.Text + vbNewLine + vbNewLine + txtname.Text + " :" + txtsend.Text
For f = 1 To 10
If wsk(f).State = 7 Then
wsk(f).SendData "message" & txtname.Text + " :" + txtsend.Text
End If
Next

txtsend.Text = ""
txtlist.SelStart = Len(txtlist)

وفي الحدث Connect حططط ..

كود:
txtname.Locked = True

هلء قبل ما ننتقل لبرمجة العميل حطلك Timer1
وضع فيها الكود :
كود:
num.Text = lstUsers.ListCount
وغير خاصية الـ interval = 10 لإحصاء عدد الموجودين في القائمة

nabil
عضو مبتدئ
عضو مبتدئ

عدد الرسائل : 104
تاريخ التسجيل : 03/04/2007

الرجوع الى أعلى الصفحة اذهب الى الأسفل

الرجوع الى أعلى الصفحة

- مواضيع مماثلة

 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى