Багато програмних засобів для Інтернету базуються на використанні TCP/IP протоколу. Цей протокол побудований на основі використання мережевих з’єднань – з’єднання спочатку налагоджується, потім здійснюється передача даних, а після цього з’єднання переривається. При створенні серверної програми використовується мережеве з’єднання до програм, що знаходяться на інших комп’ютерах. При з’єднанні відкривається порт з деяким стандартним номером і програма переходить в стан очікування на під’єднання клієнтських програм. При здійсненні з’єднання між клієнтом і сервером останній пропонує першому продовжити взаємодію через порт з іншим номером (ефемерним портом). Через звільнений порт зі стандартним номером будуть встановлюватись нові зв’язки. Номери портів TCP/IP призначаються комітетом IANA (Internet Assigned Numbers Authority). Стандартні номери знаходяться в діапазоні 1÷1023, ефемерні – 1024÷5000.
TCP/IP– сокети (socket) – порти комп’ютерів – використовуються для реалізації двонаправлених з’єднань між двома вузлами мережі Інтернет. Сокети дозволяють організувати взаємодію повноцінних програм і аплетів Java через мережу Internet. Це створює можливості опрацювання інформації за схемою клієнт– сервер, де в ролі сервера може виступати комп'ютер, під’єднаний до мережі, а не тільки Web–сервер. Робоча станція може виступати одночасно у ролі сервера чи клієнта.
Внутрішні деталі мережевого спілкування абстраговані й обробляються всередині системою JVM локальної машини, на якій встановлене середовище Java. Модель програмування полягає в накладанні оболонки (потоковим об'єктом) мережного під'єднання "сокет" і використанні методів для потокових об'єктів. Вбудована в Java множинність процесів є зручною для спілкуванні в мережі завдяки встановлення декількох з'єднань відразу.
Мова Java підтримує два типи мережевих з’єднань – клієнтські, що реалізуються з допомогою об’єктів класу Socket , та серверні, що реалізуються з допомогою об’єктів класуServerSocket.Клас Socket використовується як проміжна ланка між програмами введення - виведення на комп’ютері та лінією зв’язку .
Клас Socket призначений для створення об’єктів, відповідальних за з’єднання зі сторони клієнта. Недоступність з’єднання трактується як помилка. Об’єкти можна створити з допомогою двох конструкторів:
Socket(String host, int port) – при створенні об’єкту встановлюється з’єднання між локальним комп’ютером та вказаним портом вузла мережі Інтернет за його іменем. При виявленні помилки генеруються виняткові ситуаціїї типів UnknownHostException та IOException.
Socket(InetAddress address, int port) – при створенні об’єкту встановлюється з’єднання між локальним комп’ютером та вказаним портом вузла мережі Інтернет за його адресою у виді об’єкту класу InetAddress. При виявленні помилки генеруються виняткові ситуації типу IOException.
Методи об’єкту класу Socket дозволяють отримувати наступну інформацію про локальний та віддалений комп’ютери:
getInetAddress– повертає вказівник на об’єкт типу InetAddress, зв’язаний з даним об’єктом класу Socket;
getPort – повертає номер порту на віддаленому вузлі;
getLocalPort – повертає номер локального порту, призначеного для об’єкту типу Socket;
Після створення об’єкту класу Socket його методами можна отримувати доступ до вхідного та вихідного потоків даних:
getInputStream– повертає об’єкт вхідного потоку InputStream, призначений до об’єкту класу Socket;
getOutputStream – повертає об’єкт вихідного потоку OutputStream, призначений до об’єкту класу Socket;
close– закриття вхідного та вихідного потоків об’єкту типу Socket.
Наведемо прикла клієнта :
Клієнт:
import java.net.*; // підтримка клієнт серверних функцій
import java.io.*; // підтримка функцій вводу виводу
public class MyClient {
class Session extends Thread {
Socket socket; // отримання сокет сесії
public Session(Socket s) {socket = s;}
public void run(){
// процедура для прийняття, обробки читання на виводу на екран
// потоків вводу виводу прийнятих від сервера
}
public MyClient(){ // конструктор – початкова ініціалізація
try{
Socket clientSocket = new Socket("127.0.0.1",(<номер порта>);
Session ses = new Session(clientSocket); //
ses.start(); // запуск треда сесії для асинхронного прийняття
// інформації
// процедура створення, обробки та відправки потоків вводу виводу
clientSocket.close(); // закриття сокету
} catch (Exception e){System.out.println(e);}
}
public static void main(String arg[])
{
new MyClient();
}
}
2. Класи серверів
Клас ServerSocket призначений для створення об’єктів, які відповідають за з’єднання зі сторони сервера, він очікує, поки клієнт встановить з ним з’єднання. Об’єкт типу ServerSocket реєструється в системі про готовність організувати з’єднання з клієнтами. Два конструктори, створюючи об’єкти класу ServerSocket, дозволяють задати номер порта для з’єднання з клієнтом та час очікування на звільнення порту (Необов’язковий парметр. Якщо порт є зайнятий, очікування на звільнення здійснюється countмілісекунд. ):
ServerSocket(int port); – створення об’єкту для даного порту;
ServerSocket(int port, int count); – створення сокету для даного порту.
Як ми бачимо з конструкторів клас ServerSocket не налагоджує фізичного зв’язку з віддаленими комп’ютерами, а вказує системі правила доступу до конкретного порту з врахуванням часу прослуховування порту тощо. Після зв’язування програми з портом з допомогою метода accept() можна під’єднатися до цього порту і почати прослуховувати вхідні повідомлення. Процес виконання програми блокується поки деякий клієнт не встановить з’єднання до даного порту. Після встановлення з’єднання метод accept() повертає у процес, який його викликав, вказівник на об’єкт класу Socket.
Схема з’єднання клієнта і сервера представлена на рис.3.
Рис.3. Використання класів для з’єднання клієнтів зсервером
Окремі класи Java призначені для підтримки передачі пакетів на основі UDP протоколу, а саме: DatagramPacket – об’єкти цього класу (контейнери) призначені для зберігання даних пакетів, які пересилаються; DatagramSocket – об’єкти призначені для реалізації пересилання (відправлення та приймання).
Наведемо приклад серверної програми:
import java.net.*; // бібліотека підтримки клієнт-серверних функцій
import java.io.*; // бібліотека підтримки функцій вводу виводу
public class MyServer {
class Session extends Thread {
Socket socket; // отримання сокет сесії
public Session(Socket s) {socket = s;}
public void run(){
//процедура створення та обробки потоків вводу виводу
}
public MyServer(){
try{
ServerSocket serverSocket = new ServerSocket(<номер порта>);
// Цикл що чекає під єднання клієнта
while(true){
Socket clientSocket;
System.out.println("Listen...");
try{
clientSocket = serverSocket.accept();
Session ses = new Session(clientSocket);
ses.start();
} catch (IOException e) {System.out.println("Error of receiving...");}
}
} catch (IOException e) {
System.out.println("Port <номер порта> is bizy...");