الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكله في نقل الصورة لكل الأجهزة

مغلق
بدأه ابو بكير في 14 مارس 2007 · 13 رد · 1,740 مشاهدة · في برمجة الشبكات والتطبيقات الموزعة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

لدي مشروع تخرج في الجامعة حول الشبكات وواجهتني مشكله في طريقة نقل المحاضرة من جهازي الى بقية الأجهزة ( اي برود كاست)

وقد قمت بالإستفادة من كتاب المتألق فادي عبدالقادر حيث هو شبيه بالبرنامج Conference Desktop System حيث تتطرق لهذا الموضوع عن طريق multicast فكيف اقوم بإستخدام هذه الطريقة حيث أن جهازي ليس جهاز سيرفر معين بل جهاز في شبكة مكونه من 10 أجهزه وليس سيرفر خاص

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

كود الإرسال:

Bitmap bt = new Bitmap(CaptureScreen.CaptureScreen.GetDesktopImage());

pictureBox1.Image = ResizeBitmap(bt, 600, 400 );

MemoryStream ms = new MemoryStream();

pictureBox1.Image.Save(ms,System.Drawing.Imaging.ImageFormat.Jpeg);

byte[] arrImage = ms.ToArray();

Socket server = new Socket(AddressFamily.InterNetwork,

SocketType.Dgram, ProtocolType.Udp);

IPEndPoint iep = new IPEndPoint(IPAddress.Parse(textBox1.Text), 5020);

server.SendTo(arrImage,iep);

server.Close();

وكود الإستقبال:

void Receive()

{

UdpClient cl=new UdpClient(5020);

cl.JoinMulticastGroup(IPAddress.Parse("224.0.0.1"));

IPEndPoint ip=new IPEndPoint(IPAddress.Any,0);

byte[]data=cl.Receive(ref ip);

MemoryStream ms=new MemoryStream();

pictureBox3.Image=Image.FromStream(ms);

cl.Close();

}

اكرر حيث أن جهازي ليس سيرفر واية طريقه أفضل لي الـ multicast او الـ broadcast

وكيف أضيف باقي الأجهزه اذا سأستخدم الـ multicast حيث سأرفق المشروع لمن سيدلني على الحل

حيث في البرنامج Electronic Server الفورم هو sendlec

حيث انني اريد أن اعرض سطح مكتبي الى باقي الأجهزه في الشبكة

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

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

هذا ولكم جزيل الشكر

E_Client.rar

تم تعديل هذه المشاركة بواسطة ابو بكير في 14 مارس 2007 في 18:21

سأصبر حتى يعجز الصبرُ عن صبري

وسأصبر حتى يأذن الله في أمري

وسأصبر حتى يعلم الصبرُ أني صبرتُ على شيئاٍ أمرُ من الصبرِ

#2

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

في رأيي فإن multicast أفضل من Broadcast حيث هنا لا تغرق الشبكة و إنما يستقبلها فقط الذين إنضموا إلى multicast group .

كل الأجهزة التي تريد أن تستقبل الصورة ضع البرنامج الخاص بالإستقبال عندها ( نفس الكود الذي قمت بإرفاقه ) ...

بالتوفيق

#3

شكراً يا حسام فيصل شكرا لحل الصورة فهمتها اما بالنسبه للملتي كاست فقد جربته بين جهازين ولم يعمل حيث ان الآيبي الخاص بالجهاز حقي هو 192.168.0.1 والثاني 192.186.0.2 فكيف أطبق الـ multicast بالتفصيل وياريت تشوف المرفق وتجربه وتقولي الخطاً حيث الخطأ يظهر في برنامج الإستقبال في السطر الأول UDPClient cl=new UDPClient(5020)

فياريت ياريت ياريت تشوفون البرنامج وتجربونه وجزاكم الله خير على المساعده

سأصبر حتى يعجز الصبرُ عن صبري

وسأصبر حتى يأذن الله في أمري

وسأصبر حتى يعلم الصبرُ أني صبرتُ على شيئاٍ أمرُ من الصبرِ

#4

اين الأعضاء

الرجاء المساعده لأن المشكله لازم نجد لها حل وضروري في نفس الوقت اين مشرف القسم وأين المتميزين

سأصبر حتى يعجز الصبرُ عن صبري

وسأصبر حتى يأذن الله في أمري

وسأصبر حتى يعلم الصبرُ أني صبرتُ على شيئاٍ أمرُ من الصبرِ

#5

