Краткие тексты лекций.

Вступ

План

Тема 20 Пакет java.net. Робота по протоколу TCP та UDP. Клас InetAddress

План

Метод printURLAddresssInfo

Метод openConnection

Метод openConnection призначений для створення каналу між додатком і мережним ресурсом, представленим об'єктом класу URL:

 

public URLConnection openConnection();

Метод printURLAddresssInfo виводить на консоль текстове подання об'єкта URL і його окремих компонентів, витягнутих відповідними методами класу URL:

 

System.out.println("URL Address: " + u);

System.out.println("Host: " + u.getHost());

System.out.println("Port: " + u.getPort());

System.out.println(

"Protocol: " + u.getProtocol());

System.out.println(

"Filename: " + u.getFile());

System.out.println(

"Reference: " + u.getRef());

System.out.println(

"External Form: " + u.toExternalForm());

 


 

Тема 19 Пакет java.net. Використання класу URLConnection. Завантаження даних на сервер. Обов'язкова контрольна робота

 

URLConnection—объект, который мы используем либо для проверки свойств удаленного ресурса, адресуемого URL, либо для получения его содержимого. В приведенном ниже примере мы создаем URLConnection с помощью метода openConnection, вызванного с объектом URL. После этого мы используем

 

import java.net.*;

import java.io.*;

class localURL {

public static void main(String args[]) throws Exception {

int c;

URL hp = new URL("http", "127.0.0.1", 80, "/");

URLConnection hpCon = hp.openConnection();

System.out.println("Date: " + hpCon.getDate());

System.out.println("Type: " + hpCon.getContentType());

System.out.println("Exp: " + hpCon.getExpiration());

System.out.println( "Last M: " + hpCon.getLastModified());

System.out.println("Length: " + hpCon.getContentLength());

if (hpCon.getContentLength() > 0) {

System.out.println("=== Content ===");

InputStream input = hpCon.getInputStream();

int i=hpCon.getContentLength();

while (((c = input. read()) != -1) && (—i > 0)) {

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

}

input.close();

}

else {

System.out.println("No Content Available");

}

}

}

 

Эта программа устанавливает HTTP-соединение с локальным узлом по порту 80 (у вас на машине должен быть и установлен Web-сервер) запрашивает документ по умолчанию, обычно это—. После этого программа выводит значения заголовка, запрашивает и выводит содержимое документа.


 

1 Вступ

2 Обробка виняткової ситуації при з’єднанні

 

Пакет java.net також надає доступ до протоколів більше низького рівня - TCP і UDP. Для цього спочатку треба ознайомиться із класом InetAddress, що є інтернет-адресою, або IP. Екземпляри цього класу створюються не за допомогою конструкторів, а за допомогою статичних методів:

 

InetAddress getLocalHost()

InetAddress getByName(String name)

InetAddress[] getAllByName(String name)

 

Перший метод повертає IP-Адреса машини, на якій виконується Java-Програма. Другий метод повертає адресу сервера, чиє ім'я передається як параметр. Це може бути як DNS-Ім'я, так і числовий IP, записаний у вигляді тексту, наприклад, "67.11.12.101". Нарешті третій метод визначає всі IP-Адреси зазначеного сервера.

Для роботи з TCP-Протоколом використовуються класи Socket і ServerSocket. Першим створюється ServerSocket - сокет на стороні сервера. Його найпростіший конструктор має тільки один параметр - номер порту, на якому будуть прийматися вхідні запити. Після створення викликається метод accept(), що припиняє виконання програми й очікує, поки який-небудь клієнт не инициализирует з'єднання. У цьому випадку робота сервера відновляється, а метод повертає екземпляр класу Socket для взаємодії із клієнтом:

 

try {

ServerSocket ss = new ServerSocket(3456);

Socket client=ss.accept(); // Метод не повертає керування, поки не

підключиться клієнт

} catch (IOException e) {

e.printStackTrace();

}

 

