Реферат по предмету "Коммуникации и связь"


Описание соккетов на языке java

Соккеты. Прежде чем приложение сможет выполнять передачу аили прием данных, оно должно создать сокет, указав при этом адрес узла IP, номер порта, через который будут передаваться данные, и тип сокета. С адресом узла IP вы уже сталкивались. Номер порта служит для идентификации приложения. Заметим, что существуют так называемые "хорошо известные" (well known) номера портов, зарезервированные для различных приложений. Например, порт с номером 80 зарезервирован для использования серверами

Web при обмене данными через протокол HTTP. Что же касается типов сокетов, то их два - потоковые и датаграммные. С помощью потоковых сокетов вы можете создавать каналы передачи данных между двумя приложениями Java в виде потоков, которые мы уже рассматривали во второй главе. Потоки могут быть входными или выходными, обычными или форматированными, с использованием или без использования буферизации. Скоро вы убедитесь, что организовать обмен данными между приложениями

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

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

с использованием адреса этого приложения в виде сокета и номера порта. При этом одно клиентское приложение может обмениваться данными с несколькими серверными приложениями или наоборот, одно серверное приложение - с несколькими клиентскими. К сожалению, датаграммные сокеты не гарантируют доставку передаваемых пакетов данных. Даже если пакеты данных, передаваемые через такие сокеты, дошли до адресата, не гарантируется, что

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

TCP. Класс Socket Конструкторы класса Socket Чаще всего для создания сокетов в клиентских приложениях вы будете использовать один из двух конструкторов, прототипы которых приведены ниже: public Socket(String host,int port); public Socket(InetAddress address,int port); Первый из этих конструкторов позволяет указывать адрес серверного узла в виде текстовой строки, второй - в виде ссылки на объект класса InetAddress. Вторым параметром задается номер порта, с использованием

которого будут передаваться данные. В классе Socket определена еще одна пара конструкторов, которая, однако не рекомендуется для использования: public Socket(String host, int port, boolean stream); public Socket(InetAddress address, int port, boolean stream); В этих конструкторах последний параметр определяет тип сокета.

Если этот параметр равен true, создается потоковый сокет, а если false - датаграммный. Заметим, что для работы с датаграммными сокетами следует использовать класс DatagramSocket. Методы класса Socket Перечислим наиболее интересные, на наш взгляд, методы класса Socket. Прежде всего, это методы getInputStream и getOutputStream, предназначенные для создания входного и выходного потока, соответственно: public InputStream getInputStream(); public

OutputStream getOutputStream(); Эти потоки связаны с сокетом и должны быть использованы для передачи данных по каналу связи. Методы getInetAddress и getPort позволяют определить адрес IP и номер порта, связанные с данным сокетом (для удаленного узла): public InetAddress getInetAddress(); public int getPort(); Метод getLocalPort возвращает для данного сокета номер локального порта: public int getLocalPort();

После того как работа с сокетом завершена, его необходимо закрыть методом close: public void close(); И, наконец, метод toString возвращает текстовую строку, представляющую сокет: public String toString(); 1. Создание графического оформления Программа имеет вид: Все элементы выбираются из палитры инструментов имеющихся в используемой программе jBuilder v2.00. Для того что бы разместить выбранный элемент из панели, достаточно выделить его однократным

нажатием, и «растянуть» до нужных размеров на рабочем пространстве (bevelPanel1) Самое верхний элемент, содержащий текст localhost называется choiceControl. Это окно выбора IP номера компьютера для осуществления связи. Ниже следует элемент textFieldControl, в нём будет отображаться статус подключения. Эти элементы находятся на вкладке JBCL. И нижние два окна jTextArea служат для передачи и приёма текста.

