اتصال دو کامپیوتر در شبکه با سی شارپ (۴)

در آخر پست قبلی براتون توضیح دادم که سرور برای اتصال به هر کلاینت یک خط ارتباطی جدا لازم دارد ، برای فهم این قضیه و کاربرد متد Accept از مثال مرکز تلفن 118 استفاده میکنم ، مرکز تلفن 118 را در نظر بگیرید ، در ظاهر فقط یک تلفن 118 وجود دارد و این خیلی بدیهی است که از هرجایی کافی است فقط 118 را بگیریم ، این لفظ کلی تلفن 118 ، مثل همان شیء سوکت اصلی سرور میماند که خودمان در سرور با New آن را میسازیم .
ولی بعد هرکس با 118 تماس میگیرد ، به یک اپراتور مجزا و یک گوشی تلفن مجزا وصل میشود ، شماره تماس همه گوشی های تلفن مرکز،همان 118 است ولی مثل تماس گیرنده،اینجا یک گوشی وجود ندارد . اگر یک گوشی در 118 باشد ، طبیعی است که همه صحبتهای تماس گیرنده و همه جوابهای مرکز قاطی میشوند.
متد Accept مسئول برداشتن گوشی جدید در سرور و ایجاد یک خط ارتباطی مستقل است.
با فراخوانی این متد ریسمان شما بلوکه و متوقف میشود تا اولین درخواست برقراری ارتباط از یک کلاینت برسد ( پس اگر برنامتون از یک ریسمان یا thread استفاده کند،تا زمانی که درخواست برقراری ارتباط برسد قفل میکند ،من خودم برای فرار از این مشکل از برنامه نویسی چند نخی یا multi threading استفاده میکنم البته راههای دیگه ام است) ، به محض رسید درخواست ، متد Accept ارتباط را میپذیرد و آن را برقرار میکند و یک نمونه جدید از شیء سوکت به ما میدهد که این نمونه فقط مخصوص ارتباط ما با آن یک کلاینت است . یعنی تمام گرفتن و ارسال اطلاعات ما به یک کلاینت خاص باید توسط این نمونه سوکت جدید انجام شود .
در زیر یک مثال ساده مشاهده میکنید که وقتی اولین درخواست برقراری اتصال از یک کلاینت به آن میرسد آن را Accept و به وسیله ی متد Send ( که بعدا به طور کامل آن را توضیح میدهم و فقط فعلا بدونید برای ارسال اطلاعات ازش استفاده میشه و باید اطلاعات را اول به آرایه ای از بایت تبدیل کنیم بعد به عنوان پارامتر به آن ارسال کنیم ) یک پیام Hi به کلاینت ارسال میکند و در آخر هم اتصال را قطع می نماید .

     IPAddress ip = IPAddress.Parse("192.168.1.2");
     IPEndPoint IpPort = new IPEndPoint(ip, Convert.ToInt32("12345"));
     Socket main_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     main_socket.Bind(IpPort);
     main_socket.Listen(int.MaxValue);
     Socket client= main_socket.Accept();
     byte[] msg = System.Text.Encoding.UTF8.GetBytes("Hi");
     client.Send(msg);
     client.Close();

اگر میخواهید به جای اینکه برنامه فقط به اولین درخواست فقط جواب بده به همه درخواست ها رسیدگی کند ، از یک حلقه ی بینهایت استفاده میکنیم که همیشه ادامه داشته باشد ، مانند زیر :

     IPAddress ip = IPAddress.Parse("192.168.1.2");
     IPEndPoint IpPort = new IPEndPoint(ip, Convert.ToInt32("12345"));
     Socket main_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     main_socket.Bind(IpPort);
     main_socket.Listen(int.MaxValue);
     while (true)
     {
            Socket client = main_socket.Accept();
            byte[] msg = System.Text.Encoding.UTF8.GetBytes("Hi");
            client.Send(msg);
            client.Close();
     }

الان شما به طور کامل نحوه ی ساخت سوکت و برنامه نویسی برای اتصال در 2 سمت ( سرور و کلاینت )  را یاد گرفته اید،تنها چیزی که باقی مانده آموزش 2 متد دیگر به اسم های Send ( که در بالا مثال های بالا از آن استفاده کردید ) و Receive ، این 2 متد همانطور که از اسمشون پیداست برای ارسال و دریافت اطلاعات بکار میروند . سعی میکنم برای اینکه دیگه در فهم و استفاده از کد ها مشکلی نداشته باشید یک نمونه برنامه از هر سمت ( یعنی یک برنامه کلاینت و یک برنامه ی سرور ) برایتان درست کنم که هر پیامی را که خواستید از سمت سرور به کلاینت بفرستید و در برنامه کلاینت پیام دریافت شده را مشاهده کنید .

