detCode
Banlanmış Üye
- Aktiflik
- K.Tarihi
- 28 Nis 2011
- Mesajlar
- 55
- Puanı
- 11
Merhaba arkadaşlar..
Şimdi anlatmaya çalışacağım şey C#'da socket kullanımı, veri gönderme veri almak, birden çok client kabul etmek vb.
Kodlayacağımız şey server olarak düşünebilirsiniz. Gelen bütün bağlantıları kabul edicek başlayalım..
ListenClient adında bir socket tanımladık.
ListenClient'i dinleme moduna aldık sonrada gelen bağlantıları kabul etmesi için handleConnections thread oluşturup. Threadı başlattık.
handleConnections fonksiyonumuz gelen bütün bağlantılar döngü içerisinde kabul edilicek. Kabul edildikten sonra yeni bir Clients sınıfı oluşturup oraya atıcak socketimizi. Bu bağlantı kabul edildikten sonra tekrar bağlantı gelebilir sorun yok herseferinde Clients'e atıp birtane daha veriyi almak için döngü oluşturucak.
Clients.cs classımıza bakalım.
Kodu baştan itibaren koydum nereye ne yazıldığını göresiniz diye
Bir önceki kodda Clients ShardClient = new Clients(ClientSocket); bu kısımda yukarda belirttiğim classtan bitane oluşturdu. Clients fonksiyonunua gönderdi socketi data sonrada dinlemek için tekrar birtane thread oluşturduk ClientrecvData ismi ile
recv. döngümüz
bu döngü ile veri gelirse gelen veriyi alabiliriz. Byte array dan string'e çevirmek için Encoding.UTF8.GetString(rPacket) ile stringe çevirebilirsiniz.
Veri gönderirken ise aşağıdaki gibi yollayabilirsiniz.
Şimdilik bu kadar. Bir kusurum olduysa affola sağlıcakla kalın..
Şimdi anlatmaya çalışacağım şey C#'da socket kullanımı, veri gönderme veri almak, birden çok client kabul etmek vb.
Kodlayacağımız şey server olarak düşünebilirsiniz. Gelen bütün bağlantıları kabul edicek başlayalım..
Kod:
public static Socket ListenClient = new Socket(System.Net.Sockets.AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ListenClient adında bir socket tanımladık.
Kod:
try
{
ListenClient.Bind(new IPEndPoint(IPAddress.Parse("string ip adresiniz"), intportunuz));
ListenClient.Listen(0);
Console.WriteLine("Listening Clients..");
}
catch
{
Console.WriteLine("Error Starting Server");
Console.Read();
return;
}
Thread acceptThread = new Thread(new ThreadStart(handleConnections));
acceptThread.Start();
ListenClient'i dinleme moduna aldık sonrada gelen bağlantıları kabul etmesi için handleConnections thread oluşturup. Threadı başlattık.
Kod:
public static void handleConnections()
{
while (true)
{
Socket ClientSocket = ListenClient.Accept();
Clients ShardClient = new Clients(ClientSocket);
Thread.Sleep(5);
}
}
handleConnections fonksiyonumuz gelen bütün bağlantılar döngü içerisinde kabul edilicek. Kabul edildikten sonra yeni bir Clients sınıfı oluşturup oraya atıcak socketimizi. Bu bağlantı kabul edildikten sonra tekrar bağlantı gelebilir sorun yok herseferinde Clients'e atıp birtane daha veriyi almak için döngü oluşturucak.
Clients.cs classımıza bakalım.
Kodu baştan itibaren koydum nereye ne yazıldığını göresiniz diye
Kod:
namespace detG
{
class Clients
{
public static Socket realshard = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
private Socket ClientSocket;
public Clients(Socket tSocket)
{
ClientSocket = tSocket;
Thread crecvThread = new Thread(new ThreadStart(ClientrecvData));
crecvThread.Start();
Console.WriteLine("Connected. IP:"+ IPAddress.Parse(((IPEndPoint)ClientSocket.RemoteEndPoint).Address.ToString()));
}
Bir önceki kodda Clients ShardClient = new Clients(ClientSocket); bu kısımda yukarda belirttiğim classtan bitane oluşturdu. Clients fonksiyonunua gönderdi socketi data sonrada dinlemek için tekrar birtane thread oluşturduk ClientrecvData ismi ile
recv. döngümüz
Kod:
private void ClientrecvData()
{
byte[] rBuffer = new byte[1024];
byte[] rPacket;
int rLength = 0;
while (true)
{
try
{
rLength = ClientSocket.Receive(rBuffer, 0, rBuffer.Length, SocketFlags.None);
}
catch
{ }
if (ClientSocket.Connected && rLength > 0)
{
rPacket = new byte[rLength];
Array.Copy(rBuffer, 0, rPacket, 0, rLength);
//gelen data burda rPacket byte array şeklinde
}
else
{
//disconnected.
break;
}
}
}
bu döngü ile veri gelirse gelen veriyi alabiliriz. Byte array dan string'e çevirmek için Encoding.UTF8.GetString(rPacket) ile stringe çevirebilirsiniz.
Veri gönderirken ise aşağıdaki gibi yollayabilirsiniz.
Kod:
string senddata = "detCode";
ClientSocket.Send(Encoding.UTF8.GetBytes(senddata));
Şimdilik bu kadar. Bir kusurum olduysa affola sağlıcakla kalın..