Mavzu: oydning afzalliklari va kamchiliklari Reja: oydning afzalliklari oydning kamchiliklari


-Mavzu: TCP mijozi va serverini ishlab chiqish



Download 1,56 Mb.
bet17/19
Sana23.09.2022
Hajmi1,56 Mb.
#849823
1   ...   11   12   13   14   15   16   17   18   19
Bog'liq
Maruza

8-Mavzu: TCP mijozi va serverini ishlab chiqish.
Reja:
1. TCP mijozi
2. Serverini ishlab chiqish
Quyidagi misolda biz ikki tomonlama baytli buyurtma qilingan ishonchli oqimlarni ta'minlash uchun TCP-dan foydalanamiz. Keling, mijoz va serverni o'z ichiga olgan to'liq dasturni tuzamiz. Biz avval TCP oqim soketlarida serverni, so'ngra serverimizni sinab ko'rish uchun mijoz dasturini qanday qurishni ko'rsatamiz.
Quyidagi dastur mijozlardan ulanish so'rovlarini oladigan serverni yaratadi. Server bir vaqtning o'zida qurilgan, shuning uchun server mijozga ulanishga rozi bo'lmaguncha, tarmoqning bajarilishi bloklanadi. Bu ilova mijozga javob beradigan oddiy serverni ko'rsatadi. Mijoz serverga xabarini yuborish orqali ulanishni tugatadi.
TCP server
Bu erda SocketServer.cs dasturi uchun to'liq kod:
// SocketServer.cs
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace SocketServer


