13 Ekim 2017 Cuma

TcpListener Sınıfı

Giriş
TCP işlemleri için ik seçeneğimiz var. İlk seçenek Socket sınıfını kullanmak. İkinci seçenek ise TcpListener ve TcpClient sınıflarını kullanmak. TcpListener ve TcpClient çok daha kolay arayüzler sundukları için tercih etmek gerekir.

Bir sunucu socketi açmak için TcpListener kullanılır. Basit bir örnek şöyledir.
TcpListener tcpListener = new TcpListener(IPAddress.Any, 1234);
tcpListener.Start();  
while (true)
{                     
  TcpClient tcpClient = tcpListener.AcceptTcpClient();
  byte[] data = new byte[1024];

  NetworkStream ns = tcpClient.GetStream();
  

  int recv = ns.Read(data, 0, data.Length);                 
  
}   
Constructor
Tüm arayüzleri dinlemek için şöyle yaparız.
TcpListener listener = new TcpListener(IPAddress.Any , 8000);
Belli bir IP adresini dinlemek için şöyle yaparız.
const int PORT_NO = 2201;
const string SERVER_IP = "127.0.0.1";

IPAddress localAdd = IPAddress.Parse(SERVER_IP);
TcpListener tcpListener = new TcpListener(localAdd, PORT_NO);
AcceptTcpClient metodu
TcpClient nesnesi döndürür. TcpClient ile NetworkStream kullanılabilir.
TcpClient tcpClient = tcpListener.AcceptTcpClient();
Her client için bir thread açan basit örnekler şöyle.

Bu örnekte ThreadPool kullanılıyor.
ThreadPool.QueueUserWorkItem(ThreadProc, tcpClient);

private static void ThreadProc(object obj)
{
    var tcpClient = (TcpClient)obj;    // Do your work here
}
Bu örnekte yeni bir Thread açılıyor.
// Start a thread to handle this client...
new Thread(() => HandleClient(tcpClient)).Start();
Bu örnekte Task Parallel Library kullanılıyor.
// Start a task to handle this client...
Task.Run(() => HandleClient(tcpClient));
AcceptTcpClientAsync metodu
Task Parallel Library ile kullanılmak üzere tasarlanmış. Şöyle yaparız.
public async void StartListener() //non blocking listener
{
  listener = new TcpListener(ipAddress, port);
  listener.Start();
  while (listening)
  {
    var client = await listener.AcceptTcpClientAsync().ConfigureAwait(false);
    // We are already in the new task to handle this client...   
    HandleClient(client);
  }
}
//... in your code
StartListener();
AcceptSocket
Socket döndürür.
Socket s = tcpListener.AcceptSocket();
BeginAcceptTcpClient metodu
Şöyle yaparız.
private void StartListening()
{
  server.BeginAcceptTcpClient (AcceptTcpClient,server);
}

private void AcceptTcpClient(IAsyncResult ar)
{
  TcpListener listener = (TcpListener)ar.AsyncState;

  TcpClient (client = listener.EndAcceptTcpClient (ar)));
  StartListening ();
}
Start metodu
AcceptTcpClient() metodundan önce çağrılmalıdır. Şöyle yaparız.
tcpListener.Start();
Stop metodu
Şöyle yaparız.
tcpListener.Stop();

Hiç yorum yok:

Yorum Gönder