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 olamiz
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port);
// soketni yaratamiz
Socket listenSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
// soketni biz ma'lumot oladigan mahalliy nuqta bilan ulaymiz
listenSocket.Bind(ipPoint);
// qabul qilishni boshlash
listenSocket.Listen(10);
Console.WriteLine("Server ishlaydi. Ulanish kutilmoqda ...");
while (true)
{
Socket handler = listenSocket.Accept();
// biz xabar olamiz
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 yuboramiz
string message = " xabaringiz yetkazildi ";
data = Encoding.Unicode.GetBytes(message);
handler.Send(data);
// soketni yopamiz
handler.Shutdown(SocketShutdown.Both);
handler.Close();
}
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
Birinchidan, soket yaratgandan so'ng, uni Bind usuli yordamida mahalliy nuqta bilan 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 qabul qilishni 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 ob'ektini yaratadi. Agar so'rov navbati bo'sh bo'lsa, u holda Qabul qilish usuli yangi ulanish o'rnatilguncha chaqiruv oqimini bloklaydi.
So'rovni bajarish uchun avval do..while tsiklida biz ma'lumotlarni Receive usuli yordamida qabul qilamiz:
do
{
bytes = handler.Receive(data);
builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
}
while (handler.Available > 0);
Receive usuli parametr sifatida qabul qilingan ma'lumotlar o'qiladigan baytlar qatorini oladi va olingan baytlar sonini qaytaradi.
Agar o'qish uchun ma'lumotlar mavjud bo'lmasa, Socket.ReceiveTimeout ob'ekti yordamida vaqt tugashi qiymati belgilanmagan bo'lsa, Receive usuli ma'lumotlar mavjud bo'lguncha chaqiruv oqimini bloklaydi. Vaqt tugashidan oshib ketgan bo'lsa, Receive ob'ekti SocketExceptionni tashlaydi. Oqimdagi ma'lumotlarning mavjudligini kuzatish uchun Available xususiyati ishlatiladi.
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:
Both: soketga ma'lumotlarni yuborishni ham, qabul qilishni ham to'xtatish
Receive: ma'lumot olishni to'xtatish
Send: ma'lumotlar yuborishni to'xtatish
Mijoz
Endi mijoz uchun loyihani qo'shaylik. Mijozning soketlarda ishlashining umumiy sxemasi biroz boshqacha bo'ladi:
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 adresi
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 xostga ulanish
socket.Connect(ipPoint);
Console.Write("Habarni kiriting:");
string message = Console.ReadLine();
byte[] data = Encoding.Unicode.GetBytes(message);
socket.Send(data);
// Javobni qabul qilish
data = new byte[256]; // javob buferi
StringBuilder builder = new StringBuilder();
int bytes = 0; // olingan 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());
// soketni yopamiz
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.Read();
}
}
}
Mijoz uchun hamma narsa bir xil, faqat endi, soket yaratilgandan so'ng, server manzili o'tkaziladigan Connect() usuli chaqiriladi:
IPEndPoint ipPoint = new IPEndPoint(IPAddress.Parse(address), port);
socket.Connect(ipPoint);
Endi server va mijoz dasturlarini boshlaymiz. Mijoz konsolida:
Xabaringizni kiriting: salom dunyo
server javobi: sizning xabaringiz etkazib berildi
Server konsol:
Server ishlaydi. Ulanish kutilmoqda ...
22:34: salom dunyo
UDP uchun soketlardan foydalanish
UDP doimiy ulanishni talab qilmaydi va ko'pchilik UDP bilan ishlashni TCP ga qaraganda osonroq deb bilishi mumkin. UDP bilan ishlash printsiplarining aksariyati TCP bilan bir xil.
Birinchidan, soket yaratiladi:
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
Do'stlaringiz bilan baham: |