السلام عليكم

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

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

		UdpClient cl = new UdpClient(5020);
		Thread myshow;

		void Receive()
		{


				IPEndPoint ip=new IPEndPoint(IPAddress.Any,0);
				MemoryStream ms;
				while (true)
				{
					byte[] data = cl.Receive(ref ip);
					ms = new MemoryStream(data);
					pictureBox3.Image = Image.FromStream(ms);
				}
		}
		private void button3_Click(object sender, System.EventArgs e)
		{
			cl.JoinMulticastGroup(IPAddress.Parse("224.0.0.1"));
			myshow = new Thread(new System.Threading.ThreadStart(Receive));
			myshow.Start();

			//timer1.Enabled = true;
			/*myth= new Thread  (new System.Threading .ThreadStart(StartMethod)); 
			myth.Start ();*/
		}

ايضا انتبه الى استخدام الـPort Number فقد لاحظت انك تستخدم نفس البورت لأكثر من عملية مما سيؤدي على ان يخبرك ان الـPort الذي تحاول الإتصال به مشغول

بانسبة لطريقة نقل صورة سطح المكتب فأنا افضل استخدام تكنلوجيا الـRemoting عبر الـTCP وذلك لإمكانية نقل الصورة وبدون الحاجة إلى تصغيير حجمها كونك ستسخدم الـTCP وليس UDP ... انظر إلى الفصل الخامس عشر في الكتاب

باتوفيق

تم تعديل هذه المشاركة بواسطة فادي عبدالقادر في 15 مارس 2007 في 19:19

#6
اقتباس
بانسبة لطريقة نقل صورة سطح المكتب فأنا افضل استخدام تكنلوجيا الـRemoting عبر الـTCP وذلك لإمكانية نقل الصورة وبدون الحاجة إلى تصغيير حجمها كونك ستسخدم الـTCP وليس UDP ...

كيف استخدم الـ TCP في نقل صور سطح المكتب ( على شكل فيديو) وأنا اريد ان ارسل الى كل الأجهزة وهل هذا الكود الذي صححته اذا كان جهازي ليس سيرفر وإن شاء الله سأجرب الكود ودعواتكم لي وإذا في مشكله واجهتني راح أرجعلكم شكراً

سأصبر حتى يعجز الصبرُ عن صبري

وسأصبر حتى يأذن الله في أمري

وسأصبر حتى يعلم الصبرُ أني صبرتُ على شيئاٍ أمرُ من الصبرِ

#7

السلام عليكم اخي ابو بكير

هذه المشكلة واجهتني من كم يوم

وبالنسبة لبروتوكول UDP فهو لا ينفع اطلاقا حسب تجربتي

الصورة الذي يستقبلونها مشوهة جدا

ولا يستطيع المتلقي قراءة ما فيها

اما بروتوكول TCP فهو ممتاز الى حد ما في الارسال وفي وضوح الصورة

لكن مشكلتة عدم دعمة لـ multicast وال Broadcast

ولكن يوجد بروتوكول RTP وهو خليط من مميزات الاثنين السابقين

ينقل الصور جيدا والصوت والفيديو

ويدعم multicast

لكن لا تسألني عن كيفية استخدامة

لانني حاول ولم اعرف الى الان ولكن اذا عرفت فارجوك علمنا

ولكن ممكن اذا اردة امثلة علية

http://research.microsoft.com/conferencexp/

هذا الرابط

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

#8

بالنسبة لإستخدام توصيف RTP المقدم من مايكروسوفت عبر مشروعها ConferenceXP فهو سهل بأكثر مما تتصور ...

بكلمات سريعة :

1- ضمن ملفات dll الناتجة عن مشروع ConferenceXP (تجدها في مجلد Bin في المشروع الذي قمت بإرفاقه ) ..

من أجل إرسال بيانات كصورة مثلاً :

1- تضمين :

using MSR.LST.Net.Rtp;

using MSR.LST;

2 - تحتاج إلى RTP Session (مشابهة للSocket ) من أجل عملية الإتصال و الإنضمام إلى مجموعة ما :

 RtpSession rtpSession;

و يتم تهيئته بواسطة :

RtpSession (IPEndPoint, RtpParticipant, Boolean, Boolean)

حيث IPEndPoint  هو عنوان  multicast   و RtpParticipant  هو مميزك ضمن مجموعة RTP التي حددتها  بواسطة IPEndPoint  ..   البارمتر الثالث  هو لمراعاة Rtp Traffic  و الأخير  من أجل هل تريد إستقبال بيانات  ( أي فقط للإرسال )

مثال  :

rtpSession = new RtpSession(new IPEndPoint( IPAddress.Parse("224.100.0.1"),9090) , new RtpParticipant("studenx", "studex"), true , true);

3- إذا أردت إرسال بيانات فعليك :

1- إنشاء RtpSender بالشكل :

RtpSender rtpSender = rtpSession.CreateRtpSenderFec("Hussam ", PayloadType.JPEG, null, 0, 200);

