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

اسئلة في برمحة الشبكات

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

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

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

(اللغة المستخدمة – السي شارب)

من دروس الاخ فادي و من درس الاخ معتز شمس (فيديو)

الجزء الخاص ب Client 

CODE

using System.Net.Sockets;
using System.IO;

private void button1_Click(object sender, System.EventArgs e)
{
 try
 {

TcpClient myclient = new TcpClient ("127.0.0.1",5000); // الإتصال مع السيرفر
NetworkStream mynetsream = tcpclnt.GetStream (); 
StreamWriter myswrite = new StreamWriter (mynetsream);
mynetsream .WriteLine(txt_msg.Text);
myswrite.Close ();
mynetsream .Close ();
myclient.Close ();

 }
 catch (Exception ex)
 {
   MessageBox.Show (ex.Message );
 }
 }




الجزء الخاص ب Server

CODE

using System.Net.Sockets;
using System.IO;

TcpListener mytcpl; // Objects  Declaration 
Socket mysocket;
NetworkStream myns;
StreamReader mysr;
mytcpl = new TcpListener (5000); // Open The Port
mytcpl.Start ();// Start Listening on That Port
mysocket = mytcpl.AcceptSocket (); // Accept Any Request From Client and Start a Session
myns = new NetworkStream (mysocket);// Receives The Binary Data From Port
mysr = new StreamReader (myns); // Convert Received Data to String
MessageBox.Show (mysr.ReadLine()); // Print The Message
mytcpl.Stop(); 

يفضل اضافة هذه الميثود عند الحدث الخاص بإغلاق البرنامج
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
 try
 {
  mytcpl.Stop ();
  Application.Exit();
 }
 catch (Exception ex) {MessageBox .Show (ex.Message );}
 }

برنامج خادم/عميل بسيط ،

البرنامج واضح ،

لكن عند القراءة في الكتب و المصادر ،

شيء مثل هذا

Here’s a sample of C# server code that sets up the necessary socket pieces:
IPHostEntry local = Dns.GetHostByName(Dns.GetHostName());
IPEndPoint iep = new IPEndPoint(local.AddressList[0],
			 8000);
Socket newserver = new Socket(AddressFamily.InterNetwork,
	SocketType.Stream, ProtocolType.Tcp);
newserver.Bind(iep);
newserver.Listen(5);
Socket newclient = newserver.Accept();

جزء خاص ببرنامج سيرفر بسيط ،

لكن الطريقة مختلفة ،

تم استخدام دوال ال Bind و ال Listen ،

اين هذه الدوال في الطريقة الاولى ؟

و لم هذا الاختلاف ؟؟

هل نستطيع القول انه هناك طريقتين لبرمجة الشبكات ؟

في الطريقة الاولى استخدمنا ما يسمى ب C# Socket Helper Classes

ارجو التوضيح .

--

و شي ثاني

هنا كود اخر مماثل للطريقة الاولى

TcpClient newclient = new TcpClient("www.isp.net", 8000);
NetworkStream ns = newclient.GetStream();
byte[] outbytes = Encoding.ASCII.GetBytes("Testing");
ns.Write(outbytes, 0, outbytes.Length);
byte[] inbytes = new byte[1024];
ns.Read(inbytes, 0, inbytes.Length);
string instring = Encoding.ASCII.GetString(inbytes);
Console.WriteLine(instring);
ns.Close();
newclient.Close();'

لماذا في المثال الاول ، (مثال الاخ فادي )

لم نستخدم عمليات ال Encoding ؟؟

شي اخير ،

في مثال الاخ فادي ،

لنقل الرسالة استخدمنا

NetworkStream mynetsream = tcpclnt.GetStream (); 
StreamWriter myswrite = new StreamWriter (mynetsream);

و لكن عند نقل ملف (صورة مثلا )

يكون العمل هكذا

Stream fileStream = File.OpenRead(tbFilename.Text);
// Alocate memory space for the file
byte[] fileBuffer = new byte[fileStream.Length];
fileStream.Read(fileBuffer, 0, (int)fileStream.Length);
// Open a TCP/IP Connection and send the data
TcpClient clientSocket = new TcpClient(tbServer.Text,8080);
NetworkStream networkStream = clientSocket.GetStream();
networkStream.Write(fileBuffer,0,fileBuffer.GetLength(0))

لماذا هنا لم نستخدم StreamWriter ؟

و تعاملنا مباشرة مع ال NetworkStream

==

كنت اتمنى لو اني كنت موجود ايام بداية دورة الاخ فادي .

جزاكم الله كل خير ،

/index.php/topic/264448-%D8%A7%D9%84%D8%A8%D8%AF%D8%A7%D9%8A%D8%A9-%D9%85%D8%B9-%D8%A7%D9%84%D8%A7%D9%86%D8%AF%D8%B1%D9%88%D9%8A%D8%AF/

 

اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ

#2

السلام عليكم اخي العزيز

بانسبة للـHelper Classes فيمكنك استخدامها بشكل مباشر إذا اردت ابسط طريقة لتعامل مع الـSocket وفي العادة نضع مثال يستخدم الـHelper Classes في الدروس الأولى لتعلم Socket ولديك خيارين اما استخدام الـHelper Classes او الـSocket Class والذي يأتي معه كل ما له علاقة بلإتصال وسأبين لك ذلك

إذا اردت التعامل مع الـSocket لإرسال Text,Image عبر TCP أو UDP وبستخدام IPv4 وبدون خيارات اخرى فيمكنك استخدام الـHelper Clases

اما إذا اردت التعمق اكثر واستخدام الـSocket كمثال لإرسال بيانات ICMP او عبر IPv6 أو غيره الكثير فلا بد من استخدام Socket Class

وتشبه Helper Class لسوكت الـWinsock التي كان يتم التعامل معها في السابق في vb إذ تعطيك خيارات محدودة جدا ولكن تسهل على المبرمج التعامل مع الsocket api الخاصة بالـ windows بخيارات محدودة جدا.

بانسبة لسؤالك الأخير فاستخدام الـStreamreader و writer يتم فقط في التعامل مع النصوص اي لنقل text فقط ولا نحتاج عند استخدامها التعامل مع الـencoding والسبب انك تنقل النص كـStream وبدون الحاجة لتقطيعه كـBytes فلا تحتاج لإعادة الـEncoding

والسبب في التعامل مع الـNetworkStream لنقل صورة هو ان هذا الـClass يستخدم لنقل Binary Stream عبر الشبكة ولإرسال صورة عبر TCP لن نحتاج إلى إعادة تكوينها كـByte لأن TCP هو Streaming protocol بعكس الـUDP والذي ينقل البيانات كوحدة واحدة على شكل Bytes (حلت هذه المشكلة لاحقا مع الـUDP باتعامل مع الـRTP ) ولهذا فإنه في حالة الإرسال عبر الـTCP فيمكنك ارسال البيانات كـStream و كـBytes اما في حالة التعامل مع الـUDP فلا يمكنك إلا الإرسال كـBytes وهذا هو ملخص الحديث. لتعمق اكثر في هذا الموضوع انصحك بقرائة الكتاب (احترف برمجة الشبكات والنظم الموزعة) واهلا وسهلا بك

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

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