ارسال شده در سوکت نویسی, همه ی موضوعات | 10 پاسخ

اتصال دو کامپیوتر در شبکه با سی شارپ (۳)

خب در حالا با ساخت سوکت به بخش اتصال میرسیم ، که 2 تا متد برای اتصال وجود دارد Connect و Bind ، هر دوی این متدها یک پارامتر ورودی میگیرند که IPEndPoint میباشد .

1- Bind : با متد Bind که در سمت سرور استفاده میکنیم به سیستم عامل اطلاع میدهیم که تمام درخواست های مربوط به IP و Port داخل IPEndPoint را به برنامه ی ما تحویل دهد .

2- Connect : با متد Connect که در سمت کلاینت استفاده میکنیم به سیستم عامل میگوییم که ما را به سوکتی با IP و Port داده شده متصل کن [ با استفاده از Connect دیگر لازم نیس از Bind در کلاینت استفاده شود ] .

بدیهی هست که همیشه اتصال برقرار نمیشود و احتمال دارد خطاهایی مانند اشکال در ارتباطات شبکه،استفاده سوکت دیگر از پورت و …  پیش بیاید .

بعد از اتصال وقتی که اطلاعات ارسال و دریافت شد و دیگر کارمان با سوکت به پایان رسید باید ارتباط را قطع کنیم ، که با متد های Close و Shutdown اینکار را میشود انجام داد . متد Close بطور کامل ارتباط را قطع میکند و به نوعی نابود میکند اما متد Shutdown یک پارامتر بعنوان ورودی از نوع System.Net.Sockets.SocketShutdown دارد که میتوان خط ارسال و دریافت را جداگانه بست . زمانی که یک سر سوکت بسته شود ، اطلاعات جدیدی که دریافت میشود با طول صفر بایت است ،یعنی اگر اطلاعاتی با تعداد بایت صفر دریافت شود دیگر در سمت مقابل سوکتی وجود ندارد .

در برنامه هایی که بسته شدن کامل و ایمن دو سوکت برایشان مهم است از Shutdown استفاده میکنند،اول Shutdown را با Send اجرا میکنند و منتظر رسیدن پیام از سمت سوکت دیگر میشوند و بعد کامل سوکت را میبندند اما بیشتر اوقات یک Close کافیه .

استفاده از متد Bind و Connect را در زیر مشاهده میکنید :

     IPAddress ip = IPAddress.Parse("192.168.1.2");
     IPEndPoint IpPort = new IPEndPoint(ip, Convert.ToInt32("12345"));
     Socket main_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     main_socket.Bind(IpPort); 

            ////////////////////////////////////////////////////////////////////

    IPAddress ip = IPAddress.Parse("192.168.1.2");
    IPEndPoint IpPort = new IPEndPoint(ip, Convert.ToInt32("12345"));
    Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    socket.Connect(IpPort);

استفاده از متد های Close و Shutdown برای قطع ارتباط :

    socket.Close();
    socket.Shutdown(System.Net.Sockets.SocketShutdown.Both);

دیگه فعلا با سمت کلاینت کاری نداریم ، بعد از استفاده از متد Connect در سمت کلاینت ، کلاینت آماده ارسال و دریافت اطلاعات است . معمولا برنامه نویسی برای سمت کلاینت ساده و بیشتر بیچیدگی ها بر روی دوش سرور است ، برای اینکه معمولا کلاینت به یک سرور متصل میشه اما یک سرور در یک لحظه باید با ده ها کلاینت ارتباط برقرار کند ، اطلاعات را دریافت و پاسخ مناسب را به هر درخواست بدهد .

برای سمت سرور باید 2 متد دیگر هم یادبگیرید که یکی از آنها Listen و دیگری Accept است . متد Listen برای پذیرفتن درخواست های اتصال کلاینت ها تعدادی صف مشخص میکند که ما  معمولا برای اینکه بعدها اگه شبکه گسترش پیدا کرد یا … به مشکل بر نخوریم مقدار ماکزیمم را به عنوان پارامتر به آن ارسال میکنیم . همانطور که در بالا گفتم چون سرور همزمان به تعدادی کلاینت مختلف باید متصل شود برای هرکدام از آنها به یک خط ارتباطی جداگانه نیاز دارد .

ارسال شده در سوکت نویسی, همه ی موضوعات | پاسخ دهید:

تفاوت های بین استراکچر و کلاس در سی شارپ