لا حظ PayloadType.JPEG و تعني أني أريد إرسال صورة .. و هناك قيم أخرى و هي chat -- vidio-audio ...إلخ تختار القيمة حسب ما تريد إرساله ..

فمثلاً إذا أردت إرسال صور الكاميرا DynamicVidio ...إلخ .

2- عملية الإرسال تتم بواسطة :

rtpSender.Send(arrImage);

الإستقبال :

نفس طريقة إنشاء Sesision :

rtpSession = new RtpSession(new IPEndPoint( IPAddress.Parse("224.100.0.1"),9090) , new RtpParticipant("student", "student"), true , true);

2- نريد معالجة حدث إنضمام شخص جديد اي session جديدة و بالتالي لإستقبال البيانات منه :

            RtpEvents.RtpStreamAdded += new RtpEvents.RtpStreamAddedEventHandler(newStream);

لنكتب الإجرائية newStrem :

public void newStream(object o , RtpEvents.RtpStreamEventArgs ea) 

        {

            ea.RtpStream.FrameReceived+=new RtpStream.FrameReceivedEventHandler(recieveImageMethod); 

        }

ما يعنيه الكود السابق أننا نريد أن تكون الإجرائية recieveImageMethod هي التي تتولى عملية الإستقبال و بالتالي العرض كما في :

  private void recieveImageMethod(object o , RtpStream.FrameReceivedEventArgs ea)

        {

            MemoryStream mem=new MemoryStream( ea.Frame.Buffer );

            desktopImage.Image = Image.FromStream(mem); 

         

        }

طبعاً من الواضح أن البيانات المستقبلة نجدها داخل ea.frame.Buffer ...

أرجو أن تكون الفكرة قد وصلت ...

ملاحظة : يوجد تطبيق chat في الملحقات يبين كامل العمليات التي ذكرتها مسبقاً ..

بالتوفيق ..

Chat.rar

تم تعديل هذه المشاركة بواسطة حسام فيصل في 18 مارس 2007 في 10:28

#9

الله يبارك فيك اخوي

والله انك ماقصر وان شاء الله اني باجرب هذه الطريقة

#10

شكرا اخوي حسام

انا راح اجرب المثال وإن شاء الله يضبط وبارجعلكم إن شاء الله

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

وراح ارجعلكم إن شاء الله

سأصبر حتى يعجز الصبرُ عن صبري

وسأصبر حتى يأذن الله في أمري

وسأصبر حتى يعلم الصبرُ أني صبرتُ على شيئاٍ أمرُ من الصبرِ

#11

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

اخوي حسام والمشرف والقائمين على المنتدى والجميع واجهتني مشكله أخرة وهي في نقل الصوره من الكلاينت الى السيرفر أي مشاهدة الطلبه وسوف أشرح الطريقة التي إستخدمتها حيث قمت في برنامج السيرفر ( في الفورم Myshow) بتشغيل ثلاثة ثريد(Thread ) لمشاهدة ثلاثة طلاب في وقت واحد ولكل منهم صوره مستقلة

اقتباس
thrprivew1=new Thread(new System.Threading.ThreadStart(pic1));

thrprivew1.Start();

// بداية ثرايد الإستقبال الثاني

thrprivew2=new Thread(new System.Threading.ThreadStart(pic2));

thrprivew2.Start();

//بداية ثرايد الإستقبال الثالث

thrprivew3=new Thread(new System.Threading.ThreadStart(pic3));

thrprivew3.Start();

ويقوم الثريد بإستدعاء الداله التالية ولنفرض الثريد الأول:

اقتباس
TcpListener tcppic1=new TcpListener(port1);

void pic1()

{

try

{

tcppic1.Start();

Socket sockpic1=tcppic1.AcceptSocket();

NetworkStream nspic1=new NetworkStream(sockpic1);

pict1.Image=Image.FromStream(nspic1);

tcppic1.Stop();

if(sockpic1.Connected==true)

{

while(true)

{

pic1();

}

}

nspic1.Close();

}

catch

{}

}

وقمت بعمل زر play كتجربه لجلب الصوره حيث قمت بتمرير كلمة play الى برنامج الكلاينت وهذه هي الشفرة:

اقتباس
try

{

foreach(ListViewItem lvi in listshow.SelectedItems)

{

TcpClient tcp=new TcpClient(lvi.SubItems[1].Text,7330);

NetworkStream nsp=tcp.GetStream();

StreamWriter srp=new StreamWriter(nsp);

string s="play";

srp.WriteLine(s + port2.ToString());

srp.Close();

nsp.Close();

tcp.Close();

}

}

catch

{

MessageBox.Show("Can not Send To User Machain" );

}

ثم في برنامج الكلاينت (الطالب) بتفحص الكلمه فإذا كانت play يقوم بتشغيل timer2

اقتباس
listentosend=new Thread(new System.Threading.ThreadStart(listen));

