در آخر پست قبلی براتون توضیح دادم که سرور برای اتصال به هر کلاینت یک خط ارتباطی جدا لازم دارد ، برای فهم این قضیه و کاربرد متد 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 متد همانطور که از اسمشون پیداست برای ارسال و دریافت اطلاعات بکار میروند . سعی میکنم برای اینکه دیگه در فهم و استفاده از کد ها مشکلی نداشته باشید یک نمونه برنامه از هر سمت ( یعنی یک برنامه کلاینت و یک برنامه ی سرور ) برایتان درست کنم که هر پیامی را که خواستید از سمت سرور به کلاینت بفرستید و در برنامه کلاینت پیام دریافت شده را مشاهده کنید .






