лаунчер майинкрафт. ЛР_№4_Сетевые программы (4). Лабораторная работа сетевые программы цель изучить теоретические и практические аспекты создания сетевых программ
Скачать 28.25 Kb.
|
4 ЛАБОРАТОРНАЯ РАБОТА № 4. СЕТЕВЫЕ ПРОГРАММЫ Цель: изучить теоретические и практические аспекты создания сетевых программ. Задание к лабораторной работе №4 Разработать приложение на основе TCP-соединения, позволяющее осуществлять взаимодействие клиента и сервера по совместному решению задач обработки информации. Приложение должно располагать возможностью передачи и модифицирования получаемых (передаваемых) данных. Интерфейс клиентской части должен быть представлен графическим интерфейсом (JavaFX либо Swing), серверной – консольным. 1. Разработать приложение-калькулятор для совершения простейших арифметических операций. Исходные параметры и тип операции (+, -, /, ×) вводятся на клиентской части и передаются серверу. Сервер возвращает клиенту результат операции. 2. Разработать приложение-чат. На сервере и клиенте отображаются передаваемые сообщения и время их отправления. 3. Разработать приложение-генератор случайных чисел. На клиентской части вводится целое положительное число N и передается серверу, а тот в свою очередь возвращает клиенту массив случайных чисел от 1 до N. 4. Разработать приложение-поисковик слов. На сервере хранится определенный текст. На клиентской части вводится слово для поиска и передается серверу, а тот в свою очередь осуществляет поиск этого слова в тексте и возвращает клиенту все предложения, в которых встречается это слово. 5. Разработать приложение-счетчик букв. На клиентской части вводится строка и передается серверу, а тот в свою очередь осуществляет подсчет гласных и согласных букв и возвращает этот результат клиенту. 6. Разработать приложение-определитель матрицы. На клиентской части вводится исходная матрица произвольного порядка и передается серверу, а тот в свою очередь вычисляет определитель этой матрицы и возвращает результат клиенту. 7. Разработать приложение для нахождения обратной матрицы размером 3х3. Исходная матрица вводится на клиентской части и передается серверу, а тот в свою очередь возвращает клиенту обратную матрицу. 8. Разработать приложение для определения победителя лотереи. На сервере хранятся номера билетов. На каждом билете имеются 10 случайных чисел от 1 до 100. На клиентской части вводятся 10 чисел от 1 до 100, и сервер должен определить номер билета, в котором имеется больше всего совпадений с введенными числами. 9. Разработать приложение для определения призовых мест на соревнования по прыжкам в длину. На сервере хранятся фамилии участников соревнований, их идентификационные номера. На клиентской части вводятся результаты прыжков по каждому идентификационному номеру, а сервер возвращает фамилии спортсменов, занявших 1, 2 и 3 места. 10. Разработать приложение для определения суммы подоходного налога. На клиентской части вводятся заработные платы сотрудников предприятия и передаются северу, а тот в свою очередь возвращает суммы налога. Причем для з/п меньше 100 000 руб. применяется ставка налога 5 %, для з/п от 100 000 до 500 000 – ставка 10 %, для з/п больше 500 000 – ставка 15 %. 11. Разработать приложение по поиску квартиры для покупки. Стоимости квартир и их адреса хранятся на сервере. На клиентской части вводится предельная сумма для покупки квартиры, а сервер возвращает клиенту адреса всех квартир с такой или меньшей стоимостью. 12. Разработать приложение, серверная часть которого в матрице произвольного порядка определяла бы индекс строки с минимальным элементом и индекс столбца с максимальным элементом этой матрицы и возвращала этот результат клиенту. 13. Разработать приложение, серверная часть которого в матрице произвольного порядка определяла бы отношение среднего значения элементов, расположенных на главной диагонали, к среднему значению элементов, расположенных на побочной диагонали этой матрицы, и возвращала результат клиенту. 14. Разработать приложение, в котором серверная часть хранит информацию о расписании занятий студентов. Клиентская часть имеет возможность просматривать, редактировать и удалять необходимую информацию. 15. Разработать приложение, в котором серверная часть осуществляет расчет себестоимости продукции. При этом пользователь на клиенте вводит необходимую информацию, например: основная заработная плата, дополнительная заработная плата, материалы, прочие затраты и т.д., посылает ее на сервер. Сервер производит расчет и высылает назад клиенту рассчитанную полную себестоимость. Теоретическая часть Серверы и клиенты В контексте работы в сети используются такие термины, как клиент и сервер. Сервер – это все, что имеет некоторый разделяемый (коллективно используемый) ресурс. Существуют вычислительные серверы, которые обеспечивают вычислительную мощность; серверы печати, которые управляют совокупностью принтеров; дисковые серверы, которые предоставляют работающее в сети дисковое пространство, и Web-серверы, которые хранят Web-приложения. Клиент – любой другой объект, который хочет получить доступ к серверу. Сервер – это постоянно доступный ресурс, в то время как клиент может «отключиться» после того, как он был обслужен. Различие между сервером и клиентом существенно только, когда клиент пытается подключиться к серверу. Как только они соединятся, происходит процесс двухстороннего общения, и не важно, что один является сервером, а другой – клиентом. Работа сервера – слушать соединение, которое выполняется с помощью специального создаваемого серверного объекта (сокета), содержащего IP-адрес и номер порта. Работа клиента – попытаться создать соединение с сервером, которое выполняется с помощью клиентского сокета. Как только соединение установлено, соединение превращается в потоковый объект ввода/вывода. С этого момента можно рассматривать соединение как файл, который можно читать и в который можно записывать данные. Единственная особенность – файл может обладать определенным интеллектом и обрабатывать передаваемые команды. Эти функции обеспечиваются расширением программы сетевой библиотеки java.net.*;. Сокеты Передача данных по сети – сложный процесс, включающий в себя определение пути доставки данных, организацию взаимодействия, алгоритмы синхронизации, обработки сбойных ситуаций и т.п. Программное обслуживание такого процесса сложное. Для упрощения введено понятие сокета (гнезда) как конечной точки коммуникации. Сокет (гнездо, разъем) – это программная абстракция, используемая для представления «терминалов» соединений между двумя машинами. Каждый из сокетов определяется типом и ассоциированным с ним процессом. Реально для передачи организуются определенные дескрипторы TCP-соединения, так называемые гнезда (socket): гнездо сервера и гнездо клиента, которые в Internet-домене включают в себя IP-адреса сервера и клиента и номера портов, через которые они взаимодействуют. Сервер обычно имеет закрепленный и постоянный во взаимодействии номер порта, а клиенту, обращающемуся по этому номеру для связи к серверу, назначается некоторый другой (эфемерный) номер порта после установления соединения с сервером на сеанс их взаимодействия. Таким образом основной порт освобождается для установления последующих связей (номер порта выбирается сервером из числа не занятых в диапазоне от 1024 до 65 535). Эта комбинация (IP-адрес и номера портов) однозначно определяет отдельные сетевые процессы в сети Internet (номера портов до 1024, как правило, резервируются для широко известных приложений, например 80 – для связывания с серверами Web по протоколу HTTP). Сокеты для работы в сети можно создать двух типов: 1) Потоковые для TCP-соединения. TCP могут передавать данные только между двумя приложениями, т.к. они предполагают наличие канала между этими приложениями. 2) Дейтаграммные. Для дейтаграмм не нужно создавать канал, данные посылаются приложению с использованием адреса, состоящего из сокета и номера порта (в дейтаграммах не гарантируются доставка и корректность последовательности передачи пакетов). Для передачи дейтаграмм не нужны ни механизмы подтверждения связи, ни механизмы управления потоком данных. В данной лабораторной работе рассмотрим TCP-соединения. Для упрощения представления такого соединения представим себе сокет, размещенный на некоторой машине, и виртуальный «кабель», соединяющий две машины, каждый конец которого вставлен в сокет. Для TCP-соединений в Java используется два класса сокетов: ServerSocket – класс, используемый сервером, чтобы «слушать» входящие соединения, и Socket – используемый клиентом для инициирования соединения. Сокеты TCP/IP серверов Как было указано выше, для создания сокетов серверов используется класс ServerSocket. Указанный класс используется для создания серверов, которые прослушивают либо локальные, либо удаленные программы клиента, чтобы соединяться с ними на опубликованных портах. Конструкторы класса ServerSocket: ServerSocket(int port) – создает сокет сервера на указанном порте с длиной очереди по умолчанию 50; ServerSocket(int port, int maxQueue) – создает сокет сервера на указанном порте с максимальной длиной очереди maxQueue; ServerSocket(int port, int maxQueue, InetAddress localAddress) – создает сокет сервера на указанном порте с максимальной длиной очереди maxQueue. Класс ServerSocket имеет метод accept(), который является блокирующим вызовом: сервер будет ждать клиента, чтобы инициализировать связь, и затем вернет нормальный Socket-объект, который будет использоваться для связи с клиентом. Как только клиент создает соединение по сокету, ServerSocket возвращает с помощью метода accept() соответствующий клиенту объект Socket на сервере, по которому будет происходить связь со стороны сервера. Начиная с этого момента, появляется соединение сокет–сокет, и можно считать эти соединения одинаковыми, т.к. они действительно одинаковые. ServerSocket httpServer=new ServerSocket(port);//создание сокета //сервера Socket reg=httpServer.accept(); //прослушивание (ожидание // запроса на соединения) // прием содержания соединения клиента …. //отправка клиенту сообщения … //разрыв соединения В представленном коде после установки соединения с клиентом метод accept() возвращает объект класса Socket (в данном случае reg), с помощью которого можно создавать и использовать байтовые и символьные потоки для обмена данными с клиентами. Для этого с гнездом связываются входной и выходной потоки, которые реализуются с помощью классов InputStream и OutputStream: // получение входного и выходного потоков InputStream inputstream = reg.getInputStream(); OutputStream outputstream = reg.getOutputStream(); Получив объекты, реализующие потоки, можно воспользоваться предоставляемыми ими методами, чтобы организовать взаимодействие по сети. Например, организовать чтение байта из входного потока можно при помощи метода read, а запись байта в выходной поток – с использованием метода write: int c= inputstream.read(); // чтение байта из входного потока outputstream. write(с); //запись байта в выходной поток Сокеты TCP/IP клиентов Для создания сокета клиента используется конструктор: Socket(String hostname, int port) – создает сокет, соединяющий локальную хост-машину с именованной хост-машиной и портом; может выбрасывать исключение UnknownHostException или IOException.Socket(InetAddress ipAddress, int port) – создает сокет, аналогичный предыдущему, но используется уже существующий объект класса InetAddres и порт; может выбрасывать исключение IOException. Сокет может в любое время просматривать связанную с ним адресную и портовую информацию при помощи методов, представленных в табл. 4.1. Таблица 4.1 – Методы просмотра адресной и портовой информации
После создания Socket-объект можно применять для получения доступа к связанным с ним потокам ввода/вывода. Рассмотрим пример, в котором необходимо создать приложение клиент-сервер. Клиент считывает строку с клавиатуры, отображает ее на экране, передает ее серверу, сервер отображает ее на экране, переводит в верхний регистр и передает клиенту, который, в свою очередь, снова отображает ее на экране. Программа сервера: import java.io.*;//импорт пакета, содержащего классы для ввода/вывода import java.net.*;//импорт пакета, содержащего классы для работы в //сети Internet public class server {public static void main(String[] arg) {//объявление объекта класса ServerSocket ServerSocket serverSocket = null; Socket clientAccepted = null;//объявление объекта класса Socket ObjectInputStream sois = null;//объявление байтового потока ввода ObjectOutputStream soos = null;//объявление байтового потока вывода try { System.out.println("server starting...."); serverSocket = new ServerSocket(2525);//создание сокета сервера для //заданного порта clientAccepted = serverSocket.accept();//выполнение метода, который //обеспечивает реальное подключение сервера к клиенту System.out.println("connection established...."); //создание потока ввода soos = new sois = new ObjectInputStream(clientAccepted.getInputStream()); ObjectOutputStream(clientAccepted.getOutputStream());//создание потока //вывода String clientMessageRecieved = (String)sois.readObject();//объявление //строки и присваивание ей данных потока ввода, представленных //в виде строки (передано клиентом) while(!clientMessageRecieved.equals("quite"))//выполнение цикла: пока //строка не будет равна «quite» { System.out.println("message recieved: '"+clientMessageRecieved+"'"); clientMessageRecieved = clientMessageRecieved.toUpperCase();//приведение //символов строки к //верхнему регистру soos.writeObject(clientMessageRecieved);//потоку вывода //присваивается значение строковой переменной (передается клиенту) clientMessageRecieved = (String)sois.readObject();//строке //присваиваются данные потока ввода, представленные в виде строки //(передано клиентом) } }catch(Exception e) { } finally { try { sois.close();//закрытие потока ввода soos.close();//закрытие потока вывода clientAccepted.close();//закрытие сокета, выделенного для клиента serverSocket.close();//закрытие сокета сервера } catch(Exception e) { e.printStackTrace();//вызывается метод исключения е } } } } Программа клиента: import java.io.*;//импорт пакета, содержащего классы для // ввода/вывода import java.net.*;//импорт пакета, содержащего классы для // работы в сети public class client { public static void main(String[] arg) { try { System.out.println("server connecting...."); Socket clientSocket = new Socket("127.0.0.1",2525);//установление //соединения между локальной машиной и указанным портом узла сети System.out.println("connection established...."); BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));//создание //буферизированного символьного потока ввода ObjectOutputStream coos = new ObjectOutputStream(clientSocket.getOutputStream());//создание //потока вывода ObjectInputStream cois = new ObjectInputStream(clientSocket.getInputStream());//создание //потока ввода System.out.println("Enter any string to send to server \n\t('quite' − programme terminate)"); String clientMessage = stdin.readLine(); System.out.println("you've entered: "+clientMessage); while(!clientMessage.equals("quite")) {//выполнение цикла, пока строка //не будет равна «quite» coos.writeObject(clientMessage);//потоку вывода присваивается //значение строковой переменной (передается серверу) System.out.println("server: "+cois.readObject());//выводится на //экран содержимое потока ввода (переданное сервером) System.out.println("---------------------------"); clientMessage = stdin.readLine();//ввод текста с клавиатуры System.out.println("you've entered: "+clientMessage);//вывод в //консоль строки и значения строковой переменной } coos.close();//закрытие потока вывода cois.close();//закрытие потока ввода clientSocket.close();//закрытие сокета }catch(Exception e) { e.printStackTrace();//выполнение метода исключения } } } Для запуска приведенного кода сервера и клиента сначала необходимо запустить приложение сервера, потом – приложение клиента. После запуска сервера на экране появится консольное окно сервера со строкой: server starting …. После запуска клиента и установления его соединения с сервером на экране появится консоль с текстом: server connecting…. connection established …. Enter any string to send to server <”quite”– program will terminate> После установления соединения на сервере появляется еще одна строка, свидетельствующая об этом: connection established…. Теперь введем в окне клиента какую-либо строку, например Hello BSUIR. Пошлем ее серверу. В окне сервера появятся следующие строки: message recieved: 'Hello BSUIR' В окне клиента появятся дополнительные строки: you've entered: Hello BSUIR server: HELLO BSUIR Теперь введем слово «quite» на клиенте. Приложения завершат свою работу. Сначала закрывается окно клиента, затем – окно сервера. 4.3 Содержание отчёта 1. Титульный лист. 2. Цель работы. 3. Краткие теоретические сведения. 4. Результаты выполнения практического задания. 5. Выводы. |