listentosend.Start();

void listen()

{

try

{

MessageBox.Show("بديت استمع");

tcpsend.Start();

socksend=tcpsend.AcceptSocket();

nssend=new NetworkStream(socksend);

srsend=new StreamReader(nssend);

string rc=srsend.ReadLine().Trim();

rc1=rc.Substring(0,4);

string po= rc.Substring(4,4);

int x=Int32.Parse(po);

switch (rc1)

{

case "play":

if (timer2.Enabled==false)

{

timer2.Enabled=true;

}

break;

case "stop":

timer2.Enabled=false;

break;

}

if(socksend.Connected==true)

{

while(true)

{

listen();

}

}

}

catch

{

}

وشفرة الـ timer2 هي:

اقتباس
private void timer2_Tick(object sender, System.EventArgs e)

{

try

{

pictureBox4.Image = CaptureScreen.CaptureScreen.GetDesktopImage();

ms5 = new MemoryStream();

pictureBox4.Image.Save(ms5,System.Drawing.Imaging.ImageFormat.Jpeg);

byte[] arrImage = ms5.GetBuffer();

myclient5 = new TcpClient ("localhost",9200);

myns5 = myclient5.GetStream ();

mysw5 = new BinaryWriter (myns5);

mysw5.Write(arrImage);//send the stream to above address

ms5.Flush();

mysw5.Flush();

myns5.Flush();

ms5.Close();

mysw5.Close ();

myns5.Close ();

myclient5.Close ();

}

catch (Exception ex)

{

timer2.Enabled = false;

}

}

المشكله هي كالتالي ان الصوره لاتظهر في برنامج السيرفر

حسب فهمي ومحاولاتي تأكدت ان الكلاينت يستقبل الكلمه play ثم لايذهب للتايمر وقد جربت عمل MessageBox في بداية دالة تفحص الكلمه حيث تظهر الصوره فقط قبل أن تلغي الـ MessageBox اما عدا ذلك فلا تظهر وقد أرفقت نسخه من البرنامج لكي يتم التأكد من ذلك ومعرفتي أين الخطأ حيث أنني استخدمت TCP Remote Desktop لوضوح الصورة حيث أنني حاولت فيه لكن دون فائده وأنا متأكد أن الخطأ في برنامج الكلاينت لكن لم أستطيع تحديده لذا أرجوا منكم المساعده للضروره

E_Class.zip

سأصبر حتى يعجز الصبرُ عن صبري

وسأصبر حتى يأذن الله في أمري

وسأصبر حتى يعلم الصبرُ أني صبرتُ على شيئاٍ أمرُ من الصبرِ

#12

وين المشرف والمتميزين في هذا المنتدى الرجاء مساعدتي للضرورة.........

وشكراً

سأصبر حتى يعجز الصبرُ عن صبري

وسأصبر حتى يأذن الله في أمري

وسأصبر حتى يعلم الصبرُ أني صبرتُ على شيئاٍ أمرُ من الصبرِ

#13

أين المشرف فادي محمد الرجاء مساعدتي للضرورة.........

وشكراً

سأصبر حتى يعجز الصبرُ عن صبري

وسأصبر حتى يأذن الله في أمري

وسأصبر حتى يعلم الصبرُ أني صبرتُ على شيئاٍ أمرُ من الصبرِ

#14

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

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

هو انني ارسل رساله (كلمة Play)من السيرفر الى الكلاينت عبر منفذ محدد ثم يقوم الكلاينت بإستقبال الكلمه وتفحصها فإذا كانت Play يقوم الكلاينت بتشغيل الـ Timer حيث يشتغل التايمر ويرسل لبورت محدد آخر ( حيث ان السيرفر يتنصت لإستقبال رسائل منه حيث أن Thread يعمل في حدث الـ Load ) لكن لاتظهر الصوره لدى السيرفر فماهو الحل ؟ هل هناك علاقه بين الـ Thread والـ Timer شيبت برأسي هذه المشكله حيث أن المثال مرفق في الصفحة الأولى

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

بالنسبه يا أخي حسام فيصل للملفات المرفقه مع المثال الي وضعته لايمكنني إضافته في الـ Refrence فماهي المشكله من فضلك

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

أخيرا بالنسبة لبروتوكول TcpChannal هل يمكن مشاهدة أكثر من جهازين في نفس الوقت

هذا ولكم جزيل الشكر وخاصة القائمين على المنتدى وجزاكم الله خير

وشكرا........

سأصبر حتى يعجز الصبرُ عن صبري

وسأصبر حتى يأذن الله في أمري

وسأصبر حتى يعلم الصبرُ أني صبرتُ على شيئاٍ أمرُ من الصبرِ

هذا الموضوع مغلق.

مواضيع مشابهة