یکی از موضوعات گیج کننده برای کسایی که دارن تازه سی شارپ یاد میگیرن تفاوت استراکچر با کلاس هست و اینکه  کجا از کدامشان ( استراکچر ، کلاس ) استفاده شود بهتر است . امروز توو این پست یه جدول براتون آماده کردم، که میتونید تفاوت ها را مشاهده کنید :

Structure

Class

در سی شارپ یک استراکچر با لغت کلیدی struct تعریف میشود ، برای مثال :

Public struct stu { … }

در سی شارپ یک کلاس با لغت کلیدی class تعریف میشود ، برای مثال :

Public class stu { … }

یک استراکچر value type است و شیء بوجود آمده از آن در Stack ذخیره میشود . یک کلاس  reference typeاست و شیء بوجود آمده از آن در Heap ذخیره میشود .
یک استراکچر اصلا  نمیتواند ارث بری کند یک کلاس میتواند از کلاس یا استراکت دیگری ارث بری کند
یک استراکچر زمانی که از آرایه ها استفاده میشود مناسب تر است . یک کلاس زمانی که از collections ها استفاده میشود مناسب تر است .
در یک استراکچر نمیتوان به متغیرهای نمونه و عضو مقدار اولیه داد . در یک کلاس میتوان به متغیر های نمونه و عضو مقدار اولیه داد .
یک استراکچر نمیتواند دارای هرگونه سازنده ی بدون پارامتر یا یک سازنده پیشفرض که CLR فراهم کرده باشد. همچینین از destructor ها هم پشتیبانی نمیکند . یک کلاس میتواند دارای سازنده ی پیشفرض بدون پارامتر باشد که بوسلبه CLR فراهم شده و همچین destructor ها را پشتیبانی میکند .
یک استراکچر میتواند بدون کلمه کلیدی new ساخته شود ، برای مثال :

Stu test_obj ;

یک کلاس نمیتواند بدون کلمه کلیدی new شیء ایجاد کند . برای مثال :

stu test_obj = new stu(code_s,name_s);

منبع : ترجمه مقاله ی سایت ucertify

ارسال شده در ساختمان داده, مبانی برنامه نویسی, نکات آموزنده و مفید, همه ی موضوعات | 7 پاسخ

ارتباط با دیتابیس

خب در آموزش قبلی با طرز ساخت دیتابیس و جدول آشنا شدید ، اما برای اینکه بخواهید از اطلاعات داخل دیتابیس و جدول ها استفاده کنید ، اولین کار اتصال به دیتابیس هست . همانطور که دیدید بعد از اینکه دیتابیس را در آموزش قبلی ساختید همزمان با دیتابیس فایل های دیگری هم به پروژه اضافه میشه که یکی از آنها app.config  بود ، در این فایل خود ویژوال استدیو connection string را قرار میدهد،که طریقه استفاده از app.config را در همین وبلاگ موجود است . البته میتوانید خودتان هم بطور دستی آن  را بنویسید ،  connection string  یک رشته متنی است که تنظیمات اتصال را مشخص میکند و از یه سری کلمات کلیدی تشکیل شده است مانند نام سرور،نام دیتابیس ، مسیر دیتابیس و …  . شما میتوانید در عکس زیر connection string ذخیره شده برای اتصال به دیتابیس را داخل app.config مشاهده کنید [ مستطیل مشکی ] .

به کلمات کلیدی به کار رفته در آن دقت کنید، در زیر میتوانید وظیفه ی هریک را مشاهده کنید :

   connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True";

Data Source : در مقابل data source باید نام یا آدرس شبکه نسخه ی sql server که از آن میخواهید استفاده کنید بنویسید ، چون دیتابیس ما بصورت محلی ( Local ) است ما در اینجا به جای نام سرور از یک نقطه ( . ) استفاده کردیم ، اما اگر دیتابیس بر روی شبکه باشد باید نام آن سرور را هم بنویسیم . کلمات کلیدی Address یا Server یا Network address هم معادل همین Data source هستن و میتوانید جای هم از آنها استفاده کنید .

AttachDbFilename : در مقابل این کلمه کلیدی مسیر دیتابیس را بطور کامل قرار میدهیم .

Integrated Security : اگر مقدار آن را برابر false قرار دهیم باید حتما در connection string یوزرنیم و پسورد را برای استفاده از دیتابیس در connection string ذکر کنیم . اگر ture ( یا sspi )باشد از اکانت ویندوز برای اعتبار سنجی استفاده میشود (سایت MSDN مقدار true را شدیدا توصیه کرده) .

