
- •1 Створення клієнт/серверних додатків на java з використанням tcp сокетів
- •1.3 Опис лабораторної установки (програмного забезпечення).
- •1.4 Порядок виконання роботи і методичні вказівки з її виконання.
- •Лабораторна робота №2
- •1.2 Методичні вказівки з організації самостійної роботи студентів.
- •1.2.1Классы DatagramPacket и DatagramSocket
- •1.3 Описание лабораторной устанвки (програмного обеспечения)
- •1.4 Порядок выполнения работы и методические указания для ее выполнения
- •3.2 Методичні вказівки з організації самостійної роботи студентів.
- •3.2 Методичні вказівки з організації самостійної роботи студентів.
3.2 Методичні вказівки з організації самостійної роботи студентів.
3.3 Опис лабораторної установки (програмного забезпечення).
Для успішного виконання лабораторної роботи необхідно встановити середовище розробки IntelliJ IDEA
3.4 Порядок виконання роботи і методичні вказівки з її виконання
3.4.1 . Завантажити проект «3» з папки HTTP (за посиланням на GooglDisk)
3.4.2 . Закрити вікно Tip of the Day (Close)
3.4.3 Після появи у вікні структури і текста модулів проекта виконати модуль httpClient. Зверніть увагу на послідовність обробки запитів.
3.4.4 Структуру проекту, текст модулів та результати виконання проекту скопіювати до звіту.
3.4.5 Додаткова інформація для виконання лабораторної роботи
Консольна програма - завантажувач файлів по протоколу HTTP створена шляхом відправки GET запиту на відповідний URL і збереження в файл байтового потоку відповіді.
Список URL для завантаження повинен зберігається в файлі list.txt в корені проекту . При бажанні можна зробити можливість його вказівки в аргументі запуску програми. Кожен URL повинен зберігатися в файлі з нового рядка, наприклад:
http://www.protocols.ru/files/RFC/rfc-793.pdf
http://www.postgresql.org/files/documentation/pdf/9.4/postgresql-9.4-A4.pdf
http://www.planwallpaper.com/static/images/kartandtinki1_photo-wallpapers_02.jpg
http://webneel.com/wallpaper/sites/default/files/images/04-2013/Rainy-Weather_2.jpg
http://webneel.com/wallpaper/sites/default/files/images/08-2013/23-3d-beach-sand-wallpaper.jpg
http://www.wdc.com/wdproducts/library/UM/RUS/4779-705013.pdf
Програма зчитує построково URL з файлу. Потім використовуючи клас HttpClient з бібліотеки Apache HttpComponents GET формується запит на цей URL.
Якщо отримана відповідь 200 (ОК) означає що запит прийнятий і помилок немає, то потрібно отримати InputStream потік і створивши відповідний потік FileOutputStream (краще додати також буферизацию потоків) в циклі зберегти інформацію в файл на диск.
Можна попередньо створювати на диску директорію для збереження файлів, що завантажуються.
Стороння бібліотека Apache HttpComponents містить набір класів і утиліт для високорівневої роботи з HTTP. Вона дозволяє дуже зручно і швидко створювати клієнтські запити та обробляти відповіді сервера. Сторінка проекту в інтернеті https://hc.apache.org/.
У даній лабораторній роботі буде використовуватися модуль Apache HttpClient.
Можна завантажити бібліотеку у вигляді банку файлу та підключити її до проекту. Можна (і краще) зробити це автоматично, прописавши необхідні залежності у файлі pom.xml. Цей файл використовується одним з найбільш поширених фреймворків для автоматизації збирання проектів Maven.
При вказівці відповідних залежностей, бібліотеки будуть завантажені з репозиторіїв автоматично при складанні проекту.
Фреймворк для автоматизації збирання проектів Maven набагато більш функціональний та його використання набагато ширше ніж просто підтягування залежностей, але його вивчення виходить за рамки даної лабораторної роботи.
Для початку створимо новий Java Project. Потім конвертуємо його в Maven.
Рисунок 2.1. – Конвертація проекту в Maven
Після натискання кнопки Finish в вашому проекті повинен з'явитися pom.xml.
Далі необхідно додати залежності. Для цього скопіюємо та додамо в pom.xml всередині секції <проект> ... </ проект> бібліотечну залежність:
<dependencies>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
</dependencies>
Після збереження pom.xml бібліотека HttpClient автоматично буде підтягнута в наш проект.
Уривчасті приклади коду, які можна використовувати.
// Читання рядків з файлу
InputStream fis = new FileInputStream(fileName);
InputStreamReader isr = new InputStreamReader(fis,
Charset.forName("UTF-8"));
BufferedReader br = new BufferedReader(isr);
// Далі можна в циклі зчитувати рядки
line = br.readLine (); // Повертає String, NULL якщо кінець
// Створення HTTP клієнта і GET запиту
HttpClient client = HttpClientBuilder.create().build();
HttpGet request = new HttpGet(line);
// add request header
request.addHeader("User-Agent", USER_AGENT);
// User-Agent
// Відправлення та отримання відповіді
HttpResponse response = client.execute(request);
// Для отримання вхідного потоку після відповіді сервера клієнтові
BufferedInputStream bis = new BufferedInputStream(response
.getEntity().getContent());
// Зберігати в файл. Можна просто поставити якесь ім'я файлу
OutputStream output = new BufferedOutputStream(
new FileOutputStream(DEFAULT_DIRECTORY_NAME
+ "\\" +outputFileName));
// Цикл читання з вхідного потоку і запису у вихідний
int b = 0;
while ((b = bis.read()) != -1) {
output.write(b);
}
output.close();
// Робота з директоріями
File dir = new File(directoryName);
// if the directory does not exist, create it
if (!dir.exists()) {
System.out.println("Creating directory: " + directoryName);
try {
dir.mkdir();
}
//……….
//import org.apache.http.client.*;
//import org.apache.http.client.methods.*;
//import org.apache.http.*;
//import org.apache.http.impl.client.HttpClientBuilder;
//
//import java.io.*;
//import java.io.BufferedReader;
//import java.io.InputStreamReader;
//import java.util.ArrayList;
//import java.util.List;
//
//import org.apache.http.HttpResponse;
//import org.apache.http.NameValuePair;
//import org.apache.http.client.HttpClient;
//import org.apache.http.client.entity.UrlEncodedFormEntity;
//import org.apache.http.client.methods.HttpGet;
//import org.apache.http.client.methods.HttpPost;
//import org.apache.http.impl.client.DefaultHttpClient;
//import org.apache.http.message.BasicNameValuePair;
//
//
//public class httpClient {
//
// String line = "http://www.protocols.ru/files/RFC/rfc-793.pdf";
// //Створення HTTP клієнта і GET запиту
// HttpClient client = HttpClientBuilder.create().build();
// HttpGet request = new HttpGet(line);
// // add request header
// request.addHeader("User‐Agent", USER_AGENT);
// // User‐Agent
// //Відправлення та отримання відповіді
// HttpResponse response = client.execute(request);
//
//
//// // Читання рядків з файлу
//// InputStream fis = new FileInputStream(fileName);
//// InputStreamReader isr = new InputStreamReader(fis,
//// Charset.forName("UTF‐8"));
//// BufferedReader br = new BufferedReader(isr);
////// Далі можна в циклі зчитувати рядки
//// line = br.readLine (); // Повертає String, NULL якщо кінець
//// // Створення HTTP клієнта і GET запиту
//// HttpClient client = HttpClientBuilder.create().build();
//// HttpGet request = new HttpGet(line);
////// add request header
////request.addHeader("User‐Agent", USER_AGENT);
//// // User‐Agent
////// Відправлення та отримання відповіді
//// HttpResponse response = client.execute(request);
//// // Для отримання вхідного потоку після відповіді сервера клієнтові
//// BufferedInputStream bis = new BufferedInputStream(response
//// .getEntity().getContent());
//// // Зберігати в файл. Можна просто поставити якесь ім'я файлу
//// OutputStream output = new BufferedOutputStream(
//// new FileOutputStream(DEFAULT_DIRECTORY_NAME
//// + "\\" +outputFileName));
//// // Цикл читання з вхідного потоку і запису у вихідний
//// int b = 0;
////while ((b = bis.read()) != ‐1) {
//// output.write(b);
//// }
////output.close();
//// // Робота з директоріями
//// File dir = new File(directoryName);
////// if the directory does not exist, create it
////if (!dir.exists()) {
//// System.out.println("Creating directory: " + directoryName);
//// try {
//// dir.mkdir();
//// }
//////……….
////// Створення пулу потоків
//// ExecutorService pool = Executors.newFixedThreadPool(THREAD_COUNT);
//// // Додати в пул на виконання завдання - об'єкт класу імплементує
//// інтерфейс Runnable. Його потрібно створити окремо
//// Runnable task = new YourClass(…);
//// pool.submit(task);
////// В кінці програми зупиняємо пул потоків, щоб програма завершилася
//// а не працювала нескінченно. Пул буде зупинений після відпрацювання
//// останнього завдання яке було в пулі.
//// pool.shutdown();
//}
//
//
import java.io.*;
import java.nio.charset.Charset;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
public class httpClient {
private static final String USER_AGENT = "Mozilla/5.0";
// private static final String POST_URL = "http://localhost:9090/SpringMVCExample/home";
public static void main(String[] args) throws IOException {
sendGET();
System.out.println("GET DONE");
// sendPOST();
// System.out.println("POST DONE");
}
private static void sendGET() throws IOException {
InputStream fis = new FileInputStream("./list.txt");
InputStreamReader isr = new InputStreamReader(fis,
Charset.forName("UTF-8"));
BufferedReader br = new BufferedReader(isr);
String GET_URL;
while ((GET_URL = br.readLine()) != null) {
System.out.println(GET_URL);
//String GET_URL = "http://webneel.com/wallpaper/sites/default/files/images/04-2013/Rainy-Weather_2.jpg";
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(GET_URL);
httpGet.addHeader("User-Agent", USER_AGENT);
CloseableHttpResponse httpResponse = httpClient.execute(httpGet);
String urlSplit[] = GET_URL.split("/");
String name = urlSplit[urlSplit.length - 1];
System.out.println("GET Response Status:: "
+ httpResponse.getStatusLine().getStatusCode());
BufferedInputStream reader = new BufferedInputStream(httpResponse.getEntity().getContent());
/*new BufferedReader(new InputStreamReader(
httpResponse.getEntity().getContent()));*/
OutputStream output = new BufferedOutputStream(
new FileOutputStream("./" + name));
int length = -1;
byte[] buffer = new byte[1024];// buffer for portion of data from connection
while ((length = reader.read(buffer)) > -1) {
output.write(buffer, 0, length);
}
output.flush();
output.close();
reader.close();
httpClient.close();
}
}
}
3.5 Зміст звіту.
1. Титульний аркуш.
2. Назва та мета лабораторної роботи.
3. Лістинг програми з IntelliJ IDEA.
4. Скріншот зі створенними класами та каталогами з IntelliJ IDEA.
5. Скріншоти директорії зі завантаженими файлами та консолі.
6. Висновки по роботі щодо отриманих навиків та особливостей створення завантажувача на Java.
7. Відповіді на контрольні запитання.
3.6 Контрольні запитання і завдання.
1. З якою метою в проекті використується Maven?
2. Обґрунтувати використання класу Executor та інтерфейсу ExecutorService.
3. Перерахуйте основні методи, які використовувалися для написання програми.
4. Яким чином буде здійснюватися створення HTTP клієнта і GET запиту.
ЛАБОРАТОРНА РОБОТА№ 4
Тема: ВЗАЄМОДІЯ З ВЕБ СЕРВЕРОМ ПО ПРОТОКОЛУ HTTP.
( багатопотокова версії програми )
3.1 Мета роботи: навчитися створювати Java-програми для клієнтів, які здійснюють взаємодію з сервером по протоколу HTTP. Вивчення можливості бібліотеки ApacheHttpComponents. Робота з багатозадачністю з використанням пулу потоків з бібліотеки Concurrency. Використання фреймворка для автоматизації збирання проектів Maven для опису і завантаження бібліотек-залежностей проекту.