خواهشاً حوصله دوستان سرنره، سعی خواهد شد تو این پست همه چیز از صفر گفته بشه و پس از این پست در هر مرحله، درصورت نیاز مفاهیمی که ممکنه کمتر به گوش خورده باشن، تا اونجایی که سوادمون قد میده توضیح داده بشن. توضیح که میگم نه اینکه مثلاً Threading رو کاملاً باز کنیم یا رخدادها و Delegate ها رو از صفر توضیح بدیم تا جزئیات؛ کاری که می کنیم اینه که توضیحی مرتبط با کاربرد این موارد در پروژه موردنظرمون بدیم و برای توضیحات بیشتر از آموزشهای اساتید تو همین فروم و سایر مراجع استفاده بشه. ضمناً اگه نکته یا ترفندی تو جایی بنظر رسید از ذکرش دریغ نکنیم ...
********************
اول که باید ویژوال استودیو رو اجرا کنید! می تونید تو Run بنویسید devenv و محیط رو بالا بیارید.
یه پروژه جدید WindowsFormsApplication باز کنید. طبق گفته های پست قبل نسبت به نیازهامون باید namespace های (معنیش رو نمی دونید هم مهم نیست، همون جملات) زیر رو به using های خودتون اضافه کنید(برای رفتن از فرم به کد از F7 و برعکسش از Shift+F7 می تونید استفاده کنید):
System.Threading;
System.Net;
System.Net.Sockets;
System.IO;
حالا رو فرمتون از Toolbox ویژوال استودیو (Ctrl+W بعد X بزنید) دوتا Textbox بندازین و در پنجره Properties ا(Ctrl+W بعد P بزنید) اسامی شون - خاصیت Name - رو به txtIp و txtLog تغییر بدین و خاصیت Multiline کنترل txtLog رو True کنید. حالا یه Button و Lable هم رو فرمتون بندازید و Name شون رو به ترتیب بذارید btnListen و lbIp؛ ضمناً Text شون رو هم به همون ترتیب بذارید Start Listening و IP Address: در نهایت نام فرم رو frmChatSrv و Text اش رو Chat Server بذارید. با مرتب کردن جاهاشون فرم تون تقریباً میشه یه چیزی مثل فرم زیر

اینکه تاکید روی اسامی و Textهای (و در مراحل بعد کامنت ها) معنی دار میشه، دلیلش اینه که نشاندهنده درک درست شما از کدنویسی هست، یعنی پیش هرکسی برید برای بررسی کدهاتون، اولش به اینها توجه میکنن و اگه مثلاً Button1 تا Texbox1 تو کدتون دیده بشه (به هردلیل) نشان دهنده آشغال! بودن کدتون هست و به بقیه موارد توجه نمیشه، بلاتشبیه یه چیزی مثل نماز برای مسلمونا! حالا خود دانید ...
این تمام کاری بود که ما با رابط کاربری سرویس دهنده مون داشتیم؛ بقیه مربوط میشه به کد پشت زمینه که اصل کاری هست. خودتون رو آماده کنید و اگه کلمات عجیب-غریب دیدین فرار نکنید، به تدریج توضیح داده میشن و امیدوارم دوستان دیگه هم اشکالات رو تذکر بدن :
تو بخش کد داخل کلاس فرمتون کد زیر رو اضافه کنید :
private delegate void UpdateStatusCallback(string strMessage);
اینکه این کد چیه و کاربردش چیست و ... بعداً توضیح داده میشه، چون قبلش چند تا مورد هست که باید پیش زمینه اش رو داشته باشید؛ الان فقط میخواهیم فرممون رو تکمیل کنیم و بعدش بریم سراغ مفاهیم. حالا روی btnListen دابل کلیک کرده و کدهای زیر رو اضافه کنید :
// Parse the server's IP address out of the TextBox
IPAddress ipAddr = IPAddress.Parse(txtIp.Text);
// Create a new instance of the ChatServer object
ChatServer mainServer = new ChatServer(ipAddr);
// Hook the StatusChanged event handler to mainServer_StatusChanged
ChatServer.StatusChanged += new StatusChangedEventHandler(mainServer_StatusChanged );
// Start listening for connections
mainServer.StartListening();
// Show that we started to listen for connections
txtLog.AppendText("Monitoring for connections...\r\n");
حالا با دو تا تابع زیر کار ما کلاً با این فرم تموم میشه و میریم سراغ توضیحات موارد و Keyword هایی که ممکنه کمی نامفهوم باشند :
public void mainServer_StatusChanged(object sender, StatusChangedEventArgs e)
{
// Call the method that updates the form
this.Invoke(new UpdateStatusCallback(this.UpdateStatus), new object[] { e.EventMessage });
}
private void UpdateStatus(string strMessage)
{
// Updates the log with the message
txtLog.AppendText(strMessage + "\r\n");
}
اگه تا اینجا، مورد مبهمی (غیر از داخل توابع) به ذهن دوستان نمیرسه، ادامه بدیم.