Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Java.doc
Скачиваний:
5
Добавлен:
17.04.2019
Размер:
261.63 Кб
Скачать

Розподілене програмування

Сокети були розроблені в університеті Бетлі в якості засобу, який полегшував програмування в мереж. Принцип сокетів з’явився спочатку в ОС Unix, а потім поширювався в усіх інших.

Сокет – це абстракція, яка ізолює програму від низькорівневих стеків протоколів TCP/IP. Сокет призначений для мереженого з’єднання одного додатку з іншим. Сокети працюють в основному з двома видами протоколів TCP та UDP протокол. Відмінність між цими двома протоколами полягає в тому, що TCP гарантує доставку пакетів, а UDP не гарантує доставку пакетів.

Java реалізує передачу датаграм на базі протоколу UDP використовуючи два класи:

  1. DatagramSocket

  2. DatagramPacket

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

TCP сокети використовуються для створення надійних двонаправлених з’єднань орієнтованих на роботу з потоками між вузлами Інтернет, типу точка - точка. В пакеті «java.net» існують 2 класи для роботи з ТСР сокетами: Socket i ServerSocket. Відмінність між цими двома класами полягає в тому, що ServerSocket чекає, поки клієнт не встановить з ним з’єднання. В результаті успішного з’єднання він повертає клас Socket, і тоді робота між сервером та клієнтом полягає в роботі між двома клієнтами. Процес створення клієнт-серверного зєднання можна описати наступними етапами:

  1. в програмі клієнта створюється екземпляр класу ServerSocket і викликається його метод Accept(), що призводить до переходу сервера в режим очікування підключення. «ServerSocket ss = new ServerSocket (2000); Socket s = ss.accept();»

  2. на стороні клієнта створюється екземпляр об’єкту Socket. При створенні цього екземпляру об’єкту, одразу здійснюється спроба встановити зв'язок з сервером. Якщо з‘єднання встановлене, то на сервері отримаємо Socket і можна здійснювати передачу даних.

  3. на стороні і сервера і клієнта створюються потоки вводу-виводу.Приклад: ImputStream ins = s.getImputStream(); OutputStream outs = s.getOutputStream();

  4. після завершення передачі даних знищуються об’єкти з пам’яті. Приклад: Ins.close();

Для створення сокетів можуть біти використані наступні конструктори:

  • Socket(String host,int Port) - встановлює зв'язок між поточною машиною клієнта із деяким вузлом Інтернет, ім’я якого задана з допомогою рядкової змінної. При цьому можемо отримати виключні ситуації IOexception i UncnonException

  • Socket(InetAddress adr, int port) – здійснює таку ж роботу як і попередній конструктор, однак точка зєднання задається деяким класом і нетадресою, даний вид конструктора може генерувати тільки виключна ситуація IOexception.

З об’єкта сокет в будь-який час можна отримати інформацію про адресу Інтернет вузла, до якого ми під єднанні та номера порта. Для цього в класі сонет існують наступні методи:

    • getInetAddress – повертає об’єкт InetAddress, який пов'язаний з даним сокетом.

    • getPort – повертає номер порта віддаленого комп’ютера, з яким встановлено зєднання.

    • getLocalPort – повертає номер порта, локальної машини, з якого здійснено підключення

Оскільки після створення сокета необхідно здійснювати прийом/передачу інформації, то необхідно отримати вхідні/вихідні потоки. Для цього в класі Сокет існують методи:

  • getInputStream – отримання вхідного потоку

  • getOutputStream – отримання вихідного потоку

Наведемо приклад деякого простого клієнта:

Import java.io.*

Import java.net.*

Public class Demo{

Public static void(String arg[]) throws Exception

{Int c;

Socket s = new Socket(“www.google.com”,so);

InputStream ins = s.getInputStream();

While (‘(c = ins.read())! = -1) {

System.out.println((char)c);

}

Ins.close;

s.close;

}

}

Відмітимо, що читання з потоку відбувається побайтово, не забуваємо, що java працює на базі Юні код символів (2-х байтова величина). Ознакою закінчення читання з потоку (так само як із файлу буде значення «-1»).

Для створення серверних частин використовується клас ServerSocket. Коли створюється об’єкт ServerSocket, він реєструє себе в ОС, говорячи про те, що готовий отримати підключення клієнтів по деякому вказаному порту. В цього класу є спеціальний метод accept, виклик якого призводить до блокування під процесу до тих пір, поки не буде здійснене підключення.

Після того, як встановлене підключення, accept повертає об’єкт socket. Існують два види конструкторів:

  1. ServerSocket(int Port)

  2. ServerSocket(int Port, int count) – порт створює SoccketServer на порті порт, однак, якщо даний порт зайнятий буде очікувати на його з’єднання максимум count мілі секунд.

Крім розглянутих вище класів, досить часто використовується наступні класи пакету java.net.

  • URL – це універсальний показник ресурсу. Являється найбільш фундаментальним елементом Інтернет. Даний клас надає простий програмний інтерфейс для доступу до інформації Інтернет. Клас URL має чотири види конструкторів:

  1. URL(String path) – найбільш часто даний вид конструктора використовується, оскільки адреса, ресурсу Інтернету. Наступні види конструкторів URL дозволяють виділити окремо певні частини URL.

  2. URL(String protocol, String host, int Port, String file)

  3. URL(String Protocol, String host, String file)

  4. URL(URL Content, String spеs) – даний вид конструктора дозволяє створити новий URL, використовуючи вже існуючий контекст URL. Для того, щоб отримати реальну інформацію з вказаного URL об’єкту необхідно на основі даного URL отримати підключення до заданого ресурсу. Це здійснюється з допомогою об’єкта «URL conection». URL conection – це об’єкт, який використовується для перевірки властивостей віддаленого ресурсу, або для одержання його вмісту. Отримати даний об’єкт можна скориставшись методом OpenConection класу URL.

Наведемо приклад:

Import java.io.*

Import java.net.*

Public class Demo{

Public static void main(String arg[]) throws Exception

{int c;

URL hp = new URL(“http”,”127.0.0.1”,80,”1”);

URL Conection con = hp.openConection();

System.out.printll(“Date”,hp.comGetDate());

If (comGetContent.lingth>0) {

System.out.println(“Context:”);

InputStream ins = con.getInputStream();

While((((c = in.read())!=-1)&&(-i>bezmegnisti))

{

System.out.println((char)c);

}

Ins.close();

} else {System.out.println(“No Content”);}

Com.close();

}}

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

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