User Instance : این لغت کلیدی هم مشخص میکنه آیا میخوایم به جای اتصال به نسخه پیشفرض sql به نسخه که در حالت اجرا مشخص کردیم متصل شویم یا نه ؟!    [ *کاربرد اینو خودم مطمئن نیستم ، اگه اشتباه گفتم توو نظر ها بگید ;) ]

غیر از اینها باز هم میشود در connection string کلمات کلیدی دیگری بکار برد مثلا UID و PWD برای تعیین یوزرنیم و پسورد ،  Initial Catalog یا Database برای تعیین نام دیتابیس ، Timeout یا Connection Timeout برای تعیین مدت زمان انتظار برای برقراری اتصال به سرور استفاده میشود،اگر از این زمان بیشتر شود دیگه برای اتصال تلاشی صورت نمیگیرد و خطا بوجود می آید . حالا که فهمیدید connection string چیست بصورت زیر با کمک کلاس SqlConnection میتوانید به دیتابیس متصل شوید .

   string connectionString="Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\Database.mdf;Integrated Security=True;User Instance=True";
   SqlConnection a = new SqlConnection(connectionString);

#توجـــــــــــــــــــــــــه : استفاده از  ’ \ ‘ در یک رشته متنی شما را با خطا مواجه میکند ، برای همین باید بصورت ‘ \\ ‘ از آن در مسیر دادن به data source و attachDbFilename استفاده کنید .

ارسال شده در دیتابیس, همه ی موضوعات | پاسخ دهید:

Value vs Reference Types ( قسمت اول )

مقدمه :

یکی از مشکلاتی که برای برنامه نویس هایی که از ویژوال بیسیک 6 و جاوا به سی شارپ کوچ کرده اند اتفاق میافتد،عدم توانایی در تفکیک value type ها و refrence type ها است . در واقع سی شارپ دارای دو type به نام های class و struct که تقریبا شبیه هم هستند به جز اینکه یکی refrence type و دیگری value type است . این مقاله به کشف تفاوت های اساسی این دو میپردازد .

در این مقاله فرض شده است که شما دارای دانش پایه ای سی شارپ هستید و توانایی تعریف class ها و property  ها را دارید .

اولین قدم،struct ها چیستند ؟

ساده ترین تعریف برای struct نمونه برش سطح پایین از class ها است ، class ها را بدون پشتیبانی از ارث بری و finilizer ها در نظر بگیرید . struct ها همانند class ها تعریف میشوند ( بغیر از اینکه از کلمه کلیدی struct در آن استفاده میشود ) . struct ها میتوانند شامل فیلد ها ، متدها ، property ها و عملگر ها باشند،در زیر نمونه این از تعریف struct را مشاهده میکنید :

struct Point
{
   private int x, y;             // private fields
 

   public Point (int x, int y)   // constructor
   {
         this.x = x;
         this.y = y;
   }
   public int X                  // property
   {
         get {return x;}
         set {x = value;}
   }
   public int Y
   {
         get {return y;}
         set {y = value;}
   }
}

value type and refrence type
تفاوت دیگری در بین struct ها و class ها وجود دارد و دانستن آن نیز بسیار مهمه اینه که struct ها vlue type هستند در حالی که class ها refrence type اند و ارتباط با این دو در زمان اجرا از راه های متفاوت است .زمانی که نمونه ای value type ساخته میشود ، فضای کوچکی در حافظه به برای ذخیره مقدار آن اختصاص داده میشود . نوع های اصلی از قبیل int,float,bool,char جزء value type ها هستند و به یک صورت کار میکنند . وقتی که در زمان اجرا با یک value type ارتباط برقرار میشود ، این ارتباط مستقیما با داده اصلی برقرار شده و این نوع ارتباط خیلی سودمند است،مخصوصا برای نوع های اصلی .
ولی درrefrence type ها یک شیء در حافظه ساخته میشود،و سپس دستگیره آن (handled) از طریق مرجعی که مانند pointer نیست،در دسترس هست . فرض کنید Point یک struct و Form یک class است . و ما از هرکدام مانند زیر نمونه سازی کردیم :


Point p1 = new Point();         // Point is a *struct*
Form f1 = new Form();           // Form is a *class*

در مورد خط اول ،یک فضا در حافظه به p1 اختصاص داده میشود ، در حالی که در خط دوم 2 فضا تخصیص دهی میشود : یکی برای Form و دیگری برای refrence (مرجع) آن که f1 است . اگه ما خط دوم را طولانی تر و کامل تر بنویسیم این قضیه قابل درک میشود :


