TCP soketlarida mijoz-server dasturi.
Soketlardan foydalanib TCP-serverni qanday yaratishni ko'rib chiqamiz. TCP server soketining umumiy sxemasi quyidagicha bo'ladi:
Server dasturining kodi quyidagicha bo'ladi:
using System; using System.Text; using System.Net; using System.Net.Sockets; namespace SocketTcpServer { class Program { static int port = 8005; // kiruvchi so'rovlarni qabul qilish uchun port static void Main(string[] args) { // soketni ishga tushirish uchun manzillarni oling IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port); // soket yaratish Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { // soketni biz ma'lumot oladigan lokal nuqtaga ulash. listenSocket.Bind(ipPoint); // tinglashni boshlang listenSocket.Listen(10); Console.WriteLine("Server ishga tushdi. Ulanish kutilmoqda ..."); while (true) { Socket handler = listenSocket.Accept(); // habarni qabul qilish StringBuilder builder = new StringBuilder(); int bytes = 0; // olingan baytlar soni byte[] data = new byte[256]; // olingan ma'lumotlar uchun bufer do { bytes = handler.Receive(data); builder.Append(Encoding.Unicode.GetString(data, 0, bytes)); } while (handler.Available>0); Console.WriteLine(DateTime.Now.ToShortTimeString() + ": " + builder.ToString()); // Javob jo`natish string message = " xabaringiz yetkazildi "; data = Encoding.Unicode.GetBytes(message); handler.Send(data); // soketni yopish handler.Shutdown(SocketShutdown.Both); handler.Close(); } } catch(Exception ex) { Console.WriteLine(ex.Message); } } } } Birinchidan, soketni yaratgandan so'ng, uni Bind usuli yordamida mahalliy nuqtaga bog'laymiz:
listenSocket.Bind(ipPoint); Soket 8007 portidagi ulanishlarni mahalliy 127.0.0.1 manzilida tinglaydi. Ya'ni, mijoz mahalliy manzil va 8005 portiga ulanishi kerak bo'ladi.
Keyin tinglashni boshlaymiz:
listenSocket.Listen(10); Listen usuli faqat Bind usulidan keyin chaqiriladi. Parametr sifatida soketda navbatga qo'yilishi mumkin bo'lgan kiruvchi ulanishlar soni olinadi.
Listen usulini chaqirgandan so'ng kiruvchi ulanishlarni tinglash boshlanadi va agar ulanishlar soketga tushsa, ularni Accept usuli yordamida olish mumkin:
Socket handler = listenSocket.Accept(); Accept usuli kutilayotgan so'rovlar qatoridan birinchi so'rovni oladi va uni qayta ishlash uchun Socket hosil qiladi. Agar so'rov navbati bo'sh bo'lsa, u holda Accept usuli yangi ulanish o'rnatilguncha chaqiruv satrini bloklaydi.
So'rovni qayta ishlash uchun avval do..while tsiklida biz Receive usuli yordamida ma'lumotlarni olamiz:
do { bytes = handler.Receive(data); builder.Append(Encoding.Unicode.GetString(data, 0, bytes)); } while (handler.Available > 0); Receive usuli parametr sifatida qabul qilingan ma'lumotlarni o'qish uchun baytlar qatorini oladi va olingan baytlar sonini qaytaradi.
Agar o'qiladigan ma'lumotlar bo'lmasa, Receive usuli, agar Socket.ReceiveTimeout ob'ekti yordamida vaqt tugashi qiymati belgilanmagan bo'lsa, ma'lumotlar mavjud bo'lguncha chaqiruv oqimini bloklaydi. Agar kutish vaqti tugagan bo'lsa, Receive ob'ekti SocketExceptionni tashlaydi. Oqimdagi ma'lumotlarning mavjudligini kuzatish uchun Available xususiyatidan foydalaning.
Ma'lumotlarni olgandan so'ng, Send usuli yordamida mijozga javob xabari yuboriladi, bu parametr sifatida baytlar qatorini oladi:
handler.Send(data); So'rovni qayta ishlash oxirida siz u bilan bog'langan soketni yopishingiz kerak:
handler.Shutdown(SocketShutdown.Both); handler.Close(); Soketni yopishdan oldin Shutdown() usulini chaqirish xom ma'lumotlar qolmasligini ta'minlaydi. Ushbu usul parametr sifatida SocketShutdown ro'yxatidan qiymat oladi: