Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shpori_oop.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
441.86 Кб
Скачать
  1. Створення сокетів udp

Для роботи з сокетами UDP додаток має створити сокет на базі класу DatagramSocket, а також підготувати об’єкт класу DatagramPacket, в який буде занесено блок даних для прийому/передавання.

Канал, а також вхідні та вихідні потоки створювати не треба. Дані передаються та приймаються методами send() і receive(), визначеними в класі DatagramSocket.

Клас DatagramSocket

Розглянемо конструктори та методи класу DatagramSocket, при­зна­че­ного для створення та використання сокетів UDP або дейтаграмних сокетів.

В класі DatagramSocket визначено два конструктора:

public DatagramSocket(int port);

public DatagramSocket();

Перший з цих конструкторів дозволяє визначити порт для сокета, інший припускає використання будь-якого вільного порта.

Звичайно серверні додатки працюють з використанням заздалегідь визначеного порта, номер якого є відомим для додатків-клієнтів. Тому для серверних додатків ліпше використовувати перший з наведених вище конструкторів.

Клієнтські додатки, навпаки, часто-густо використовують будь-які вільні на локальному вузлі порти, тому для них ліпшим є конструктор без параметрів.

Звичайно перший з цих конструкторів використовують для серверів, які, як правило, знають самі і мають повідомити клієнтам номер свого порта, другий – для клієнтів.

До речі, за допомогою метода getLocalPort() додаток завжди може довідатися номер порта, що його закріплено за даним сокетом:

public int getLocalPort();

Прийом і передавання даних на дейтаграмному сокеті виконується за допомогою методів receive() і send() відповідно:

public void receive(DatagramPacket p);

public void send(DatagramPacket p);

Як параметр цим методам передається посилання на пакет даних, визначений як об’єкт класа DatagramPacket.

Ще один метод в класі DatagramSocket, яким ви маєте скористатися, це метод close(), призначений для закриття сокета:

public void close();

Клас DatagramPacket

Перед тим, як приймати або передавати дані з використанням методів receive() і send(), ви маєте підготувати об’єкти класу DatagramPacket. Метод receive() запише в такий об’єкт прийняті дані, а метод send() – перешле дані з об’єкта класу DatagramPacket вузлу, адреса якого указана в пакеті.

Підготовка об’єкта класу DatagramPacket для прийому пакетів виконується за допомогою такого конструктора:

public DatagramPacket(byte buf[], int length);

Цьому конструктору передається посилання на масив buf, в який треба буде записати дані, та розмір цього масива length.

Якщо вам треба підготувати пакет для передавання, скористайтеся конструктором, який додатково дозволяє задати адресу IP addr и номер порта port вузла призначення:

public DatagramPacket(byte buf[], int length, InetAddress addr, int port);

Таким чином, інформація про те, на який вузол і на який порт необхідно доставити пакет даних, зберігається не в сокеті, а в пакеті, тобто в об’єкті класу DatagramPacket.

Крім цих конструкторів, в класі DatagramPacket визначено чотири методи, що дозволяють отримати дані та інформацію про адресу вузла, з якого прийшов пакет, або для якого призначено пакет.

Метод getData() повертає посилання на масив даних пакета:

public byte[] getData();

Розмір пакета, дані з якого зберігаються в цьому масиві, легко визначити за допомогою метода getLength():

public int getLength();

Методи getAddress() і getPort() дозволяють визначити адресу та номер порта вузла, звідки прийшов пакет, або вузла, для якого призначено пакет:

public InetAddress getAddress();

public int getPort();

Якщо ви створюєте кліент-серверну систему, в якій сервер має заздалегідь відому адресу та номер порта, а клієнти довільні адреси та різні номери портів, то після отримання пакета від клієнта сервер може визначити за допомогою методів getAddress() і getPort() адресу клієнта для встановлення з ним зв’язку.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]