{
class Program
{
static void Main(string[] args)
{
// Устанавливаем для сокета локальную конечную точку
IPHostEntry ipHost = Dns.GetHostEntry("localhost");
IPAddress ipAddr = ipHost.AddressList[0];
IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000);

// Создаем сокет Tcp/Ip


Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

// Назначаем сокет локальной конечной точке и слушаем входящие сокеты


try
{
sListener.Bind(ipEndPoint);
sListener.Listen(10);

// Начинаем слушать соединения


while (true)
{
Console.WriteLine("Ожидаем соединение через порт {0}", ipEndPoint);

// Программа приостанавливается, ожидая входящее соединение


Socket handler = sListener.Accept();
string data = null;

// Мы дождались клиента, пытающегося с нами соединиться


byte[] bytes = new byte[1024];
int bytesRec = handler.Receive(bytes);
data += Encoding.UTF8.GetString(bytes, 0, bytesRec);
// Показываем данные на консоли
Console.Write("Полученный текст: " + data + "\n\n");
// Отправляем ответ клиенту\
string reply = "Спасибо за запрос в " + data.Length.ToString()
+ " символов";
byte[] msg = Encoding.UTF8.GetBytes(reply);
handler.Send(msg);

if (data.IndexOf("") > -1)


{
Console.WriteLine("Сервер завершил соединение с клиентом.");
break;
}
handler.Shutdown(SocketShutdown.Both);
handler.Close();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
Console.ReadLine();
}
}
}
}
Keling, ushbu dasturning tuzilishini ko'rib chiqaylik.
Birinchi qadam - rozetka uchun mahalliy oxirgi nuqtani o'rnatish. Ulanishlarni tinglash uchun rozetkani ochishdan oldin, uning uchun mahalliy so'nggi manzilni tayyorlash kerak. TCP / IP xizmatining o'ziga xos manzili xost IP -manzili va xizmat ko'rsatish nuqtasi raqamining kombinatsiyasi bilan aniqlanadi.
Dns klassi mahalliy tarmoqdagi qurilma qo'llab -quvvatlaydigan tarmoq manzillari haqidagi ma'lumotlarni qaytaradigan usullarni taqdim etadi. Agar LAN qurilmasi bir nechta tarmoq manziliga ega bo'lsa, Dns klassi barcha tarmoq manzillari haqidagi ma'lumotlarni qaytaradi va dastur xizmat ko'rsatish uchun qatordan mos manzilni tanlashi kerak.
Dns.Resolve () usulidan birinchi xost IP manzilini port raqami bilan birlashtirib, server uchun IPEndPoint yarating:
IPHostEntry ipHost = Dns.GetHostEntry("localhost");
IPAddress ipAddr = ipHost.AddressList[0];
IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, 11000);
Bu erda IPEndPoint sinfi 11000 portidagi localhost -ni ifodalaydi. Keyin Socket sinfining yangi nusxasi bilan oqim soketini yarating. Ulanishlarni tinglash uchun mahalliy so'nggi nuqta o'rnatilgan bo'lsa, rozetkani yaratish mumkin:
Socket sListener = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
AddressFamily ro'yxatida Socket sinfining namunasi manzilni hal qilish uchun foydalanishi mumkin bo'lgan manzillar sxemasi ko'rsatilgan.
SocketType parametri TCP va UDP soketlarini ajratib turadi. Unda siz, boshqa narsalar qatorida, quyidagi qiymatlarni belgilashingiz mumkin:
Gramm
Ma'lumot diagrammalarini qo'llab -quvvatlaydi. Dgram qiymati sizga manzillar parametrida protokol turi va InterNetwork uchun Udp ni ko'rsatishni talab qiladi.
Xom
Asosiy transport protokoliga kirishni qo'llab -quvvatlaydi.
Oqim
Oqim soketlarini qo'llab -quvvatlaydi. Oqim qiymati protokol turi uchun Tcp ko'rsatilishini talab qiladi.
Uchinchi va oxirgi parametr rozetka uchun zarur bo'lgan protokol turini belgilaydi. RrotocolType parametrida siz quyidagi eng muhim qiymatlarni belgilashingiz mumkin- Tcp, Udp, Ip, Raw.
Keyingi qadam - Bind () usuli yordamida rozetkani tayinlash . Konstruktor tomonidan rozetka ochilganda, unga hech qanday nom berilmaydi, faqat deskriptor ajratilgan. Bind () usuli server soketiga nom berish uchun chaqiriladi. Mijoz rozetkasi TCP oqim soketini aniqlay olishi uchun server dasturi o'z soketini nomlashi kerak:
sListener.Bind(ipEndPoint);
Bind () usuli soketni mahalliy oxirgi nuqtaga bog'laydi. Listen () va Accept () usullarini chaqirishdan oldin Bind () usulini chaqirish kerak.
Endi siz rozetka yaratdingiz va u bilan ism bog'ladingiz, kiruvchi xabarlarni Listen () usuli yordamida tinglashingiz mumkin . Tinglash holatida soket kiruvchi ulanish urinishlarini kutadi:
sListener.Listen(10);
Parametr navbatda ishlov berishni kutayotgan ulanishlarning maksimal sonini ko'rsatadigan ortda qolishni belgilaydi . Berilgan kodda parametrning qiymati navbatda o'ntagacha ulanishni to'plash imkonini beradi.
Tinglash holatida siz Accept () usuli qo'llaniladigan mijoz bilan bog'lanishga rozilik bildirishga tayyor bo'lishingiz kerak . Bu usul mijoz ulanishini oladi va mijoz / server nomlari assotsiatsiyasini yakunlaydi. Qabul qilish () usuli aloqa kelguncha qo'ng'iroq qiluvchining ipini bloklaydi.
Accept () usuli kutilayotgan so'rovlar navbatidan birinchi ulanish so'rovini oladi va uni boshqarish uchun yangi rozetka yaratadi. Yangi soket yaratilganiga qaramay, asl soket tinglashni davom ettiradi va mijozlardan bir nechta ulanish so'rovlarini qabul qilish uchun ko'p tarmoqli bo'lishi mumkin. Hech bir server ilovasi tinglash rozetkasini yopmasligi kerak. U kiruvchi mijoz so'rovlarini qabul qilish uchun Accept usuli bilan yaratilgan rozetkalar bilan ishlashni davom ettirishi kerak.
while (true)
{
Console.WriteLine("Ожидаем соединение через порт {0}", ipEndPoint);

// Программа приостанавливается, ожидая входящее соединение


Socket handler = sListener.Accept();
Mijoz va server aloqa o'rnatgandan so'ng, Socket sinfining Send () va Receive () usullari yordamida xabar yuborish va qabul qilish mumkin .
Send () usuli chiquvchi ma'lumotlarni ulanish o'rnatiladigan rozetkaga yozadi. Receive () usuli kiruvchi ma'lumotlarni oqim soketiga o'qiydi. TCP-ga asoslangan tizimdan foydalanilganda, Send () va Receive () usullarini bajarishdan oldin rozetkalar o'rtasida aloqa o'rnatilishi kerak. Ikkala o'zaro ta'sir qiluvchi sub'ekt o'rtasidagi aniq protokol oldindan aniqlanishi kerak, shunda mijoz va server dasturlari bir -birini to'sib qo'ymaydi, kim o'z ma'lumotlarini birinchi bo'lib yuborishi kerakligini bilmaydi.
Server va mijoz o'rtasida ma'lumotlar almashinuvi tugagach, Shutdown () va Close () usullari yordamida ulanishni yopishingiz kerak bo'ladi :
handler.Shutdown(SocketShutdown.Both);
handler.Close();
SocketShutdown - bu to'xtatish uchun uchta qiymatni o'z ichiga olgan ro'yxat: ikkalasi ham - rozetkaga ma'lumotlarni yuborish va qabul qilishni to'xtatadi , Receive - rozetkaga ma'lumotlarni qabul qilishni to'xtatadi va Send - rozetkaga ma'lumotlarni yuborishni to'xtatadi.
Yopish () usuli chaqirilganda, rozetka yopiladi, bu ham soketning Connected xususiyatini false qiymatiga o'rnatadi.
TCP uchun mijoz
Mijoz dasturini yaratish uchun ishlatiladigan funktsiyalar server dasturiga o'xshaydi. Serverda bo'lgani kabi, xuddi shu usullar oxirgi nuqtani aniqlash, rozetkani ishga tushirish, ma'lumotlarni yuborish va qabul qilish va rozetkani yopish uchun ishlatiladi:

Bu erda SocketClient.cs uchun to'liq kod va uning izohi:


// SocketClient.cs
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;

namespace SocketClient


{
class Program
{
static void Main(string[] args)
{
try
{
SendMessageFromSocket(11000);
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
Console.ReadLine();
}
}

static void SendMessageFromSocket(int port)


{
// Буфер для входящих данных
byte[] bytes = new byte[1024];

// Соединяемся с удаленным устройством


// Устанавливаем удаленную точку для сокета
IPHostEntry ipHost = Dns.GetHostEntry("localhost");
IPAddress ipAddr = ipHost.AddressList[0];
IPEndPoint ipEndPoint = new IPEndPoint(ipAddr, port);
Socket sender = new Socket(ipAddr.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
// Соединяем сокет с удаленной точкой
sender.Connect(ipEndPoint);

Console.Write("Введите сообщение: ");


string message = Console.ReadLine();

Console.WriteLine("Сокет соединяется с {0} ", sender.RemoteEndPoint.ToString());


byte[] msg = Encoding.UTF8.GetBytes(message);
// Отправляем данные через сокет
int bytesSent = sender.Send(msg);
// Получаем ответ от сервера
int bytesRec = sender.Receive(bytes);
Console.WriteLine("\nОтвет от сервера: {0}\n\n", Encoding.UTF8.GetString(bytes, 0, bytesRec));

// Используем рекурсию для неоднократного вызова SendMessageFromSocket()


if (message.IndexOf("") == -1)
SendMessageFromSocket(port);
// Освобождаем сокет
sender.Shutdown(SocketShutdown.Both);
sender.Close();
}
}
}
Uzoq serverga ulanish uchun yagona yangi usul - Connect () usuli qo'llaniladi. Quyidagi rasmda mijoz va server ishlayotgani ko'rsatilgan:

9-Mavzu: I / U multiplekslash



Download 1,56 Mb.

Do'stlaringiz bilan baham:
1   ...   11   12   13   14   15   16   17   18   19




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish