- •Амурский государственный университет Факультет математики и информатики
- •Допущено учебно-методическим объединением (умо) вузов
- •Методические указания к лабораторной работе
- •1. Простейшее приложение Hello
- •2. Структура Java-программы
- •2.1 Переменные
- •2.1.1 Примитивные типы
- •2.1.2 Ссылочные типы
- •2.2 Методы
- •2.3 Классы
- •2.3.1 Статические и динамические элементы (модификатор static)
- •2.3.2 Модификаторы доступа
- •2.3.3 Наследование классов
- •2.3.4 Специальные переменные
- •2.4 Пакеты и импортирование
- •2.4.1 Использование пакетов
- •2.4.2 Создание пакетов
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Методические указания к лабораторной работе
- •1. Простейший апплет Hello
- •1.1 Апплет Неllo, управляемый мышью
- •2. Простейший апплет HelloApplet, созданный Java Applet Wizard
- •2.1 Создание шаблона апплета HelloApplet
- •2.2 Исходные файлы апплета HelloApplet
- •2.3 Упрощенный вариант исходного текста апплета HelloApplet
- •3. Аргументы апплета
- •3.1 Передача параметров апплету
- •3.2 Апплет, принимающий параметры
- •3.4 Двойная буферизация графического изображения
- •4. События и их обработка
- •4.1 Обработчики событий от мыши и клавиатуры
- •4.2 Обработка событий
- •4.3 Апплет, обрабатывающий события
- •4.4 Устранение мерцания при выводе, двойная буферизация
- •5. Апплеты двойного назначения
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Методические указания к лабораторной работе
- •1. Рисование в окне
- •1.1 Графика
- •1.2 Цвет
- •1.3 Шрифты
- •1.4 Приложение FontsList
- •2. Обработка событий
- •2.1 Как обрабатываются события
- •2.2 События от мыши
- •2.3 Приложение LinesDraw
- •2.4 События от клавиатуры
- •2.5 Приложение KeyCodes
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Методические указания к лабораторной работе
- •1. Компоненты gui
- •2. Устройства или элементы управления
- •2.1 Кнопки
- •2.2 Флажки (или переключатели)
- •2.3 Меню выбора (или выпадающие списки)
- •2.4 Раскрывающиеся списки
- •2.5 Полосы прокрутки
- •2.6 Метки
- •2.7 Текстовые компоненты
- •3. Приложение AllElements
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Методические указания к лабораторной работе
- •1. Контейнеры
- •1.1 Панели
- •1.2 Окна
- •1.3 Рамки, фреймы
- •2. Менеджеры размещения компонентов
- •2.1 Типы менеджеров размещения
- •3. Поведение контейнера при наличии элементов управления
- •4. Приложение PanelsDemo1
- •5. Приложение PanelsDemo2
- •6. Приложение WindowsDemo
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Методические указания к лабораторной работе
- •1. Процессы, задачи и приоритеты
- •2. Реализация многозадачности в Java
- •2.1 Создание подкласса Thread
- •2.2 Реализация интерфейса Runnable
- •2.3 Применение мультизадачности для анимации
- •2.4 Апплет двойного назначения, реализующий интерфейс Runnable
- •3. Потоки (нити)
- •3.1 Состояние потока
- •3.2 Исключительные ситуации для потоков
- •3.3 Приоритеты потоков
- •3.4 Группы потоков
- •4. Приложение VertScroller
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Автономные приложения. Потоки данных. Работа с локальными файлами (2 часа) методические указания к лабораторной работе
- •1. Самостоятельные графические приложения
- •2. Потоки ввода-вывода в Java
- •2.1. Обзор классов Java для работы с потоками
- •2.2 Стандартные потоки ввода-вывода
- •2.3 Потоки, связанные с локальными файлами
- •2.3.1 Создание потоков, связанных с локальными файлами
- •2.3.2 Запись данных в поток и чтение их из потока
- •2.3.3 Закрытие потоков
- •2.3.4 Принудительный сброс буферов
- •2.3.5 Приложение StreamDemo
- •2.4 Потоки в оперативной памяти
- •3 Работа с локальной файловой система
- •3.1 Работа с файлами и каталогами
- •3.2 Приложение DirList
- •3.3 Произвольный доступ к файлам
- •3.4 Просмотр локальной файловой системы
- •3.5 Приложение FileDialogDemo
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Сетевые приложения: передача данных с использованием сокетов (2 часа)
- •1. Сокеты
- •2. Протокол tcp/ip, адрес ip и класс InetAddress
- •3. Потоковые сокеты
- •3.1 Создание и использование канала передачи данных
- •3.2 Конструкторы и методы класса Socket
- •3.3 Пример использования потоковых сокетов
- •4. Датаграммные сокеты (несвязываемые датаграммы)
- •4.1 Конструкторы и методы класса DatagramSocket
- •4.3 Пример использования датаграммных сокетов
- •5 Приложения ServerSocketApp и ClientSocketApp
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Связь по сети с помощью url (2 часа) методические указания к лабораторной работе
- •1. Универсальный адрес ресурсов url
- •2. Класс java.Net.Url в библиотеке классов Java
- •3. Использование класса java.Net.Url
- •3.1 Чтение из потока класса InputStream, полученного от объекта класса url
- •3.2 Получение содержимого файла, связанного с объектом класса url
- •4. Соединение с помощью объекта класса urlConnection
- •5. Приложение Diagram
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Создание и использование сервлетов (2 часа) методические указания к лабораторной работе
- •1. Как устроен сервлет
- •2. Вспомогательные классы
- •3. Запуск и настройка сервлетов
- •4. Сервлет example, принимающий параметры
- •5. Сервлет, обрабатывающий запросы на основе методов cet и post
- •6. Сервлет MyselfInfo
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Работа с базами данных, использование интерфейса jdbc(2 часа) методические указания к лабораторной работе
- •1. Написание апплетов, сервлетов и приложений jdbc
- •1.1 Соединение с базой данных
- •1.2 Применение интерфейса DatabaseMetaData
- •1.3 Посылка статичных sql-запросов
- •1.4 Посылка параметризированных и частовыполняемых sql-запросов
- •1.5 Выборка результатов
- •1.6 Применение интерфейса ResultSetMetaData
- •1.7 Доступ к хранимым функциям и процедурам
- •1.8 Применение выходных параметров
- •2. Обработка исключений jdbc
- •3. Отладка приложений jdbc
- •4. Сервлет, работающий с информацией из базы данных
- •Задания к лабораторной работе
- •Контрольные вопросы
- •Приложение 1 java-файл простейшего апплета и html-документ со ссылкой на него
- •Приложение 2 java-файл апплета, принимающего параметры, и html-документ со ссылкой на него
- •Приложение 3 java-файл апплета, обрабатывающего простые события мыши, и html-документ со ссылкой на него
- •Приложение 4 java-файлы апплета двойного назначения и html-документ со ссылкой на него
- •Приложение 5 java-файлы апплета двойного назначения, обрабатывающего сообщения от мыши, и html-документ со ссылкой на него
- •Приложение 6 java-файл апплета двойного назначения, реализующего интерфейс runnable, и html-документ со ссылкой на него
- •Приложение 7 самостоятельное графическое java-приложение
4.3 Пример использования датаграммных сокетов
Рассмотрим в качестве примера два приложения SеrverDatagram и ClientDatagram (пример 2), работающих с датаграммными сокетами. Одно из них выполняет роль сервера, а другое служит клиентом. Эти приложения иллюстрируют применение датаграммных сокетов для передачи данных от нескольких копий одного и того же клиентского приложения одному серверу с его известными адресом и номером порта.
Клиентские приложения посылают серверу строки, которые пользователь вводит с клавиатуры. Сервер принимает эти строки, отображая их в своем консольные вместе с номером порта клиента и его адресом. Когда с консоли клиента будет введена строка «QUIT» (или «quit»), этот клиент и сервер завершают свою работу. Работа других клиентов может быть завершена подобным образом, причем независимо от того, работает север или нет.
/*------------- Пример 2. Файл ServerDatagram.java -------------*/
import java.io.*;
import java.net.*;
import java.util.*;
class ServerDatagram
{ public static void main(String args[])
{ boolean quit=false;
String str; StringTokenizer strFull;
System.out.println("Server Application");
System.out.println("---- Start ----");
byte buf[]=new byte[512]; // буфер для данных
InetAddress srcAdd; // адрес узла, откуда пришел пакет
int srcPort; // порт, откуда пришел пакет
try
{ // создание сокета сервера
DatagramSocket s=new DatagramSocket(9999);
// создание пакета для приема команд
DatagramPacket pIn=new DatagramPacket(buf,512);
// цикл получения команд от клиента
while(!quit)
{ // ---- получение данных от клиентов
s.receive(pIn); // получение пакета
srcAdd=pIn.getAddress(); // адрес узла-отправителя
srcPort=pIn.getPort(); // порт узла-отправителя
// ---- при получении "quit" - выход
// удаление незначащих байт из массива
strFull=new StringTokenizer(new String(buf,0),"\r\n");
str=(String)strFull.nextElement();
if(str.toLowerCase().equals("quit")) quit=true;
// ---- вывод полученной от клиента строки
str="Address:"+srcAdd.toString()+
" Port:"+srcPort+" String:"+str;
System.out.println(str);
}
s.close(); // закрытие сокета
}
catch(IOException ioe)
{ System.out.println(ioe.toString());
}
System.out.println("---- Finish ----");
}
}
/*------------- Пример 2. Файл ClientDatagram.java -------------*/
import java.io.*;
import java.net.*;
import java.util.*;
class ClientDatagram
{ public static void main(String args[])
{ boolean quit=false; int length;
String str; StringTokenizer strFull;
System.out.println("Client Application");
System.out.println("Enter any string or 'quit' to exit...");
byte buf[]=new byte[512]; // буфер для передачи данных
try
{ // создание сокета клиента с
// использованием свободного порта
DatagramSocket s=new DatagramSocket();
// адрес узла, на котором запущен сервер
// в процессе отладки сетевых приложений, когда
// сервер и клиент работают на одном узле,
// в качестве адреса сервера используется адрес
// данного локального узла, выдаваемый методом
// InetAddress.getLocalHost();
InetAddress serverAdd=InetAddress.getLocalHost();
// в рабочей версии клиента указывается IP-адрес сервера
//InetAddress serverAdd=
// InetAddress.getByName("194.84.124.60");
//InetAddress serverAdd=InetAddress.getByName("gosha");
//InetAddress serverAdd=
// InetAddress.getByName("gosha.vvsu.ru");
// создание пакета для передачи команд серверу
DatagramPacket pOut=
new DatagramPacket(buf,512,serverAdd,9999);
// цикл посылки команд серверу
while(!quit)
{ // ввод строки с клавиатуры
length=System.in.read(buf);
if(length==1)
// только символ перевода строки
continue;
// ---- посылка данных
s.send(pOut); // посылка пакета
// ---- при вводе "quit" - выход
// удаление незначащих байт из массива
strFull=new StringTokenizer(new String(buf,0),"\r\n");
str=(String)strFull.nextElement();
if(str.toLowerCase().equals("quit")) quit=true;
}
s.close(); // закрытие сокета
}
catch(IOException ioe)
{ System.out.println(ioe.toString());
}
}
}
Клиенты этой клиент-серверной системы не получают никакого подтверждения в ответ на переданные ему пакеты данных. Можно изменить программу клиента, добавив такую возможность. Однако следует учесть, что так как датаграммные сокеты не гарантируют доставки пакетов, ожидание ответа может продлиться бесконечно долго.
Чтобы избежать этого, приложение должно выполнять работу с сервером в отдельной задаче, причем главная задача должна ждать ответ ограниченное время.
