Сетевой обмен данными в Java

Общее понятие о пакете "java.net". Логическая структура соединений через сокеты. Создание объекта Socket, соединение между узлами Internet. Способы создания потока. Алгоритм работы системы клиент-сервер. Листинг ServerForm.java, запуск подпроцесса.

Рубрика Программирование, компьютеры и кибернетика
Вид лабораторная работа
Язык русский
Дата добавления 27.11.2013
Размер файла 174,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РЕСПУБЛИКИ КАЗАХСТАН

Казахский национальный технический университет имени К.И. Сатпаева

Институт информационных и телекоммуникационных технологий

Кафедра программного обеспечения систем и сетей

Лабораторная работа

На тему: "Сетевой обмен данными в JAVA"

5В060200- Информатика

Алматы 2013

На тему: "Сетевой обмен данными в JAVA"

Инструмент измерения выполнения лабораторной работы №1

Качество выполнения работ

Диапазон оценки

Получено %

1 Не выполнено

0%

Отсутствие на занятиях без уважительных причин

2 Выполнение и активность обучающегося

0-50%

3 Оформление работы

0-20%

4 Умение пользоваться справочниками, технической литературой, учебно-методическим комплексом дисциплины, конспектами лекций

0-5%

5 Умение пользоваться техническими средствами

0-5%

6 Защита лабораторной работы

0-20%

Итого:

0-100%

Цель: Изучение сетевых средств JAVA

В Java существует специальный пакет "java.net", содержащий класс java.net.Socket. Socket в переводе означает "гнездо", название это было дано по аналогии с гнёздами на аппаратуре, теми самыми, куда подключают штепсели. Соответственно этой аналогии, можно связать два "гнезда", и передавать между ними данные. Каждое гнездо принадлежит определённому хосту (Host - хозяин, держатель). Каждый хост имеет уникальный IP (Internet Packet) адрес. На данный момент интернет работает по протоколу IPv4, где IP адрес записывается 4 числами от 0 до 255 - например, 127.0.0.1

Гнёзда монтируются на порт хоста (port). Порт обозначается числом от 0 до 65535 и логически обозначает место, куда можно пристыковать (bind) сокет. Если порт на этом хосте уже занят каким-то сокетом, то ещё один сокет туда пристыковать уже не получится. Таким образом, после того, как сокет установлен, он имеет вполне определённый адрес, символически записывающийся так [host]:[port], к примеру - 127.0.0.1:8888 (означает, что сокет занимает порт 8888 на хосте 127.0.0.1)

Рис. 1 - Логическая структура соединений через сокеты

Для того, чтобы облегчить жизнь, чтобы не использовать неудобозапоминаемый IP адрес, была придумана система DNS (DNS - Domain Name Service). Цель этой системы - сопоставлять IP адресам символьные имена. К примеру, адресу "127.0.0.1" в большинстве компьютеров сопоставленно имя "localhost" (в просторечье - "локалхост").

Локалхост, фактически, означает сам компьютер, на котором выполняется программа, он же - локальный компьютер. Вся работа с локалхостом не требует выхода в сеть и связи с какими-либо другими хостами.

TCP/IP-сокеты используются для реализации надежных двунаправленных, ориентированных на работу с потоками соединений точка-точка между узлами Internet. Сокеты можно использовать для соединения системы ввода-вывода Java с программами, которые могут выполняться либо на локальной машине, либо на любом другом узле Internet. В отличие от класса DatagramSocket, объекты класса Socket реализуют высоконадежные устойчивые соединения между клиентом и сервером.

В пакете java.net классы Socket и ServerSocket сильно отличаются друг от друга. Первое отличие в том, что ServerSocket ждет, пока клиент не установит с ним соединение, в то время, как обычный Socket трактует недоступность чего-либо, с чем он хочет соединиться, как ошибку. Одновременно с созданием объекта Socket устанавливается соединение между узлами Internet. Для создания сокетов вы можете использовать два конструктора:

Socket(String host, int port) устанавливает соединение между локальной машиной и указанным портом узла Internet, имя которого было передано конструктору. Этот конструктор может возбуждать исключения UnknownHostException и IOException.

Socket(InetAddress address, int port) выполняет ту же работу, что и первый конструктор, но узел, с которым требуется установить соединение, задается не строкой, а объектом InetAddress. Этот конструктор может возбуждать только IOException.

Java поддерживает адреса абонентов, принятые в Internet, с помощью класса InetAddress. Для адресации в Internet используются служебные функции, работающие с обычными, легко запоминающимися символическими именами, эти функции преобразуют символические имена в 32-битные адреса.

В классе InetAddress нет доступных пользователю конструкторов. Для создания объектов этого класса нужно воспользоваться одним из его фабричных методов. Фабричные методы - это обычные статические методы, которые возвращают ссылку на объект класса, которому они принадлежат. В данном случае, у класса InetAddress есть три метода, которые можно использовать для создания представителей. Это методы getLocalHost, getByName и getAllByName.

У класса InetAddress также есть несколько нестатических методов, которые можно использовать с объектами, возвращаемыми только что названными фабричными методами:

getHostName() возвращает строку, содержащую символическое имя узла, соответствующее хранящемуся в данном объекте адресу Internet.

getAddress() возвращает байтовый массив из четырех элементов, в котором в порядке, используемом в сети, записан адрес Internet, хранящийся в данном объекте.

toString() возвращает строку, в которой записано имя узла и его адрес.

После того, как объект Socket создан, им можно воспользоваться для того, чтобы получить доступ к связанным с ним входному и выходному потокам. Эти потоки используются для приема и передачи данных точно так же, как и обычные потоки ввода-вывода, которые мы видели в предыдущей главе:

getInputStream() возвращает InputStream, связанный с данным объектом.

getOutputStream() возвращает OutputStream, связанный с данным объектом.

close() закрывает входной и выходной потоки объекта Socket.

Как уже упоминалось ранее, Java поддерживает сокеты серверов. Для создания серверов Internet надо использовать объекты класса ServerSocket. Когда вы создаете объект ServerSocket, он регистрирует себя в системе, говоря о том, что он готов обслуживать соединения клиентов. У этого класса есть один дополнительный метод accept(), вызов которого блокирует подпроцесс до тех пор, пока какой-нибудь клиент не установит соединение по соответствующему порту. После того, как соединение установлено, метод accept() возвращает вызвавшему его подпроцессу обычный объект Socket.

Два конструктора класса ServerSocket позволяют задать, по какому порту вы хотите соединяться с клиентами, и (необязательный параметр) как долго вы готовы ждать, пока этот порт не освободится.

ServerSocket(int port) создает сокет сервера для заданного порта.

ServerSocket(int port, int count) создает сокет сервера для заданного порта. Если этот порт занят, метод будет ждать его освобождения максимум count миллисекунд.

Самый простой способ создания потока - это объявление класса, реализующего интерфейс Runnable. Runnable абстрагирует единицу исполняемого кода. Можно конструировать поток из любого объекта, реализующего интерфейс Runnable. Чтобы реализовать Runnable, класс нужно объявить единственный метод run (). Внутри run () вы определяете код, который, собственно, составляет новый поток. Важно понимать, что run () может вызывать другие методы, использовать другие классы, объявлять переменные - точно так же, как это делает главный поток. Единственным отличием является то, что run () устанавливает точку входа для другого, параллельного потока внутри вашей программы. Этот поток завершится, когда run () вернет управление.

После того как будет объявлен класс, реализующий интерфейс Runnable, вы создадите объект типа Thread из этого класса. В Thread определено несколько конструкторов. Тот, который должен использоваться в данном случае, выглядит следующим образом:

Thread(Runnable объект_потока, String имя_потока)

В этом конструкторе объект_потока - это экземпляр класса, реализующего интерфейс Runnable. Он определяет, где начнется выполнение потока. Имя нового потока передается в иия_потока.

После того, как новый поток будет создан, он не запускается до тех пор, пока вы не вызовете метод start (), объявленный в классе Thread. По сути, start () выполняет вызов run (). Метод start () показан ниже:

Внутри конструктора NewThread в следующем операторе создается новый объект Thread:

t = new Thread(this, "Демонстрационный поток");

Передача this в первом аргументе означает, что вы хотите, чтобы новый поток вызвал run () метод объекта this. Далее вызывается start (), чем запускается выполнение потока, начиная с метода run (). Это запускает цикл for дочернего потока. После вызова start () конструктор NewThread возвращает управление main (). Когда главный поток продолжает свою работу, он входит в свой цикл for. После этого оба потока выполняются параллельно, разделяя ресурсы центрального процессора, вплоть до завершения своих циклов. Вывод, генерируемый этой программой, показан ниже (ваш вывод может варьироваться, в зависимости от скорости процессора и загрузки).

Сервер - это специальная программа, обычно запущенная на отдельном компьютере (хосте, от слова host(eng.) - хозяин), и выполняющая некий круг задач. Клиент, в свою очередь - программа, которая запрашивает сервер выполнить то или иное действие (задачу) и вернуть полученные данные клиенту. На хосте для работы сервера обычно выделяется порт (port). К этому порту и должен будет обращаться клиент. Клиент для связи с портом хоста, который соединен в свою очередь с нужным сервером (программой), создает сокет.

В целом алгоритм работы системы клиент-сервер выглядит следующим образом:

Сервер подключается к порту на хосте и ждет соединения с клиентом;

Клиент создает сокет и пытается соединить его с портом на хосте;

Если создание сокета прошло успешно, то сервер переходит в режим ожидания команд от клиента;

Клиент формирует команду и передает ее серверу, переходит в режим ожидания ответа;

Сервер принимает команду, выполняет ее и пересылает ответ клиенту и т.д.

Создаем сервер

Для создания сокетов и управления ими в Java есть специальные классы java.net.Socket и java.net.ServerSocket. Первый для клиента, второй для сервера. Так же будут необходимы два класса из пакета java.io.*: BufferedReader и PrintWriter для чтения/записи в сокет.

Листинг ServerForm.java

import java.net.*;

import java.io.*;

public class ServerForm extends java.awt.Frame implements Runnable {

public final static int PORT = 220;

Socket sock = null;

BufferedReader in = null;

FileWriter fw = null;

BufferedWriter out = null;

Thread t = new Thread(this);

/** Создаем новое окно сервера */

public ServerForm() { initComponents(); }

private void initComponents() {

list1 = new java.awt.List();

textField1 = new java.awt.TextField();

button1 = new java.awt.Button();

button2 = new java.awt.Button();

button3 = new java.awt.Button();

setTitle("Сервер");

addWindowListener(new java.awt.event.WindowAdapter() {

public void windowClosing(java.awt.event.WindowEvent evt) {

exitForm(evt); } });

setLayout(null);

add(list1);

list1.setBounds(30, 90, 160, 150);

add(textField1);

textField1.setBounds(30, 50, 160, 20);

button1.setLabel("Отправить");

button1.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

button1ActionPerformed(evt);} });

add(button1);

button1.setBounds(240, 50, 110, 24);

button2.setLabel("Соединение");

button2.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

button2ActionPerformed(evt); } });

add(button2);

button2.setBounds(250, 200, 110, 24);

button3.setLabel("Закрыть");

button3.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

button3ActionPerformed(evt); }});

add(button3);

button3.setBounds(250, 150, 100, 24);

setBounds(500, 500, 400, 300); }

/** Завершение приложения */

private void exitForm(java.awt.event.WindowEvent evt) {

System.exit(0); }

private void button1ActionPerformed(java.awt.event.ActionEvent evt) {

// Получаем строку от пользователя и передаем клиенту

try{

String data = textField1.getText();

out.write(data);

out.newLine();

out.flush(); }

catch(Exception e){}}

private void button2ActionPerformed(java.awt.event.ActionEvent evt) {

// Устанавливаем соединение

connect(); }

