II.TCP soketlarida mijoz-server dasturi
Rozetkalar yordamida TCP serverini qanday yaratishni ko'rib chiqamiz. TCP server soketining umumiy ishlash sxemasi quyidagicha bo'ladi:
Rozetka yaratish
Ulanishlarni tinglash uchun mahalliy hotspotni yaratish(Bind usuli)
Kiruvchi ulanishlarni tinglashni boshlang(Listen usuli)
Kiruvchi ulanishni olish(Accept usuli)
Jo’natish/ma’lumotlarni yig’ish(Send /Reseive metodi)
Yopish rozetkasi(Close usuli)
Server dasturi 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’zlarni qabul qilish porti
static void Main(string[] args)
{
//rozetkani ishga tushirish uchun manzillarni olish
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port);
//rozetka yaratish
Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
//rozetkani ma’lumotlarni qabul qiladigan mahalliy nuqtaga ulash
listenSocket.Bind(ipPoint);
//tinglashni boshlash
listenSocket.Listen(10);
Console.WriteLine("Server ishlayapti.Ulanishlar kutilmoqda...");
while (true)
{
Socket handler = listenSocket.Accept();
//Xabarni olamiz
StringBuilder builder = new StringBuilder();
int bytes = 0; //qabul qilingan baytlar soni
byte[] data = new byte[256]; //qabul qilish 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());
string message = "Sizning xabaringiz yetkazildi";
data = Encoding.Unicode.GetBytes(message);
handler.Send(data);
handler.Shutdown(SocketShutdown.Both);
handler.Close();
}
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
Birinchidan, rozetkani yaratgandan so'ng, foydalanuvchi uni Bind usuli yordamida mahalliy nuqtaga bog'laydi:
listenSocket.Bind(ipPoint);
Soket 127.0.0.1 mahalliy manzilidagi 8005 portidagi ulanishlarni tinglaydi. Ya'ni, mijoz mahalliy manzilga va 8005 portiga ulanishi kerak bo'ladi.
Keyin biz tinglashni boshlaymiz:
listenSocket.Listen(10);
Listen usuli faqat Bind usulidan keyin chaqiriladi. Parametr sifatida rozetkada navbatda turishi mumkin bo'lgan kiruvchi ulanishlar sonini oladi.
Listen usulini chaqirgandan so'ng, kiruvchi ulanishlarni tinglash boshlanadi va agar ulanishlar rozetkaga kelsa, ularni Accept usuli yordamida olish mumkin:
Socket handler=listenSocket.Accept();
Qabul qilish usuli kutilayotgan so'rovlar qatoridan birinchi so'rovni chiqaradi va uni qayta ishlash uchun Socket yaratadi. Agar so'rov navbati bo'sh bo'lsa, Accept usuli yangi ulanish o'rnatilgunga qadar chaqiruvchi ipni bloklaydi.
So'rovni qayta ishlash uchun birinchi navbatda do..while siklida foydalanuvchi Receive usuli yordamida ma'lumotlarni oladi:
do
{
bytes = handler.Receive(data);
builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
}
while (handler.Available > 0);
Qabul qilish usuli parametr sifatida qabul qilingan ma'lumotlar o'qiladigan baytlar massivini oladi va olingan baytlar sonini qaytaradi.
Agar o'qilishi mumkin bo'lgan ma'lumotlar bo'lmasa, Socket.ReceiveTimeout ob'ekti yordamida kutish vaqti qiymati o'rnatilmagan bo'lsa, Receive usuli qo'ng'iroq qiluvchi oqimni ma'lumotlar mavjud bo'lguncha bloklaydi. Agar kutish vaqti oshib ketgan bo'lsa, Receive obyekti SocketException ni chiqaradi. Oqimdagi ma'lumotlar mavjudligini kuzatish uchun Available xususiyatidan foydalaniladi .
Ma'lumotni olgandan so'ng, mijozga parametr sifatida baytlar massivini oladigan Send usuli yordamida javob xabari yuboriladi:
handler.Send(data);
So'rovni qayta ishlash oxirida siz u bilan bog'liq rozetkani yopishingiz kerak:
handler.Shutdown(SocketShutdown.Both);
handler.Close();
Rozetkani yopishdan oldin O'chirish () usulini chaqirish hech qanday ham ma'lumot qolmasligini ta'minlaydi. Ushbu usul parametr sifatida SocketShutdown ro'yxatidan qiymat oladi :
Both: rozetkada ma'lumotlarni yuborish va qabul qilishni to'xtatish
Receive: ma'lumotlarni olishni to'xtatish
Send: ma'lumotlarni yuborishni to'xtatish
Mijoz
Endi mijoz uchun loyiha qo'shamiz. Mijozning rozetkalardagi ishining umumiy sxemasi biroz boshqacha bo'ladi:
Rozetka yaratish
Server ulanishi(Connect metodi)
Jo’natish/ma’lumotlarni yig’ish((Send /Reseive metodi)
Yopish rozetkasi(Close usuli)
To'liq mijoz kodi:
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace SocketTCPClient
{
class Program
{
//biz ulanadigan serverning manzili va porti
static int port = 8005; //server porti
static string address = "127.0.0.1"; //server manzili
static void Main(string[] args)
{
try
{
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse(address), port);
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//masofaviy hostga ulaning
socket.Connect(ipPoint);
Console.Write("Xabaringizni kiriting:");
string message = Console.ReadLine();
byte[] data = Encoding.Unicode.GetBytes(message);
socket.Send(data)
//javobini olamiz
data = new byte[256]; //javob buferi
StringBuilder builder = new StringBuilder();
int bytes = 0; //qabul qilingan baytlar soni
do
{
bytes = socket.Receive(data, data.Length, 0);
builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
}
while (socket.Available > 0);
Console.WriteLine("Server javobi: " + builder.ToString());
//rozetkani yopish
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.Read();
}
}
}
Mijoz uchun hamma narsa bir xil, faqat hozir rozetkani yaratgandan so'ng , server manzili uzatiladigan Connect () usuli chaqiriladi :
IPEndPoint ipPoint = new
IPEndPoint(IPAddress.Parse(address), port);
socket.Connect(ipPoint);
Endi server va mijoz dasturlarini ishga tushiramiz. Mijoz konsoli:
Xabaringizni kiriting:salom dunyo
Server javobi:xabaringiz yetkazildi
Server konsoli:
Server ishlayapti.Ulanishlar kutilmoqda...
22:34 :salom dunyo
Do'stlaringiz bilan baham: |