Студопедия
Новини освіти і науки:
МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах


РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання


ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ"


ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ


Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків


Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні


Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах


Гендерна антидискримінаційна експертиза може зробити нас моральними рабами


ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ


ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів



Опис вихідного тексту серверного додатка SocketServ

У методі main, що одержує керування відразу після запуску додатка, ми визначили трохи змінних.

Масив bKbdInput розміром 256 байт призначений для зберігання рядків, уведених за допомогою клавіатури.

У змінну ss класу ServerSocket буде записане посилання на об'єкт, призначений для встановлення каналу зв'язку через потоковий сокет (але не посилання на сам сокет):

ServerSocket ss;

Посилання на сокет, з використанням якого буде відбуватися передача даних, зберігається в змінній з ім'ям s класу Socket:

Socket s;

Крім того, ми визначили змінні is і os, відповідно, класів InputStream і OutputStream:

InputStream is; OutputStream os;

У ці змінні будуть записані посилання на вхідний і вихідний потік даних, які пов'язані із сокетом.

Після відображення на консолі рядка назви додатка, метод main створює об'єкт класу ServerSocket, указуючи конструкторові номер порту 9999:

ss = new ServerSocket(9999);

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

Канал установлюється методом accept:

s = ss.accept();

Цей метод переводить додаток у стан очікування доти, поки не буде встановлений канал передачі даних.

Метод accept у випадку успішного створення каналу передачі даних повертає посилання на сокет, із застосуванням якого потрібно приймати й передавати дані.

На наступному етапі сервер створює вхідний і вихідний потоки, викликаючи для ці методи getInputStream і getOutputStream, відповідно:

is = s.getInputStream();os = s.getOutputStream();

Далі додаток підготовляє буфер buf для прийому даних і визначає змінну length, у яку буде записуватися розмір прийнятого блоку даних:

byte buf[] = new byte[512];int lenght;

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

Для читання рядка ми викликаємо метод read стосовно до вхідного потоку:

lenght = is.read(buf);

Цей метод повертає керування тільки після того, як всі дані будуть прочитані, блокуючи додаток на час своєї роботи. Якщо таке блокування небажане, вам належить виконувати обмін даними через сокет в окремому завданні.

Метод read повертає розмір прийнятого блоку даних або -1, якщо потік вичерпаний. Ми скористалися цією обставиною для завершення циклу прийому даних:

if(lenght == -1) break;

Після завершення прийому блоку даних ми перетворимо масив у текстовий рядок str класу String, видаляючи з її символ перекладу рядка, і відображаємо результат на консолі сервера:

System.out.println("> " + str);

Потім отриманий рядок відправляється назад клієнтському додатку, для чого викликається метод write:

os.write(buf, 0, lenght);

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

Для виключення затримок у передачі даних через нагромадження даних у буфері (при використанні буферізованих потоків) необхідно примусово скидати вміст буфера методом flush:

os.flush();

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

Тепер про завершальні дії після переривання циклу одержання, відображення й передачі рядків.

Наш додаток явним образом закриває вхідний і вихідний потоки даних, сокет, а також об'єкт класу ServerSocket, з використанням якого був створений канал передачі даних:

is.close();os.close();s.close();ss.close();



Переглядів: 305

<== попередня сторінка | наступна сторінка ==>
Вихідний текст серверного додатка SocketServ | Вихідний текст клієнтського додатка SocketClient

Не знайшли потрібну інформацію? Скористайтесь пошуком google:

  

© studopedia.com.ua При використанні або копіюванні матеріалів пряме посилання на сайт обов'язкове.


Генерація сторінки за: 0.058 сек.