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

1.1.2 Програмні засоби Java для роботи з сокетами

При створенні сокетів, з використанням мови програмування Java, в основному використовуються класи та методи двох пакетів java.net та java.io.

Зокрема, у пакеті java.net є два стандартних класи: java.net.Socket та java.net.ServerSocket.

Клас Socket застосовується для організації звичайного двостороннього обміну даними та має чотири конструктора:

public Socket(String host, int port) throws UnknownHostException, IOException;

public Socket(InetAddress address, int port) throws IOException;

public Socket(String host, int port, boolean stream) throws IOException;

public Socket(InetAddress address, int port, boolean stream) throws IOException.

Перший конструктор дозволяє створити сокет, задавши доменне ім'я комп'ютера, з яким треба встановити зв'язок (параметр типу String), та номер порта на цьому комп'ютері.

Другий створює сокет з використанням об'єкта типу InetAddress.

Третій та четвертий конструктори аналогічні двом першими, але додатково дозволяють задати булевськє значення, що вказує, чи належний для реалізації сокета буде використаний протокол на основі даних (наприклад, TCP). По умовчанню використовується TCP, але якщо передано значення false, буде використаний ненадійний протокол на основі дейтаграм, наприклад UDP.

Об'єкт класу InetAddress містить IP-адрес комп'ютера в мережі. У нього немає конструкторів, оголошених як public, але є ряд статичних методів, які повертають екземпляри класу InetAddress. Таким чином, об'єкт InetAddress можна створити шляхом звертання до статичного методу, наприклад:

try{

InetAddress remoteOP =

InetAddress.getByName("www.mysoft.com");

InetAddress allRemoteIPs =

InetAddress.getAllByName("www.mysoft.com");

InetAddress myIP = InetAddress.getLocalHost();

}

catch(UnknownHostException e)

{

System.out.println("Unknown host: " + e);

// Невідомий хост

}

Перший метод повертає об'єкт InetAddress, що містить IР-адрес сервера www.mysoft.com. Другий створює масив об'єктів InetAddress, по одному на кожний IP-адрес, асоційований з www.mysoft.com. Останній метод створює InetAddress з IP-адресою локальної машини. Всі вони можуть збуджувати виключення UnknownHostException.

Клас Socket має також методи для роботи з потоками даних: getInputStream() і getOutputStream(), які повертають відповідно потоки уведення та виводу. Щоб полегшити написання додатків, ці потоки, як правило, надбудовуються іншим потоковим об'єктом, а саме DataInputStream та PrintStream відповідно. Методи getInputStream() та getOutputStream() можуть збуджувати виключення IOException, що повинне бути перехоплене та оброблено, наприклад:

try

{

Socket netspace = new Socket("www.netspace.org",7);

DataInputStream input =

new DataInputStream(netspace.getInputStream());

PrintStream output =

new PrintStream(netspace.getOutputStream());

}

catch(UnknownHostException e)

{

System.out.println("Unknown host: " + e);

}

catch(IOException exept)

{

System.out.println{"FailedI/O:" + exept);

}

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

output.println("test");

String testResponse = input.readLine();

Завершивши обмін даними через сокет, необхідно спочатку закрити об'єкти InputStream і OutputStream, а потім уже сам сокет:

output.close ();

input.close();

netspace.close ();

Для створення сервера TCP, при реалізації сокет-технології, java використовує клас ServerSocket. Він має два конструктора:

public ServerSocket(int port) throws IOException;

public ServerSocket(int port, int count) throws IOException;

Перший з них створює сокет, підключений до зазначеного порту. По умовчанню, у черзі очікування з'єднання може перебувати до 50 клієнтів. Другий конструктор дає можливість задати довжину черги.

Після створення об'єкта ServerSocket можна використовувати метод accept() для очікування підключення клієнтів. Цей метод блокується до моменту підключення клієнта, а потім повертає об'єкт Socket для зв'язку із клієнтом. Блокування (blocking) термін, що означає, що процедура входить у внутрішній нескінченний цикл, що переривається при настанні певної події. Потік виконання програми не йде далі блокованої процедури до її завершення, тобто до настання цієї події.

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

try

{

ServerSocket server = new ServerSocket(2222);

Socket clientConn = server.accept();

DataInputStream input =

new DataInputStream(з1ientConn.getInputSt ream());

PrintStream output =

new PrintStream(clientConn.getOutputStream());

}

catch(IOException excpt)

{

System.println("Failed I/O: ” + excpt);

}

Після завершення зв'язку із клієнтом сервер повинен закрити потоки, а потім закрити сокет, як зазначено вище.

У той час у пакеті java.io є ряд класів та методів, які широко використовуються при реалізації сокет-технології в Java.

До них відносяться класи DataInputStream, PrintStream, BufferedReader, PrintWriter, InputStreamReader, OutputStreamWriter.

Класи DataInputStream і BufferedReader призначені для читання тексту з потоку символів. Вони мають методи з однаковими іменами та призначенням, найбільш важливі з них:

  • readLine() - метод для читання рядка потоку;

  • read() - метод для читання одного символу потоку;

  • close() - метод для закриття потоку.

Класи PrintStream та PrintWriter використовуються для формування потоку символів. Вони мають методи з однаковими іменами та призначенням, найбільш важливі з них:

  • write(String) - метод для запису рядка в потік;

  • println(String) - метод для запису рядка, що завершується символом переходу на новий рядок, у потік;

  • close() - метод для закриття потоку.

Клас InputStreamReader перетворює потік байт у символьний потік.

Клас OutputStreamWriter перетворює символьний потік у байтовий.

Соседние файлы в папке [КОМП СИСТЕМЫ]