Form f1;                        // Allocate the reference
f1 = new Form();                // Allocate the object

اگر ما این دو شیء را در متغیر های جدید کپی کنیم :


Point p2 = p1;
Form f2 = f1;

P2 یک struct است که یک کپی مستقل با فیلد های جدا و مربوط به خودش از p1 هست. اما در مورد f2 همه آنچه ما کپی کردیم یک refrence است که در نتیجه هر دوی f1 و f2 به یک شیء اشاره میکنند . بخشی از بهره این کارها در ارسال پارامتر ها به متد ها است ، پارامتر ها بطور پیشفرض از طریق مقدار(value) ارسال میشوند یعنی بطور ضمنی کپی آنها ارسال میشود . برای پارامتر هایی که از نوع value type اند،این یعنی اینکه بطور فیزیکی از نمونه کپی گرفته میشود ( در مثال ما p2 کپی میشود ) ، در حالی که refrence type ها مرجع را کپی میکنند ( در مثال ما f2 پی میشود ) . به مثال زیر توجه کنید :


Point myPoint = new Point (0, 0);      // a new value-type variable
Form myForm = new Form();              // a new reference-type variable
Test (myPoint, myForm);                // Test is a method defined below

void Test (Point p, Form f)
{
      p.X = 100;                       // No effect on MyPoint since p is a copy
      f.Text = "Hello, World!";        // This will change myForm’s caption since
                                       // myForm and f point to the same object
      f = null;                        // No effect on myForm
}

زمانی که f را با مقدار null مقدار دهی کنید هیچ اثری ندارد،زیرا f یک کپی از مرجع است که ما آن را پاک کردیم .
ما میتوانیم با اصلاح کننده ref نوع پارامتر را عوض کنیم،زمانی که پارامتر را از طریق “refrfenec” ارسال کنیم ، متد به طور مستقیم از مقدار فراخوانی شده استفاده میکند . در مثال زیر ، شما فکر میکنید که پارامتر های p و f با myPoint و myForm جابه جا میشوند :


Point myPoint = new Point (0, 0);      // a new value-type variable
Form myForm = new Form();              // a new reference-type variable
Test (ref myPoint, ref myForm);        // pass myPoint and myForm by reference

void Test (ref Point p, ref Form f)
{
      p.X = 100;                       // This will change myPoint’s position
      f.Text = “Hello, World!”;        // This will change MyForm’s caption
      f = null;                        // This will nuke the myForm variable!
}

در این مورد با مقدار دهی null در f ، myForm نیز null میشود ، چون در اینجا ما با مرجع اصلی ارتباط داشتیم نه یک کپی از آن .

ارسال شده در ساختمان داده, مبانی برنامه نویسی, نکات آموزنده و مفید, همه ی موضوعات | 4 پاسخ

آموزش استفاده از app.config (خواندن و نوشتن)

NET. راه بسیار ساده ای را برای ذخیره تنظیمات برنامه داخل Application Configuration File در اختیار ما قرار داده است . براحتی میتوان از طریق جفت های key-value اطلاعات را ذخیره کرد .
برای مثال فرض کنید در جایی مجبورید از یک Data source در برنامه خود استفاده کنید . اگر شما اطلاعات این Data source را در داخل کد هایتان قرار دهید ، زمانی که لازم باشد این اطلاعات را تغییر دهید مجبورید داخل کد هایتان بگردید و آنها را تغییر دهید و دوباره برنامه را کامپایل کنید . این به یک مشکل تبدیل میشود زمانی که شما برنامه را به یک مشتری تحویل میدهید .
در روزهای قبل برنامه نویسان این اطلاعات را در فایل های خاصی که به آن ini. گفته میشود یا registry ذخیره میکردند . برنامه میتواند اطلاعات تغییر داده شده در فایل های ini. و registry را بدون نیاز به کامپایل مجدد بخواند .
اما باز کردن registry و گشتن برای یافتن اطلاعات مخصوص به برنامه و تغییر دادن آن ها بیشتر زمان ها کاری زجرآور است . حتی ممکن است شما اشتباهی اطلاعات یک برنامه دیگر را عوض کنید و سیستم از کار بیافتد . در واقع ، مدیرهای سیستم های امن ، بیشتر اوقات دسترسی به registry را برای کاربرها قطع میکنند و اجاز تغییر آن را نمیدهند .
اینجاست که راه ساده NET. به کمک ما می آید و آن Application Configuration File است . هر برنامه میتواند یک فایل تنظیمات داشته باشد که در حقیقت این فایل تنظیمات یک فایل XML هست . شما میتوانید آن را به یک ویراشگر متن ساده همانند Notepad ویرایش کنید . برنامه اطلاعات را از داخل این فایل میخواند و هربار که Data source را عوض کردید لازم به تغییر کدهای برنامه نیست .