private void button3ActionPerformed(java.awt.event.ActionEvent evt) {

// Закрываем файл данных, потоки и соединение

try{

fw.close();

in.close();

out.close();

sock.close(); }

catch(Exception e){} }

public void run(){

String indata_;

try {

//Читаем в цикле данные

while(true){

indata_ = in.readLine();

//Отображаем в компоненте

list1.add(indata_);

//Записываем в файл

fw.write(indata_); } }

catch(Exception e){} }

public void connect() {

try {

//Создаем серверный сокет

Для подключения к порту хоста с помощью конструктора класса ServerSocket. Конструктор выбрасывает исключение типа IOException, т.е.понадобится блок try - catch:

ServerSocket ss = new ServerSocket(PORT);

sock = ss.accept();

Метод ss.accept() позволяет серверу следить за портом, или иначе говоря ждать подключения клиента.

//Получаем потоки

in = new BufferedReader(new

InputStreamReader(sock.getInputStream()));

out = new BufferedWriter(new

OutputStreamWriter(sock.getOutputStream()));

сокет java поток сервер

//Запускаем подпроцесс

Как только клиент подключается - сокет для клиента сразу же создается. В противном случае выбрасывается исключение IOException.

Как только клиент подключился к серверу, сервер должен создать потоки ввода и вывода для связи с ним. Это можно сделать следующим образом:

t.start();

//Открываем файл данных

fw = new FileWriter("messageServ.txt");}

catch (Exception ex) {

System.out.println("ошибка "); } }

public static void main(String args[]) {

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

new ServerForm().setVisible(true); } }); }

private java.awt.Button button1;

private java.awt.Button button2;

private java.awt.Button button3;

private java.awt.List list1;

private java.awt.TextField textField1; }

Создаем клиент

Для создания клиента достаточно класса Socket и двух классов для ввода/вывода. Также необходимо знать имя компьютера (хоста), на котором запущен сервер и номер порта.

Листинг ClientForm.java

//** Создаем новое окно клиента */

public ClientForm() {

initComponents();}

private void initComponents() {

list1 = new java.awt.List();

textField1 = new java.awt.TextField();

button1 = new java.awt.Button();

button2 = new java.awt.Button();

button3 = new java.awt.Button();

setName("Client");

setTitle("Клиент");

addWindowListener(new java.awt.event.WindowAdapter() {

public void windowClosing(java.awt.event.WindowEvent evt) {

exitForm(evt);}});

setLayout(null);

add(list1);

list1.setBounds(30, 110, 170, 170);

add(textField1);

textField1.setBounds(30, 70, 170, 20);

button1.setActionCommand("button3");

button1.setLabel("Соединение");

button1.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

button1ActionPerformed(evt);}});

add(button1);

button1.setBounds(260, 250, 100, 24);

button2.setLabel("Отправить");

button2.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

button2ActionPerformed(evt);}});

add(button2);

button2.setBounds(250, 70, 110, 24);

button3.setLabel("Закрыть");

button3.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

button3ActionPerformed(evt);}});

add(button3);

button3.setBounds(260, 200, 90, 24);

setBounds(200, 200, 408, 338);}

/** Выход из приложения */

private void exitForm(java.awt.event.WindowEvent evt) {

System.exit(0);}

private void button1ActionPerformed(java.awt.event.ActionEvent evt) {

// Устанавливаем соединение с с хостом

connect();}

private void button2ActionPerformed(java.awt.event.ActionEvent evt) {

// Получаем строку от пользователя и пересылаем серверу

try{

String data = textField1.getText();

out.write(data);

out.newLine();

out.flush();}

catch(Exception e){}}

private void button3ActionPerformed(java.awt.event.ActionEvent evt) {

// Закрываем файл, потоки и соединение

try{

fw.close();

in.close();

out.close();

ss.close();}

catch(Exception e){}}

public void run(){

String s1;

try{

//В цикле читаем данные из потока

while(true){

s1 = in.readLine();

//Отображаем в компоненте

list1.add(s1);

//Записываем в файл

fw.write(s1);}}

catch(Exception e){}}

