سلام مجدد
به قول قدیمی ها، سلام سلامتی می آره!

در کلاینت اوضاع خیلی ساده است یک شی سوکت میسازیم و با همان اقدام به دریافت و ارسال اطلاعات میکنیم، در واقعاً هر کلاینت فقط یک وظیفه دارد و آن اتصال به سرور است!

ولی در سرور خیلی جزئی اوضاع فرق میکند و سرور باید یک خط ارتباطی با هر یک از کلاینت ها به طور مجزا داشته باشد، در نتیجه همان یک نمونه سوکتی که اول در سرور میسازیم کفایت نمیکند و ما نیاز به یک خط ویژه ارتباطی با هر کلاینت داریم.
برای آنکه بهتر متوجه شوید، مرکز تلفن 118 را در نظر بگیرید، در ظاهر فقط یک تلفن 118 وجود دارد و این خیلی بدیهی است که از هر جایی کافی است فقط 118 را بگیریم، این لفظ کلی تلفن 118، مثل همان شی سوکت اصلی سرور میماند که در خودمان سرور با New آن را میسازیم.
ولی بعد هر کس با 118 تماس میگیرد برای به یک اپراتور مجزا و یک گوش تلفن مجزا وصل میشود، شماره تماس همه گوش های تلفن مرکز، همان 118 است ولی مثل تماس گیرنده، اینجا یک گوشی وجود ندارد و کفایت نمیکند، اگر یک گوشی در 118 باشد، طبیعی است که همه صحبتهای تماس گیرنده و همه جوابهای مرکز قاطی میشوند.

متد Accept مسئول برداشتن گوشی جدید در سرور و ایجاد یک خط ارتباطی مستقل است.

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


دستور زیر آنقدر صبر میکند تا فقط یک کلاینت در خواست اتصال بدهد، انگاه اتصال را پذیرفته و یک پیغام متنی Hello برای کلاینت ارسال میکند و اتصال را پایان میدهد و میبندد و همه چیز تمام میشود !
(دستور Send را توضیح خواهیم داد، فعلاً بدانید که وظیفه ارسال اطلاعات را به عهده دارد.)

'VB.Net
'socket = New ...
'socket.Bind ( ...
'socket.Listen ( ...

Dim msgbuffer() As Byte = System.Text.Encoding.UTF8.GetBytes("Hello")

Dim clientsocket As System.Net.Sockets.Socket = socket.Accept()
clientsocket.Send(msgbuffer)
clientsocket.Close()


//C#‎.Net
//socket = new ...
//socket.Bind ( ...
//socket.Listen ( ...

byte[] msgbuffer = System.Text.Encoding.UTF8.GetBytes("Hello");

System.Net.Sockets.Socket clientsocket = socket.Accept();
clientsocket.Send(msgbuffer);
clientsocket.Close();


برای یک برنامه واقعی باید Accept را در یک حلقه تکرار کرد تا تمام درخواستهای همه کلاینتها پردازش شود.
مثلاً کد زیر هر درخواستی را که برسد قبول میکند و یک پیغام Hello به ان ارسال میکند و مکالمه را پایان میدهد و مجدداً منتظر درخواست بعدی میشود.

'VB.Net
'socket = New ...
'socket.Bind ( ...
'socket.Listen( ...

Dim msgbuffer() As Byte = System.Text.Encoding.UTF8.GetBytes("Hello")

Do
Dim clientsocket As System.Net.Sockets.Socket = socket.Accept()
clientsocket.Send(msgbuffer)
clientsocket.Close()
Loop


//C#‎.Net
//socket = new ...
//socket.Bind ( ...
//socket.Listen ( ...

byte[] msgbuffer = System.Text.Encoding.UTF8.GetBytes("Hello");

while (true)
{
System.Net.Sockets.Socket clientsocket = socket.Accept();
clientsocket.Send(msgbuffer);
clientsocket.Close();
}