Но следует отметить что подписи к этим окнам “Send:” и “Reciev:” создаются отдельным элементом textControl с панели инструментов. Ещё есть четыре элемента jButton с вкладки Swing. Данные кнопки можно сказать не отличаются от кнопок вкладки JBCL, и выбираются произвольно. При создании кнопки, по умолчанию на ней буде надпись-название самого элемента кнопки. Для изменения этого текста нужно выделить кнопку однократным нажатием и на панели

Inspector (правая часть экрана) и напротив строки text вписать нужный текст. 2. Опсание программы В начале любого приложения подключаются нужные библиотеки. В Данном примере это: import java.awt.*; import java.awt.event.*; import borland.jbcl.control.*; import borland.jbcl.layout.*; import com.sun.java.swing.*; import java.net.*; import java.io.*; import java.util.*; Далее описываем соккет, строковые переменные, входящий и выходящий потоки:

Socket s; String str; InputStream is; OutputStream os; На следующем этапе создаём входной и выходной потоки, вызывая для этого методы getInputStream и getOutputStream, соответственно: is = s.getInputStream(); os = s.getOutputStream(); Далее приложение подготавливает буфер buf для приема данных и определяет переменную length, в которую будет записываться размер принятого блока данных: byte buf[] = new byte[512]; int lenght;

Теперь все готово для запуска цикла приема и обработки строк от клиентского приложения. Для создания подключения с сервером, пользуясь кнопкой “Connect”, выделим её в режиме Design, и в панели Inspector, на вкладке Events находим строку MouseClicked и нажимаем два раза по её полю. Автоматически переходите в раздел Source и описываем её: void jButton1_mouseClicked(MouseEvent e) {

String adress; {adress = choiceControl1.getSelectedItem(); try { s=new Socket(adress,9999); is=s.getInputStream(); os=s.getOutputStream(); str=new String(buf,0,length); str="Connect"; buf=str.getBytes(); os.write(buf); length=is.read(buf); textFieldControl1.setText(str); jButton2.enable(); jButton2.setEnabled(true); jButton1.disable(); jButton1.setEnabled(false); jButton3.enable(true); } catch(Exception ioe) { } }}

Первая строка генерируется автоматически программой после операции MouseClicked. Затем мы обращаем внимание кнопки на оно в котором указывается путь соединения. И наконец создаём соккет и потоки входящий и выходящий. Всё что идёт ниже, необязательно. В нашем случае это инициализация подключения, путём отправки слова Connect на сервер, после чего оно возвращается обратно при осуществлении подключения.

Далее следует отключение на время некоторых кнопок, для исключения ошибок со стороны пользователя. Ниже описания кнопок Disconnect: void jButton2_mouseClicked(MouseEvent e) { try { is.close(); os.close(); s.close(); } catch (Exception ioe){} } Sand: void jButton3_mouseClicked(MouseEvent e) { try{ String latter=jTextArea1.getText(); for(int i=0;i<latter.length();i++) os.write((byte)latter.charAt(i)); os.write(0); os.flush(); } catch(Exception ioe){} }

Reciev: void jButton4_mouseClicked(MouseEvent e) { try { length=is.read(buf); String latter=new String(buf,0,length); jTextArea2.setText(latter); } catch(Exception ioe){} }} Строка os.write(buf) записывет данные в буфер, который в последствии через выходной поток может отправиться на сервер. Соответственно что бы прочитать из потока, нужно воспользоваться следующим кодом: length=is.read(buf) Код приложения SocketClient import java.awt.*; import java.awt.event.*; import borland.jbcl.