در برنامه های ویندوز به طور اتوماتیک Configuration File ساخته نمیشود و برای اضافه کردن آن در Solution Explorer کلیک راست کرده و در مسیر زیر  بر روی Application Configuration File کلیک کرده :

Add –>new items … –> Application Configuration File

دکمه add کلیک کنید ،حالا در مسیر اصلی برنامه فایل app.config ساخته میشود . ویژوال استدیو برای Configuration File های پیشفرض از نام app.config استفاده میکند . بطور پیشفرض داخل یک app.config کد های زیر هست :

<?xml version="1.0" encoding="utf-8" ?> 

<configuration>
</configuration>

برای ذخیره مقدار ها در فایل تنظیمات ، مانند زیر باید عمل کنید :

<?xml version="1.0" encoding=    "utf-8" ?>

مثال زیر را ببینید :

<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="DatabasePath" value="c:\\projects\data\spider.mdb" /> <add key="SupportEmail" value="webmaster-1@dotnetspider.com" /> </appSettings> </configuration>

خب حالا system.configuration.dll را به رفرنس های برنامه add کنید و ;using System.Configuration را بالا کد هایتان اضافه کنید . با  استفاده از ConfigurationManager میتونید به تگ های فایل تنظیماتتون دسترسی داشته باشد . داخل این دوتا هم [] key ها را مینویسیم ، مانند زیر :

string DatabasePath = ConfigurationManager.AppSettings["DatabasePath"];
string SupportEmail = ConfigurationManager.AppSettings["SupportEmail"];
MessageBox.Show(DatabasePath+" "+SupportEmail);

به پایان این آموزش رسیدیم . لازم است ذکر کنم منابعی ازشون کمک گرفتم و این پست را از ترکیبشون ترجمه کردم چند سایت متفرقه در گوگل و سایت codeproject بوده است .

ارسال شده در نکات آموزنده و مفید, همه ی موضوعات | 3 پاسخ

اتصال دو کامپیوتر در شبکه با سی شارپ (۲)

خب بعد از توضیحات مقدماتی در پست قبل باید یک نکته ای را بگم،و اون اینه که اگر میخوای یه برنامه برای یک شبکه بنویسید که فقط دیتابیس دارد لازم نیست به یادگیری TCP و … بپردازید به راحتی میتوانید با یک SQL Sever و دادن آدرس سرور درون  Connection stringبرنامتون را روی یک شبکه اجرا کنید . اینکار خیلی اصولی تر ، منطقی تر و امن تر هست .

برای یادگیری مقدمات TCP یک مثال ساده را با هم شروع به ساختن میکنیم ، این مثال از دو برنامه تشکیل شده است :

1-      سرور : که منتظر میشود تا کلاینت باهاش ارتباط برقرار کند و بعد یک پیام را به کلاینت ارسال میکند.

2-      کلاینت : که باید به سرور وصل شود و پیامی را که سرور ارسال میکند دریافت کند .

در این دو برنامه نقاط مشترک زیادی هست که ابتدا با هم آنها را مرور میکنیم و یک سری مفاهیم اولیه را برایتان توضیح میدهم .

اولین کاری که باید بکنید این هست که این دو تا using زیر را به بالای برنامتون اضافه کنید تا بتوانید از کلاس هایی که در این مثال بکار برده شده استفاده کنید .

using System.Net;

using System.Net.Sockets;

در  برقراری ارتباط بین کلاینت و سرور در هر سمت یک سوکت باید ساخت،سوکت ها مانند ترمینال (یک پایانه ورودی و خروجی اطلاعات) هستند ، و برای ارتباط بین این سوکت ها  باید از IP و PORT استفاده کرد .

با استفاده از کلاس IpAderess میتوانید IP ها را نگهداری کنید مانند دو روش زیر :

IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });
IPAddress ip = IPAddress.Parse("127.0.0.1");


برای اتصال به یک سوکت همانطور که در بالا گفتم به IP و PORT به طور همزمان نیاز داریم ، پس از کلاس IPEndPoint مانند زیر استفاده میکنیم ، ورودی اول آن IP و ورودی دوم PORT است . این کلاس یک آدرس کامل به ما میدهد که هم PORT دارد و هم IP و برای اتصال به سوکت ها استفاده میکنیم .

