Що ж стосується типів сокетів, то їх два - потокові та датаграммной.
За допомогою потокових сокетів ви можете створювати канали передачі даних між двома додатками Java у вигляді потоків, які ми вже розглядали у другому розділі. Потоки можуть бути вхідними або вихідними, звичайними або форматувати, з використанням або без використання буферизації. Скоро ви переконаєтеся, що організувати обмін даними між додатками Java з використанням потокових сокетів не важче, ніж працювати через потоки зі звичайними файлами.
Зауважимо, що потокові сокети дозволяють передавати дані тільки між двома додатками, так як вони припускають створення каналу між цими додатками. Однак іноді потрібно забезпечити взаємодію декількох клієнтських додатків з одним серверним або декількох клієнтських додатків з декількома серверними додатками. В цьому випадку ви можете або створювати в серверному додатку окремі завдання і окремі канали для кожного клієнтського додатка, або скористатися датаграммной сокетами. Останні дозволяють передавати дані відразу всіх вузлів мережі, хоча така можливість рідко використовується і часто блокується адміністраторами мережі.
Причина отстутствия гарантії доставки даних при використанні датаграммной сокетов полягає в використанні такими сокетами протоколу UDP, який, в свою чергу, заснований на протоколі з негарантованої доставкою IP. Потокові сокети працюють через протокол гарантованої доставки TCP.
Конструктори класу Socket
Найчастіше для створення сокетів в клієнтських додатках ви будете використовувати один з двох конструкторів, прототипи яких наведені нижче: public Socket (String host, int port); public Socket (InetAddress address, int port);
У класі Socket визначена ще одна пара конструкторів, яка, однак не рекомендується для використання: public Socket (String host, int port, boolean stream); public Socket (InetAddress address, int port, boolean stream);
У цих конструкторах останній параметр визначає тип сокета. Якщо цей параметр дорівнює true, створюється потоковий сокет, а якщо false - Датаграммним. Зауважимо, що для роботи з датаграммной сокетами слід використовувати клас DatagramSocket.
Методи класу Socket
Перелічимо найбільш цікаві, на наш погляд, методи класу Socket.
Перш за все, це методи getInputStream і getOutputStream, призначені для створення вхідного і вихідного потоку, відповідно: public InputStream getInputStream (); public OutputStream getOutputStream ();
Ці потоки пов'язані з сокетом і повинні бути використані для передачі даних по каналу зв'язку.
Метод getLocalPort повертає для даного сокета номер локального порту: public int getLocalPort ();
Після того як робота з сокетом завершена, його необхідно закрити методом close: public void close ();
І, нарешті, метод toString повертає текстовий рядок, що представляє сокет: public String toString ();
1. Створення графічного оформлення
Програма має вигляд:
Всі елементи вибираються з палітри інструментів наявних в програмному забезпеченні jBuilder v2.00. Для того що б розмістити вибраний пункт панелі, досить виділити його одноразовим натисканням, і «розтягнути» до потрібних розмірів на робочому просторі (bevelPanel1)
Саме верхній елемент, що містить текст localhost називається choiceControl. Це вікно вибору IP номера комп'ютера для здійснення зв'язку. Нижче слід елемент textFieldControl, в ньому буде відображатися статус підключення. Ці елементи знаходяться на вкладці JBCL.
І нижні два вікна jTextArea служать для передачі і прийому тексту. Але слід зазначити що підписи до цих вікон "Send:" і "Reciev:" створюються окремим елементом textControl з панелі інструментів.
Ще є чотири елементи jButton з вкладки Swing. Дані кнопки можна сказати не відрізняються від кнопок вкладки JBCL, і вибираються довільно. При створенні кнопки, за замовчуванням на ній буде напис-назва самого елемента кнопки. Для зміни цього тексту потрібно виділити кнопку одноразовим натисканням і на панелі Inspector (права частина екрану) і навпроти рядка text вписати потрібний текст.
2. Опсаніе програми
На початку будь-якої програми підключаються потрібні бібліотеки.
В Даному прикладі це:
Далі описуємо соккет, рядкові змінні, що входить і виходить потоки:
На наступному етапі створюємо вхідний і вихідний потоки, викликаючи для цього методи getInputStream і getOutputStream, відповідно: is = s.getInputStream (); os = s.getOutputStream ();
Далі додаток готує буфер buf для прийому даних і визначає змінну length, в яку буде записуватися розмір прийнятого блоку даних: byte buf [] = new byte [512]; int lenght;
Тепер все готово для запуску циклу прийому і обробки рядків від клієнтського додатка.