control.*; import borland.jbcl.layout.*; import com.sun.java.swing.*; import java.net.*; import java.io.*; import java.util.*; public class Frame1 extends DecoratedFrame { //Construct the frame BorderLayout borderLayout1 = new BorderLayout(); XYLayout xYLayout2 = new XYLayout(); BevelPanel bevelPanel1 = new BevelPanel(); JButton jButton1 = new

JButton(); JButton jButton2 = new JButton(); JButton jButton3 = new JButton(); JButton jButton4 = new JButton(); TextFieldControl textFieldControl1 = new TextFieldControl(); TextControl textControl1 = new TextControl(); TextControl textControl2 = new TextControl(); JTextArea jTextArea1 = new JTextArea(); JTextArea jTextArea2 = new

JTextArea(); ChoiceControl choiceControl1 = new ChoiceControl(); Socket s; int length; String str; InputStream is; OutputStream os; byte buf[]=new byte[512]; public Frame1() {enableEvents(AWTEvent.WINDOW_EVENT_MASK ); try{jbInit(); } catch (Exception e) { e.printStackTrace(); } } //Component initialization private void jbInit() throws Exception { this.setLayout(borderLayout1); this.setSize(new

Dimension(433, 334)); this.setTitle("Frame Title"); choiceControl1.setItems(new String[] {"localhost", "192.168.1.14", "192.168.1.15", "192.168.1.16", "192.168.1.17", "192.168.1.18", "192.168.1.19", "192.168.1.20", "192.168.1.21",}); textControl1.setFont(new Font("Dialog", 1, 12)); textControl1.setText("

Send:"); textControl2.setFont(new Font("Dialog", 1, 12)); textControl2.setText("Reciev:" ); choiceControl1.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(ItemEvent e) { choiceControl1_itemStateChanged(e); } }); jButton1.setLabel("Connect"); jButton1.setFont(new Font("Dialog", 0, 14)); jButton1.addMouseListener(new java.awt.event.

MouseAdapter() { public void mouseClicked(MouseEvent e) { jButton1_mouseClicked(e); } }); jButton2.setLabel("Disconnect" ); jButton2.setFont(new Font("Dialog", 0, 14)); jButton2.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(MouseEvent e) { jButton2_mouseClicked(e); } }); jButton3.setLabel("Send"); jButton3.setFont(new Font("Dialog",

0, 16)); jButton3.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(MouseEvent e) { jButton3_mouseClicked(e); } }); jButton4.setLabel("Reciev"); jButton4.setFont(new Font("Dialog", 0, 16)); jButton4.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(MouseEvent e) { jButton4_mouseClicked(e); } }); bevelPanel1.setLayout(xYLayout2);

this.add(bevelPanel1, BorderLayout.CENTER); bevelPanel1.add(jButton1, new XYConstraints(211, 8, 97, 34)); bevelPanel1.add(jButton2, new XYConstraints(312, 8, 105, 34)); bevelPanel1.add(jButton3, new XYConstraints(285, 124, 96, 41)); bevelPanel1.add(jButton4, new XYConstraints(287, 222, 97, 38)); bevelPanel1.add(jTextArea1, new

XYConstraints(5, 113, 234, 70)); bevelPanel1.add(jTextArea2, new XYConstraints(6, 205, 233, 69)); bevelPanel1.add(choiceControl1, new XYConstraints(8, 8, 191, 23)); bevelPanel1.add(textFieldControl1, new XYConstraints(7, 49, 190, -1)); bevelPanel1.add(textControl1, new XYConstraints(5, 90, 75, 22)); bevelPanel1.add(textControl2, new

XYConstraints(7, 186, 66, 19)); } void choiceControl1_itemStateChanged(ItemEven t e) {} void jButton1_actionPerformed(ActionEvent e) {} void jButton1_mouseClicked(MouseEvent e) { String adress; {adress = choiceControl1.getSelectedItem(); try { s=new Socket(adress,9999); is=s.getInputStream(); создание вх. и вых. os=s.getOutputStream(); потоков. str=new String(buf,0,length); str="Connect"; buf=str.getBytes(); os.write(buf); описание кнопки ‘Connect” length=is.read(buf); textFieldControl1.setText(str); jButton2.enable(); jButton2.setEnabled(true);

jButton1.disable(); jButton1.setEnabled(false); jButton3.enable(true); } catch(Exception ioe) { }



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

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.