III.UDP bilan ishlash uchun soketlardan foydalanish
UDP doimiy ulanishni talab qilmaydi va ko'pchilik UDP bilan ishlashni TCP ga qaraganda osonroq deb bilishi mumkin. UDP bilan ishlash tamoyillarining aksariyati TCP bilan bir xil.
Birinchidan, rozetka yaratiladi:
Socket socket = new
Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
Agar rozetka xabarlarni qabul qiladigan bo'lsa, uni mahalliy manzilga Bind usuli yordamida portlardan biriga ulashingiz kerak:
IPEndPoint localIP = new
IPEndPoint(IPAddress.Parse("127.0.0.1"), 5555);
socket.Bind(localIP);
Keyin foydalanuvchi xabarlarni yuborishi va qabul qilishi mumkin. ReceiveFrom () usuli xabarlarni qabul qilish uchun ishlatiladi :
byte[] data = new byte[256]; //qabul qilingan ma’lumotlar uchun buffer
//ma’lumotlar kelgan manzil
EndPoint remoteIp = new IPEndPoint(IPAddress.Any, 0);
int bytes = socket.ReceiveFrom(data, ref remoteIp);
Parametr sifatida baytlar massivi ma'lumotlar o'qilishi kerak bo'lgan usulga va bu ma'lumotlar keladigan masofaviy nuqtaga uzatiladi. Usul o'qilgan baytlar sonini qaytaradi.
SendTo () usuli ma'lumotlarni yuborish uchun ishlatiladi :
string message = Console.ReadLine();
byte[] data = Encoding.Unicode.GetBytes(message);
EndPoint remotePoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), remotePort);
listeningSocket.SendTo(data, remotePoint);
Usulga yuboriladigan ma'lumotlar massivi, shuningdek, ushbu ma'lumotlar yuborilishi kerak bo'lgan manzilga uzatiladi.
UDP mijoz dasturini yaratamiz:
using System;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
namespace SocketUdpClient
{
class Program
{
static int localPort; //xabarni qabul qilish porti
static int remotePort; //xabarlarni yuborish uchun port
static Socket listeningSocket;
static void Main(string[] args)
{
Console.Write("Xabarlarni qabul qilish uchun portini kiriting: ");
localPort = Int32.Parse(Console.ReadLine());
Console.Write("xabar yuborish uchun portni kiriting: ");
remotePort = Int32.Parse(Console.ReadLine());
Console.WriteLine("Xabar yuborish uchun xabaringizni kiriting va Enter tugmasini bosing");
Console.WriteLine();
try
{
listeningSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
Task listeningTask = new Task(Listen);
listeningTask.Start();
//turli portlarga xabar yuborish
while (true)
{
string message = Console.ReadLine();
byte[] data = Encoding.Unicode.GetBytes(message);
EndPoint remotePoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), remotePort);
listeningSocket.SendTo(data, remotePoint);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
Close();
}
}
//Ulanishlarni qabul qilish uchun oqim
private static void Listen()
{
try
{
//Manzilni tinglaymiz
IPEndPoint localIP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), localPort);
listeningSocket.Bind(localIP);
while (true)
{
//Xabar olamiz
StringBuilder builder = new StringBuilder();
int bytes = 0; //qabul qilingan baytlar soni
byte[] data = new byte[256]; //qabul qilingan ma’lumotlar uchun bufer
//ma’lumotlar kelgan manzil
EndPoint remoteIp = new IPEndPoint(IPAddress.Any, 0);
do
{
bytes = listeningSocket.ReceiveFrom(data, ref remoteIp);
builder.Append(Encoding.Unicode.GetString(data, 0, bytes));
}
while (listeningSocket.Available > 0);
//Ulanish ma’lumotlarini olish
IPEndPoint remoteFullIp = remoteIp as IPEndPoint;
//xabarni ko’rsatish
Console.WriteLine("{0}:{1} - {2}", remoteFullIp.Address.ToString(),
remoteFullIp.Port, builder.ToString());
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
Close();
}
}
private static void Close()
{
if (listeningSocket != null)
{
listeningSocket.Shutdown(SocketShutdown.Both);
listeningSocket.Close();
listeningSocket = null;
}
}
}
}
Birinchidan, foydalanuvchi ma'lumotlarni qabul qilish va jo'natish uchun portlarga kiradi. Bir-biri bilan o'zaro aloqada bo'ladigan ikkita mijoz ilovasi bitta mahalliy mashinada ishlaydi deb taxmin qilinadi. Agar mijozlarning manzillari boshqacha bo'lsa, ma'lumotlarni yuborish uchun manzilni kiritishni ta'minlash mumkin.
Portlarga kirgandan so'ng, kiruvchi xabarlarni tinglash vazifasi ishga tushiriladi. TCP serveridan farqli o'laroq, bu erda Tinglash va Qabul qilish usullarini chaqirishingiz shart emas. Cheksiz siklda biz to'g'ridan-to'g'ri ma'lumotlarning ReceiveFrom()keyingi qismi kelguniga qadar chaqiruvchi ipni bloklaydigan usul yordamida ma'lumot qabul qilishimiz mumkin .
Ushbu usul ref parametri orqali ma'lumot olingan masofaviy nuqtani qaytaradi:
IPEndPoint remoteFullIp = remoteIp as IPEndPoint;
Ya'ni, bu holda xabarlarni qabul qilish va jo'natish chegaralangan bo'lsa-da va joriy mijoz ma'lumotlarni faqat boshida kiritilgan portga yuboradi, ammo biz qabul qilingan ma'lumotlardan foydalangan holda xabarlarga javob berish qobiliyatini qo'shishimiz mumkin. masofaviy nuqta (manzil va port).
Asosiy mavzuda xabarlar SendTo () usuli yordamida yuboriladi
Shunday qilib, dastur darhol serverning ham, mijozning ham funktsiyalarini bajaradi.
Endi ilovaning ikkita nusxasini ishga tushiramiz va portlar uchun turli ma'lumotlarni kiritamiz. Birinchi mijoz:
Xabarlarni qabul qilish uchun portni kiriting: 4004
Xabarlarni yuborish uchun portni kiriting: 4005
Xabar yuborish uchun xabaringizni kiriting va Enter tugmasini bosing
127.0.0.1:4005 - salom port 4004
Xayrli kun, port 4005
ajoyib ob-havo
Ikkinchi mijoz:
Xabarlarni qabul qilish uchun portni kiriting: 4005
Xabarlarni yuborish uchun portni kiriting: 4004
Xabar yuborish uchun xabaringizni kiriting va Enter tugmasini bosing
Salom port 4004
127.0.0.1:4004 - xayrli kun, port 4005
127.0.0.1:4004 - ajoyib ob-havo
Do'stlaringiz bilan baham: |