Клієнт для підключення до сервера також використовується клас Socket. Його найпростіший конструктор приймає два параметри - адреса сервера (у вигляді рядка або екземпляра InetAddress) і номер порту. Якщо сервер прийняв запит, то сокет конструюється успішно, і далі можна скористатися методами getInputStream() або getOutputStream().

try {

Socket s = new Socket("localhost", 3456);

InputStream is = s.getInputStream();

is.read();

} catch (UnknownHostException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

2 Обробка виняткової ситуації при з’єднанні

Зверніть увагу на обробку виняткової ситуації UnknownHostException, що буде генеруватися, якщо віртуальна машина за допомогою операційної системи не зможе розпізнати зазначену адресу сервера у випадку, якщо він заданий рядком. Якщо ж він заданий екземпляром InetAddress, то цю помилку треба обробляти при виклику статичних методів цього класу.

На стороні сервера клас Socket використовується точно в такий же спосіб - через методи getInputStream() і getOutputStream(). Приведемо більше повний приклад:

 

import java.io.*;

import java.net.*;

public class Server {

public static void main(String args[]) {

try {

ServerSocket ss = new ServerSocket(3456);

System.out.println("Waiting...");

Socket client=ss.accept();

System.out.println("Connected");

client.getOutputStream().write(10);

client.close();

ss.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

 

Сервер по запиті клієнта відправляє число 10 і завершує роботу. Зверніть увагу, що при завершенні викликаються методи close() для відкритих сокетів. Клас клієнта:

 

import java.io.*;

import java.net.*;

public class Client {

public static void main(String args[]) {

try {

Socket s = new Socket("localhost", 3456);

InputStream is = s.getInputStream();

System.out.println("Read: "+is.read());

s.close();

} catch (UnknownHostException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

}

 

Після запуску сервера, а потім клієнта, можна побачити результат - отримане число 10, після чого обидві програми закриються.

Розглянемо ці класи більш докладно. По-перше, клас ServerSocket має конструктор, у який передається крім номера порту ще й адреса машини. Це може здатися дивним, адже сервер відкривається на тій же машині, де працює програма, навіщо спеціально вказувати її адресу? Однак якщо комп'ютер має кілька мережних інтерфейсів (мережних карток), те він має й кілька мережних адрес. За допомогою такого деталізованого конструктора можна вказати, по якій саме адресі очікувати підключення. Це повинен бути саме локальна адреса машини, інакше виникне помилка.

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

По-друге, можна скористатися методом setSoTimeout(int timeout) класу ServerSocket, щоб указати час у миллисекундах, протягом якого потрібно очікувати підключення клієнта. Це дозволяє не "зависати" серверу, якщо ніхто не намагається почати з ним працювати. Таймаут задається в миллисекундах, нульове значення означає нескінченний час очікування.

Важливо підкреслити, що після встановлення з'єднання із клієнтом сервер виходить із методу accept(), тобто перестає бути готів приймати нові запити. Однак як правило бажано, щоб сервер міг працювати з декількома клієнтами одночасно.

Для цього необхідно при підключенні чергового користувача створювати новий потік виконання, що буде обслуговувати його, а основний потік знову ввійде в метод accept(). Приведемо приклад такого рішення:

 

import java.io.*;

import java.net.*;

public class NetServer {

public static final int PORT = 2500;

private static final int TIME_SEND_SLEEP = 100;

private static final int COUNT_TO_SEND = 10;

private ServerSocket servSocket;

public static void main(String[] args) {

NetServer server = new NetServer();

server.go();

}

public NetServer() {

try{

servSocket = new ServerSocket(PORT);

}catch(IOException e){

System.err.println("Unable to open Server Socket : " + e.toString());

}

}

public void go() {

// Клас-Потік для роботи із клієнтом, що підключився

class Listener implements Runnable{

Socket socket;

public Listener(Socket aSocket){

socket = aSocket;

}

public void run(){

try{

System.out.println("Listener started");

int count = 0;

OutputStream out = socket.getOutputStream();

OutputStreamWriter writer = new OutputStreamWriter(out);

PrintWriter pWriter = new PrintWriter(writer);

while(count<COUNT_TO_SEND){

count++;

pWriter.print(((count>1)?",":"")+ "Say" + count);

sleeps(TIME_SEND_SLEEP);

}

pWriter.close();

}catch(IOException e){

System.err.println("Exception : " + e.toString());

}

}

}

// Основний потік, що циклічно виконує метод accept()

System.out.println("Server started");

while(true){

try{

Socket socket = servSocket.accept();

Listener listener = new Listener(socket);

Thread thread = new Thread(listener);

thread.start();

}catch(IOException e){

System.err.println("IOException : " + e.toString());

}

}

}

public void sleeps(long time) {

try{

Thread.sleep(time);

}catch(InterruptedException e){

}

}

}

 

Тепер оголосимо клієнта. Ця програма буде запускати кілька потоків, кожний їх яким незалежно підключається до сервера, зчитує його відповідь і виводить на консоль.

 

import java.io.*;

import java.net.*;

public class NetClient implements Runnable{

public static final int PORT = 2500;

public static final String HOST = "localhost";

public static final int CLIENTS_COUNT = 5;

public static final int READ_BUFFER_SIZE = 10;

private String name = null;

public static void main(String[] args) {

String name = "name";

for(int i=1; i<=CLIENTS_COUNT; i++){

NetClient client = new NetClient(name+i);

Thread thread = new Thread(client);

thread.start();

}

}

public NetClient(String name) {

this.name = name;

}

public void run() {

char[] readed = new char[READ_BUFFER_SIZE];

StringBuffer strBuff = new StringBuffer();

try{

Socket socket = new Socket(HOST, PORT);

InputStream in = socket.getInputStream();

InputStreamReader reader = new InputStreamReader(in);

while(true){

int count = reader.read(readed, 0, READ_BUFFER_SIZE);

if(count==-1)break;

strBuff.append(readed, 0, count);

Thread.yield();

}

} catch (UnknownHostException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

System.out.println("client " + name + " read : " + strBuff.toString());

}

}

Розглянемо UDP. Для роботи із цим протоколом і на стороні клієнта, і на стороні сервера використовується клас DatagramSocket. У нього є наступні конструктори:

 

DatagramSocket()

DatagramSocket(int port)

DatagramSocket(int port, InetAddress laddr)

 

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

Після відкриття сокетів починається обмін датаграмами. Вони представляються екземплярами класу DatagramPacket. При відсиланні повідомлення застосовується наступний конструктор:

 

DatagramPacket(byte[] buf, int length, InetAddress address, int port)

 

Масив містить дані для відправлення (створений пакет буде мати довжину рівну length), а адреса й порт указують одержувача пакета. Після цього викликається метод send() класу DatagramSocket.

 

try {

DatagramSocket s = new DatagramSocket();

byte data[]={1, 2, 3};

InetAddress addr = InetAddress.getByName("localhost");

DatagramPacket p = new DatagramPacket(data, 3, addr, 3456);

s.send(p);

System.out.println("Datagram sent");

s.close();

} catch (SocketException e) {

e.printStackTrace();

} catch (UnknownHostException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

 

Для одержання датаграми також створюється екземпляр класу DatagramPacket, але в конструктор передається лише масив, у який будуть записані дані після одержання (також вказується очікувана довжина пакета). Сокет необхідно створити із вказівкою порту, інакше швидше за все повідомлення просто не дійде до адресата. Використовується метод receive() класу DatagramSocket (аналогічно методу ServerSocket.accept() цей метод також перериває виконання потоку, поки не прийде запит від клієнта). Приклад реалізації одержувача:

 

try {

DatagramSocket s = new DatagramSocket(3456);

byte data[]=new byte[3];

DatagramPacket p = new DatagramPacket(data, 3);

System.out.println("Waiting...");

s.receive(p);

System.out.println("Datagram received: "+data[0]+", "+data[1]+", "+data[2]);

s.close();

} catch (SocketException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

Якщо запустити спочатку одержувача, а потім відправника, то можна побачити, що перший надрукує вміст отриманої датаграми, а потім програми завершать свою роботу.

На закінчення приведемо приклад сервера, що одержує датаграми й відправляє їх обернено, дописавши до них слово received.

 

import java.io.*;

import java.net.*;

public class DatagramDemoServer {

public static final int PORT = 2000;

private static final int LENGTH_RECEIVE = 1;

private static final byte[] answer = ("received").getBytes();

private DatagramSocket servSocket = null;

private boolean keepRunning = true;

public static void main(String[] args) {

DatagramDemoServer server = new DatagramDemoServer();

server.service();

}

public DatagramDemoServer() {

try{

servSocket = new DatagramSocket(PORT);

}catch(SocketException e){

System.err.println("Unable to open socket : " + e.toString());

}

}

protected void service() {

DatagramPacket datagram;

InetAddress clientAddr;

int clientPort;

byte[] data;

while(keepRunning){

try{

data = new byte[LENGTH_RECEIVE];

datagram = new DatagramPacket(data, data.length);

servSocket.receive(datagram);

clientAddr = datagram.getAddress();

clientPort = datagram.getPort();

data = getSendData(datagram.getData());

datagram = new DatagramPacket(data, data.length, clientAddr, clientPort);

servSocket.send(datagram);

}catch(IOException e){

System.err.println("I/O Exception : " + e.toString());

}

}

}

protected byte[] getSendData(byte b[]) {

byte[] result = new byte[b.length+answer.length];

System.arraycopy(b, 0, result, 0, b.length);

System.arraycopy(answer, 0, result, b.length, answer.length);

return result;

}

}



 

Список літератури

 

1 Роберт Орфали, Дэн Харки Java и CORBA в приложениях клиент-сервер. — М.: Лори, 2010. — 734 с.

2 Стивен Стелтинг Java без сбоев. Обработка исключений, тестирование, отладка. — СПб.: Кудиц-Образ, 2005. — 464 с.

3 Х.М. Дейтел, П. Дж. Дейтел Как программировать на Java. Книга 2. Файлы, сети, базы данных. — СПб.: Бином-Пресс, 2006. — 672 с.

4 В. Монахов Язык программирования Java и среда NetBeans. — СПб.: БХВ-Петербург, 2011. — 704 с.

5 Кей С. Хорстманн, Гари Корнелл Библиотека профессионала. Java 2. — М.: Вильямс, 2008. — 1168 с.

6 Брюс Эккель Филосифия Java. — СПб.: Питер, 2011. — 640 с.

7 Мартин К. Соломон, Нирва Мориссо-Леруа Oracle. Программирование на языке Java. — М.: Лори, 2010. — 512 с.

8 Тимур Машнин Современные Java-технологии на практике. — СПб.: БХВ-Петербург, 2010. — 560 с.

9 Васильев А.Н. Самоучитель Java с примерами и программами. — М.: Наука и техника, 2011. — 352 с.


 

Тема: Введение. Предмет, специфика, содержание курса.

 

Основные вопросы лекции:

1.Предмет и содержание курса «Детская литература».

2.Детская литература - своеобразная область искусства.

3.Специфика детской литературы.

4.Понятия «память детства», «детское чтение», «детская литература».

 

Детская литература - неотъемлемая часть общей литературы. Она развивается по тем же законам, что и общая литература ( единство общего и индивидуального, эмоциональный, чувственный образ как средство художественного отражения и познания действительности ит.д.), но имеет при этом свою специфику. До сих пор нет однозначного мнения об объективных критериях выделения детской литературы из общих рамок литературы. Долгое время на детскую литературу смотрели как на «служанку» педагогики. Дискуссии о специфике данного предмета велись на протяжении всего 20 в.Так в 70-ые годы на страницах газет и журналов развернулась дискуссия на данную тему. Некоторые литературоведы и сегодня предлагают не выделять детскую литературу из общих рамок литературы. Одним из объективных критериев вычленения детской литературы из общей является категория читателя-ребенка. Свои произведения писатель создает с учетом психологических особенностей ребенка, для которого создается книга. Эти особенности оказывают влияние на выбор темы, характер ее освещения, определяют требования к сюжету, эмоциональной стороне, работе над словом, постановку воспитательных задач, познавательное начало и т.д. Специфика детской литературы связана не только с характером изображения действительности, но и с особым предметом ее изображения: он тот же, что и во всяком искусстве, но в то же время особый: главный герой детской книги – ребенок, подросток, человек растущий, изменяющийся, а его чувства, мышление, впечатления должен изображать человек взрослый. Единство эстетического и педагогического начал также выражает специфику детской литературы. Главное отличие, на наш взгляд, детской литературы от литературы взрослой, как это ни странно прозвучит, ее дидактическое целеполагание, так называемый психолого-педагогический компонент. Текст детской литературы, прежде всего, имеет педагогическую стратегию. Так или иначе, но дидактизм детской литературы факт реальный, как реально то, что есть определенный адресат: читатели-дети.

Детская литература – вид искусства, часть общей литературы, подчиняющаяся всем законам искусства и являющаяся отражением реальной действительности, особой формой познания. Под особой формой познания понимается способность писателя видеть мир сразу в двух измерениях: детском и взрослом. Эта способность (категория) исследователями названа «памятью детства».

В.Г.Белинский замечал, что детским писателем нельзя сделаться - им нужно родиться: «Это своего рода призвание. Тут требуется не только талант, но и своего рода гений…».

Необходимо различать понятия «детская книга» и «детское чтение». Детская книга – произведения, специально написанные для детей. Это сказки К. Чуковского, С. Маршака, поэзия А. Барто и т.д. Детское чтение – вся литература, читаемая детьми. Ко второй категории можно отнести произведения А. Пушкина, басни И. Крылова, рассказы А.Чехова и т.д.

Литература для детей проходит те же этапы развития, что и общая литература: средневековье, эпоха Просвещения, литература 19 в. (романтизм и реализм), литература рубежа веков 19 и 20, детская литература 20 в., современная детская литература (80-е-нач.21в.). Вместе с тем это был свой путь развития, цель которого – создание литературы для детей, подростков и юношества.

Научный интерес к детской литературе впервые проявился в 1820-1830-х гг. Он рождался из потребностей воспитателей и книгопродавцев. Начиная с этого времени, шло накопление каталого - библиографических данных и образование специального раздела критики, в котором главной проблемой долго оставалось выявление специфики детской литературы. Остановимся на этой проблеме. В.Белинский настаивал на том, что «детским писателем надобно родиться», Д.Писарев категорически отрицал специфику творчества для детей. После отмены крепостного права, по мере распространения воскресных и земских школ, интерес к народному и детскому чтению резко вырос. Земские учителя остро нуждались в современных изданиях, подходящих для учеников из низших сословий. Они стали собирать школьные библиотеки. Они распределяли литературу по оценочным ярусам - классика, низкосортная литература, руководствовались при этом своим вкусом. В 1860- 1890-х гг. распространением народной и детской книги занялись Петербургский и Московский комитеты грамотности. Проводились конкурсы, создавались рекомендательные библиографические списки, обзоры детской литературы и т.д. В целом история русской детской литературы и ее научного освещения, начиная с 1870-х гг., точно повторяет линию нашей политической истории. Вопросы детской литературы нередко решались с политических позиций. В 1900-х гг. обозначился очередной этап исследований - вычленение и изучение собственно детской художественной литературы» в ее историческом развитии и современном состоянии-с одной стороны, как отрасли общей литературы, с нею тесно связанной, с другой -как известного орудия педагогического воздействия».Так сформулировал свои задачи Н.В. Чехов. Он рассматривал литературу как вид искусства. Задачи, стоящие перед детской книгой: обогащать словарный запас ребенка; знакомить с окружающим миром; прививать художественный вкус и т.д.

Литература:

1.Детский Сборник: Статьи по детской литературе и антропологии детства/Сост. Е. В.Кулешов, И. А. Антипова. - М, 2003.

2.Петровская М. Книги нашего детства. - М.,1986.

3.Чтение детей и подростков в конце ХХв.: Сб. науч. трудов. - М., 1999.

 

Тема: Детская литература 15-18 вв.

 

Тема 2: Возникновение и развитие детской литературы в 15-17вв.

Основные вопросы лекции:

1.Становление и развитие детской литературы в 15-16 вв. Основные типы книг для детей этих лет: азбуки, азбуковники, потешные листы.

2.Детская литература 17 в. «Лицевой букварь» К.Истомина.

3.Педагогическая и издательская деятельность Н.И.Новикова.

 

Детская литература возникла примерно во второй половине 15 в., в то время, когда русский народ освободился от татаро-монгольского ига. В это время появляется интерес к прошлому своего народа, о котором хотелось узнать не только из старинных легенд, преданий, но и из книг. Обучали тогда взрослых грамоте по грамматическим статьям. Для обучения детей чтению стали использовать переделанные грамматические статьи. Меняли их композицию: статья принимала вид беседы между ребенком и взрослым, делалась более простой по содержанию. Самая популярная статья этих лет «О осьми частех слова». Грамматические статьи подготовили почву для появления первой книги для детей - «Донатуса». Это был учебник латинского языка, созданный Д.Герасимовым в 1491г. Название - по учебнику латинского языка, написанному еще в 4 в. Элием Донатом. Это была пока рукописная книга. Затем стали появляться первые азбуки и азбуковники. Самая известная азбука 16 в.- Ивана Федорова. Издана в городе Львове в 1574 году. Композиционно она делилась на 3 части: собственно азбука, грамматика, материалы для чтения.

В 30-40-ые гг.17в. зарождается поэзия для детей. Первым детским поэтом стал справщик Московского печатного двора Савватий. Для детей он написал около 20 стихотворений. Одно из них было напечатано в « Букваре» Василия Федоровича Бурцева ( 1634):

Сия зримая малая книжица,

По реченному алфавитица,

Напечатана бысть по царскому велению

Вам младым детям к научению…

Ты же благоразумное отроча, сему внимай

И от нижния степени на высшую ступай,

И не леностне и не нерадивее учися

И дидаскала (учителя) своего всегда блюдися…

После стихотворения ( выше приведен лишь небольшой отрывок) в букваре Бурцева помещены буквы, склады, числа до 10 тысяч, знаки препинания, образцы спряжений, эатем нравоучительные изречения, изложенные в алфавитном порядке, притчи, наставления и т.п.

Большой популярностью пользовался «Лицевой букварь» Кариона Истомина (1694). Все страницы букваря построены одинаково: в левом верхнем углу – большая заглавная буква, составленная из человеческих фигур, например, буква «А»- воин с трубой и копьем и т.д.; рядом – буквы славянского, греческого, латинского, польского алфавитов, внизу –картинки, на которых изображены предметы, начинающиеся на названную букву; под картинкой – стихи. В целом это была прекрасно оформленная книга, с роскошными иллюстрациями, прогрессивными текстами, предназначалась книга не только для мальчиков, но и для девочек, которых тогда грамоте не учили. Своеобразным явлением 17 в. были азбуковники – это анонимные рукописные сборники типа справочника. До наших дней дошло около 200 книг такого типа.

Обучали детей грамоте и по потешным книгам (фряжские или немецкие листы) – это оттиски из меди или эстампы с гравюр в начале иностранного, а затем русского происхождения. По таким листа дьяк Иван Зотов учил грамоте будущего царя Петра 1.

Вывод: детская литература 15-17 вв. – это в основном учебная литература: азбуки, азбуковники и т.п. Помимо несомненных достоинств они имели и недостатки: слабо учитывали детскую психологию, были излишне дидактичны, в них почти отсутствовали иллюстрации. Исключением является лишь «Лицевой букварь» Кариона Истомина.