IPAddress ip = IPAddress.Parse("127.0.0.1");
IPEndPoint iEp = new IPEndPoint(ip, 12345);


الان ما IP و PORT را توانستیم در یک شیء از کلاس IPEndPoint ذخیره کنیم ، حالا باید یک سوکت بسازیم . برای ساخت سوکت به 3 پارامتر ورودی نیاز داریم ، پارامتر اول ساختار IP را نشان میدهد و ما از InterNetwork استفاده میکنیم که برای IPv4 است ، پارامتر دوم نوع انتقال را مشخص میکند که برای TCP از Stream استفاده میکنیم و پارامتر آخر هم نوع پروتکل را مشخص میکنه ما بدیهی است آن را TCP انتخاب میکنیم . مانند زیر :

Socket socket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);

تا الان سوکت ساختن را یادگرفتید در پست بعدی متد های برقراری اتصال و گوش دادن برای برقراری اتصال کلاینت ها به سرور را آموزش میدهم،به امید دیدار دوباره :)

ارسال شده در سوکت نویسی, همه ی موضوعات | 4 پاسخ

آموزش ساخت دیتابیس و جدول به صورت تصویری

در این بخش به آموزش sql می پردازیم ، البته اول یک آموزش مختصر در مورد ساخت دیتابیس و جدول ها میدهم اما حتما برای اطلاعات کامل تر به کتاب های مختلف که در مورد دیتابیس هست رجوع کنید چون این موضوع حداقل یه کتاب 300 یا 400 صفحه ای لازم داره تا بشه روابط بین جدول ها،کلید،قیود، … را بیان کرد .

خب حالا آموزش را شروع میکنیم ، برای ساخت یک دیتابیس کافی است در پنجره solution explorer کلیک راست کنید از منویی که باز میشه برروی  Add بروید و گزینه new item را انتخاب کنید ، حالا پنجره کوچکی مانند شکل زیر باز میشود.

عکس شماره ( 1 )

برروی sql database (که در شکل با شماره 1 مشخص شده ) کلیک کنید و در کادر پایین (شماره 2 در شکل ) اسم آن را بنویسید و دکمه Add (شماره 3 ) را بزنید . بعد از زدن دکمه Add پنجره ای به شکل زیر باز میشود .

عکس شماره ( 2 )

بعدا در مورد این پنجره توضیح میدم،فعلا با این پنجره کار نداریم،بر روی دکمه Finish (در شکل شماره 4) کلیک کنید . بعد از بسته شدن شما حالا در پنجره Solution Explorer شما 3 فایل جدید مشاهده میکنید که در شکل زیر با شماره 5 مشخص شده اند .

عکس شماره ( 3 )

از فایل اول که نامش app.config هست در آموزش بعدی استفاده میکنیم و توضیحات را آنجا میدهم ، فایل بعدی فایلی است با پسوند mdf. که دیتابیس شما هست،چون به فایل سوم اینجا احتیاج نداریم پاکش کنید،برای این کار بر روی فایل یا پسوند Xsd. رفته و کلیک راست میکنیم و Delete را بزنید . حالا برروی فایل دیتابیستون 2 بار کلیک کنید،به پنجره کوچیک به شکل زیر به نام Database Explorer روی جعبه ابزار ویژوال استدیو سمت راست باز میشود .

عکس شماره ( 4 )

بر روی Tabel (در شکل با شماره 6 مشخص شده ) کلیک راست کنید و Add New Tabel را انتخاب کنید . حالا در وسط یه صفحه به شکل زیر باز میشود که شما میتوانید در آن نوع فیلد و اسم فیلد را مشخص کنید .

عکس شماره ( 5 )

برای اینکه بیشتر با ساختار جدول ها آشنا شوید به عکس زیر دقت کنید،یک جدول از تعدادی فیلد (ستون ها ی جدول ) و تعدادی رکورد ( سطر های جدول ) تشکیل شده است،البته زمانی را که تازه جدول را ساخته اید رکوردی در آن ذخیره نشده است . بعد ها در مثال که اطلاعات هر فرد را در برنامه ذخیره میکنیم،اطلاعات هر نفر یک در یک رکورد مجزا ذخیره میشود . همانطور که در شکل بالا با مستطیل شماره 7 مشخص کردم دیدید،من 3 فیلد درست کردم به اسم ها id و name و family که نوع id را int و نوع دوتا فیلد دیگر را ntext قرار دادم تا بتوانم در آنها رشته نگهداری کنم .

عکس شماره ( 6 )