public void connect() {

try{

//Устанавливаем соединение с локальным хостом

InetAddress addr = InetAddress.getByName(“192.168.43.142”);

ss = new Socket(addr, 220);

//Получаем потоки ввода_вывода

in = new BufferedReader(new InputStreamReader(ss.getInputStream()));

out = new BufferedWriter(new OutputStreamWriter(ss.getOutputStream()));

//Запускаем новый подпроцесс

process1.start();

//Открываем файл

fw = new FileWriter("messageCli.txt");}

catch(Exception e){

System.out.println("ошибка ");}}

public static void main(String args[]) {

java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {

new ClientForm().setVisible(true);}});}

private java.awt.Button button1;

private java.awt.Button button2;

private java.awt.Button button3;

private java.awt.List list1;

private java.awt.TextField textField1;}

Клиент подключенный к Серверу отправляет сообщение

Рис. 2

Сервер получает сообщение от Клиента

Рис. 3

И наоборот, Клиент получает сообщение от Сервера

Рис. 4

Размещено на Allbest.ru


Подобные документы

  • Сетевые возможности языков программирования. Преимущества использования Java-апплетов. Классы, входящие в состав библиотеки java.awt. Создание пользовательского интерфейса. Сокетное соединение с сервером. Графика в Java. Значения составляющих цвета.

    курсовая работа [508,1 K], добавлен 10.11.2014

  • История создания языка Java. Основные принципы объектно-ориентированного программирования. Структура, особенности синтаксиса и примеры прикладных возможностей использования языка Java, его преимущества. Перспективы работы программистом на языке Java.

    курсовая работа [795,9 K], добавлен 14.12.2012

  • Особенности архитектуры Java. Технология Java Database Connectivity. Кроссплатформенность Java-приложений. Преимущества языка программирования. Логическая структура базы данных. Структура программного комплекса. Верификация программных средств.

    курсовая работа [962,8 K], добавлен 13.01.2016

  • Основа пользовательского интерфейса. Возможности пакетов java.awt.geom, java.awt, классов java.awt.Graphics и java.awt.Graphics2D. Основные графические примитивы и работа с потоками. Листинг программы и составление композиции аффинных преобразований.

    методичка [525,3 K], добавлен 30.06.2009

  • Архитектура Java и Java RMI, их основные свойства, базовая система и элементы. Безопасность и виртуальная Java-машина. Интерфейс Java API. Пример использования приложения RMI. Работа с программой "Calculator". Универсальность, портативность платформ.

    курсовая работа [208,6 K], добавлен 03.12.2013

  • Принцип работы Java. Аплеты как особенность Java-технологии, характеристика методов их защиты. Модель безопасности JDK1.2 и концепция "песочницы". Иерархия криптографических сервисов, алгоритмов. Объектная организация криптографической подсистемы Java.

    реферат [54,8 K], добавлен 09.09.2015

  • Java Script как язык управления сценарием отображения документа. Отличие world wide web от остальных инструментов для работы с Internet. Использование каскадных таблиц стилей в рамках разработки спецификации HTML. Элементы программы Netscape Navigator.

    контрольная работа [1,1 M], добавлен 02.12.2009

  • Создание языка программирования с помощью приложения "Java". История названия и эмблемы Java. Обзор многообразия современных текстовых редакторов. Обработка строки. Методы в классе String. Java: задачи по обработке текста. Примеры программирования.

    курсовая работа [276,1 K], добавлен 19.07.2014

  • Створення баз даних за допомогою стандартних бібліотек Java та клієнт-серверних програм. Основні стандартні класи і методи бібліотек SQL та swing, бібліотек, що дозволяють опрацьовувати дані СУБД та навчитись концепціям програмування мовою Java.

    лабораторная работа [215,3 K], добавлен 04.10.2011

  • Разработка графического редактора для рисования двухмерной и трехмерной графики, используя язык программирования Java и интерфейсы прикладного программирования Java 2D и Java 3D. Создание графического редактора 3D Paint. Основные методы класса Graphics.

    курсовая работа [197,5 K], добавлен 19.11.2009

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.