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

Скачать реферат: Описание соккетов на языке 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();

Создание графического оформления

Программа имеет вид:

       

Все элементы выбираются из палитры инструментов имеющихся в используемой программе jBuilder v2.00. Для того что бы разместить выбранный элемент из панели, достаточно выделить его однократным нажатием, и «растянуть» до нужных размеров на рабочем пространстве (bevelPanel1)

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

И нижние два окна jTextArea служат для передачи и приёма текста. Но следует отметить что подписи к этим окнам “Send:” и “Reciev:” создаются отдельным элементом textControl с панели инструментов.

Ещё есть четыре элемента jButton с вкладки Swing. Данные кнопки можно сказать не отличаются от кнопок вкладки JBCL, и выбираются произвольно. При создании кнопки, по умолчанию на ней буде надпись-название самого элемента кнопки. Для изменения этого текста нужно выделить кнопку однократным нажатием и на панели Inspector (правая часть экрана) и напротив строки text вписать нужный текст.

Описание программы

В начале любого приложения подключаются нужные библиотеки.

В Данном примере это:

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 на сервер, после чего оно возвращается обратно при осуществлении подключения. Далее следует отключение на время некоторых кнопок, для исключения ошибок со стороны пользователя.