حالا بر روی علامت ضربدر در گوشه بزنید ، یه سوال از شما میپرسه که میخواهید جدول دخیره شود یا نه،شما بر روی yes کلیک کنید،بعد در پنجره بعدی اسم جدول را میپرسد،که میتونید بطور دلخواه هر نامی را خواستید به آن بدهید .

تبریک میگم شما الان اولین دیتابیس و جدول خود را ساختید در آموزش بعدی به آموزش ارتباط میان و برنامه و دیتابیس میپردازیم،به امید دیدار :)

ارسال شده در دیتابیس, همه ی موضوعات | پاسخ دهید:

اتصال دو کامپیوتر در شبکه با سی شارپ (۱)

در این پست نحوه ی چگونگی اتصال دو کامپیوتر در یک شبکه محلی یا اینترنت را میخوام آموزش بدم . برای انتقال اطلاعات در شبکه از دو پروتکل UDP یا TCP استفاده میشود ، من برای اینکه اندکی با تفاوت های این دو آشنا شوید 3 تا از تفاوت هاشون رو میگم ، اگر به اطلاعات بیشتری نیاز داشتید با اندکی جستجو در سایت Google میتوانید این اطلاعات را پیدا کنید ، 3 تفاوت عبارتند از :

1- اولین تفاوت این دو پروتکل در تحویل اطلاعات به کامپیوتر مقصد است ، در TCP کامپیوتر فرستند تا از سالم رسیدن اطلاعاتی که فرستاده مطمئن نشود ، اقدام به ارسال داده جدیدی نخواهد کرد . اما UDP به رسیدن اطلاعات کاری ندارد،و پشت هم داده ها را ارسال میکند،حتی احتمال دارد از 10 بایتی که ارسال میکند 1 بایت آن را هم مقصد دریافت نکند .

2- دومین تفاوت در سرعت انتقال اطلاعات است ، با توجه به توضیحات قبل بدلیل اینکه TCP باید مطمئن بشه اطلاعات به مقصد رسیده در نتیجه اینکار باعث کند شدن آن میشود . بدیهی است که با توجه به همان توضیحات قیل UDP سرعت بالاتری از TCP دارد .

3- حتما خودتون با خواندن تفاوت 1 به این نتیجه رسیدید که از TCP برای ارسال اطلاعات مهم و از UDP برای اطلاعاتی که سرعت رسیدن آن به مقصد مهمتر از سالم رسیدن آن است استفاده میکنیم . برای مثال از TCP برای انتقال اطلاعات به دیتابیس ها و از UDP برای دیدن فیلم ها آنلاین

خب با توضیحات مختصری که در بالا دادم در قسمت بعدی مقدمات اتصال دو کامپیوتر با استفاده از پروتکل TCP را شروع خواهم کرد . اگر در آینده زمانی بود و زنده بودیم UDP را هم آموزش میدهم .

ارسال شده در سوکت نویسی, همه ی موضوعات | پاسخ دهید:

#C چیـــــست ؟؟؟!!

به نام خدا

سلام دوستان !

اولین پست این وبلاگ را برای جواب دادن به سوال “#C چیست؟؟؟!!” اختصاص میدهم، من خودم هیچوقت علاقه این به این بخش ندارم اما خب دانستن بعضی نکات حتی با وجود اینکه خسته کننده هست،بسیار لازمه .

در سال 1999 طراح زبان دلفی ، سرپرستی گروهی برای ساخت زبان Cool را به عهده گرفت ، لغت Cool مخفف C like Object Oriented language است . اما در سال 2000 که ماکروسافت این پروژه را عمومی کرد به علت اینکه این نام برای اهداف تجاری مناسب نبود ، آن را به #C یعنی همان نامی که ما میشناسیم تغییر دادند . #C از کتابخانه های از پیش تعریف شده در چارچوب net. استفاده میکنه از این جمله می‌توان به واسط‌های گرافیکی کاربر، دسترسی به پایگاه‌های داده، رمزنگاری، برنامه‌های تحت وب، الگوریتم‌های کار با اعداد و ارتباطات شبکه‌ای را نام برد . آخرین نسخه آن 4 است و از ویژوال استدیو 2010 استفاده میکند . #C یک زبان سطح بالا و نسبتا راحت که برای ساخت برنامه های ویندوزی گزینه بسیار مناسبی هست .

اگر برای اولین بار هست که با #C آشنا میشوید حتما به بخش “مبانی” سر بزنید تا با نحوه نوشتن کدهای اولیه و چندین مثال تقریبا شناخت خوبی از این زبان برنامه نویسی پیدا کنید .

ارسال شده در مبانی برنامه نویسی, همه ی موضوعات | پاسخ دهید: