Сетевые средства Java
Семиуровневая сетевая модель OSI
Уровень 1, физический
Уровень 2, канальный
Стандарты канального уровня
Что такое FDDI
Что такое X.25
Что такое Frame Relay
Уровень 3, сетевой
Протоколы сетевого уровня
Уровень 4, транспортный
Уровень 5, сеансовый
Уровень 6, уровень представления
Уровень 7, прикладной
Протоколы 7-го уровня
Схема отправки данных
Отправка запроса на URL
Упражнение
TCP-обмен
Упражнение
UDP-обмен
Упражнение

Сетевые средства Java

1. Сетевые средства Java

2. Семиуровневая сетевая модель OSI

3.

4. Уровень 1, физический

Физический уровень получает пакеты данных от
вышележащего канального уровня и
преобразует их в оптические или электрические
сигналы, соответствующие 0 и 1 бинарного
потока. Эти сигналы посылаются через среду
передачи на приемный узел.
IEEE 802.3 -- Ethernet
IEEE 802.5 -- Token ring

5. Уровень 2, канальный

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

6. Стандарты канального уровня

Ethernet
Token ring
FDDI
X.25
Frame relay

7.

В сети ETHERNET циркулируют сетевые кадры
переменного размера:

8. Что такое FDDI

Это стандарт передачи данных на
расстояния до 200 км.
Среда – оптоволокно.
Топология – двойное кольцо (похоже на
TokenRing). Данные по кольцам
циркулируют в разных направлениях.
Одно кольцо основное, другое запасное.

9. Что такое X.25

Протокол для построения глобальных сетей
на основе телефонных линий
Протокол содержит очень развитые средства
коррекции ошибок.

10. Что такое Frame Relay

Это дальнейшее развитие идей X.25, но
рассчитанное на качественные линии связи.
Поэтому FR не содержит таких мощных средств
коррекции ошибок (как X.25)
Отличительной особенностью FR является
возможность организации виртуальных
каналов.

11. Уровень 3, сетевой

На сетевом уровне происходит
маршрутизация пакетов на основе
преобразования MAC-адресов в сетевые
адреса.
Сетевой уровень обеспечивает также
прозрачную передачу пакетов на
транспортный уровень.

12.

Источник: http://latysheva2007.narod.ru

13. Протоколы сетевого уровня

IP - протокол Internet
IPX - протокол межсетевого обмена
X.25 (частично реализован на уровне 2)

14. Уровень 4, транспортный

Транспортный уровень делит потоки
информации на достаточно малые
фрагменты (пакеты) для передачи их на
сетевой уровень.
Наиболее распространенные протоколы
транспортного уровня включают:
TCP - протокол управления передачей
NCP - Netware Core Protocol
SPX - упорядоченный обмен пакетами

15. Уровень 5, сеансовый

Сеансовый уровень отвечает за
организацию сеансов обмена данными
между оконечными машинами.

16. Уровень 6, уровень представления

Уровень представления отвечает за
возможность диалога между
приложениями на разных машинах. Этот
уровень обеспечивает преобразование
данных (кодирование, компрессия и т.п.)
прикладного уровня в поток информации
для транспортного уровня.

17. Уровень 7, прикладной

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

18. Протоколы 7-го уровня


FTP - протокол переноса файлов
TFTP - упрощенный протокол переноса файлов
X.400 - электронная почта
Telnet – удаленное выполнение команд
SMTP - простой протокол почтового обмена
CMIP - общий протокол управления информацией
SNMP - простой протокол управления сетью
NFS - сетевая файловая система

19.

Семиуровневая модель, пожалуй, излишне “тяжеловесна”.
Вполне достаточно пятиуровневой модели:

20.

Основа сетевого взаимодействия – сервер,
клиент и протокол.
Сервер – это процесс, предоставляющий
некоторые ресурсы.
Клиент – это процесс, запрашивающий
ресурсы.
Протокол – это правила общения клиента и
сервера.

21.

Сервер как правило находится в состоянии
ожидания соединения с клиентом.
На компьютере могут работать несколько
серверов.
Поскольку сетевой адрес у компьютера
один, то возникает организационная
проблема: как различать сервера?
Эта проблема решается введением понятия
“порт”.

22.

Порт – это целое число из диапазона
[1,65535], которое “закрепляется” за тем
или иным сервером.
Ряд портов закреплены уже “навечно”. Это
порты с номерами 1-1023. Например, 80 –
это порт http-сервера, 25 – порт SMTPсервера и т.д.

23. Схема отправки данных

Программа (на прикладном уровне)
передает данные транспортному
(четвертому) уровню.
На транспортном уровне к блоку данных
добавляются номера портов (отправителя
и получателя) длина сообщения и
контрольная сумма.

24.

Два распространенных протокола
транспортного уровня – TCP и UDP.
Протокол TCP оперирует т.н. пакетами, а UDP
– датаграммами.

25.

Датаграмма UDP невелика (~1K). Если нужно
передать большой объем данных, то
программа-отправитель должна эти
данные сегментировать перед передачей.
Программа-получатель должна объединить
отдельные датаграммы в блок данных.
При этом датаграммы могут дойти до
получателя разными маршрутами, а
некоторые могут потеряться.

26.

Нет гарантии, что все датаграммы дойдут до
получателя.
В целом, UDP напоминает передачу данных
по радио.

27.

ТСР-пакет тоже невелик (при передаче
больших объемов требуется сегментация),
однако протокол более надежен.
ТСР сначала устанавливает двустороннее
(дуплексное) соединение сервера с
клиентом.
Прием каждого пакета подтверждается.
TCP-соединение напоминает телефонный
разговор.

28.

С транспортного уровня пакет “опускается”
на сетевой уровень (третий).
На этом уровне к пакету добавляются IPадреса отправителя и получателя, и
превращается в IP-пакет, после чего он
передается “ниже” на канальный
уровень…
На приемной стороне действия
выполняются в обратном порядке

29.

С точки зрения реализации в среде Java (а
также C/С++) центральным объектом
сетевого обмена является сокет.
Сокет – это объект, который скрывает от
программиста низкоуровневые детали
сетевого обмена и делает обмен по сети
похожим на файловый поток.

30.

Далее мы рассмотрим программную
реализацию нескольких тем:
- Отправка запроса на URL;
- TCP-обмен;
- UDP-обмен.

31. Отправка запроса на URL

32.

import java.net.*;
import java.io.*;
class PostURL{
public static void main(String [] args) {
String req = "HomeLisp";
try {
URL url = new URL("http://homelisp.ru");
URLConnection uc = url.openConnection();
uc.setDoOutput(true);
uc.setDoInput(true);
uc.setUseCaches(false);
uc.setRequestProperty("content-type","application/octet-stream");
uc.setRequestProperty("content-length",""+req.length());
uc.connect();

33.

DataOutputStream dos = new DataOutputStream(uc.getOutputStream());
dos.writeBytes(req);
dos.close();
BufferedReader br = new BufferedReader( new
InputStreamReader(uc.getInputStream()));
String res=null;
while ((res=br.readLine()) != null)
System.out.println(res);
}
catch(MalformedURLException me){
System.err.println(me);
}
catch(UnknownHostException he){
System.err.println(he);
}

34.

catch(UnknownServiceException se){
System.err.println(se);
}
catch(IOException ioe){
System.err.println(ioe);
}
}
}

35. Упражнение

Протранслируйте и запустите код.
Обеспечьте прием имени сайта из
командной строки.

36. TCP-обмен

37.

Далее приводится исходный текст httpклиента, который запрашивает у сервера
файл и выводит его содержание на
консоль.

38.

import java.net.*;
import java.io.*;
import java.util.*;
class tcpClient{
public static void main (String [] args){
if (args.length != 3) {
System.err.println("Usage: tcpClient host port file");
System.exit(0);
}
String host = args[0];
int port = Integer.parseInt(args[1]);
String file = args[2];
try{
Socket sock = new Socket(host,port);
PrintWriter pw = new PrintWriter(new
OutputStreamWriter(sock.getOutputStream()),true);

39.

pw.println("POST "+file+" HTTP/1.1\n");
BufferedReader br = new BufferedReader(new
InputStreamReader(sock.getInputStream()));
String line = null;
line = br.readLine();
StringTokenizer st = new StringTokenizer(line);
String code = null;
if ((st.countTokens() >= 2) && st.nextToken().equals("POST")){
if ((code = st.nextToken()) != "200"){
System.err.println("File not found. code="+code);
System.exit(0);
}
}
while ((line = br.readLine()) != null)
System.out.println(line);

40.

sock.close();
}catch(Exception e){
System.err.println(e);
}
}
}

41.

Теперь рассмотрим текст приложениясервера (протокол http), который будет
предоставлять файлы клиентам.

42.

import java.net.*;
import java.io.*;
import java.util.*;
class tcpServer{
public static void main(String [] args){
try{
ServerSocket ss = new ServerSocket(Integer.parseInt(args[0]));
while (true)
new HttpConnect(ss.accept());
}catch(ArrayIndexOutOfBoundsException ae){
System.err.println("Usage: tcpServer port");
System.exit(0);
}catch(IOException e){
System.out.println(e);
}

43.

}
}
class HttpConnect extends Thread{
private Socket sock;
HttpConnect(Socket s) {
sock=s;
setPriority(NORM_PRIORITY-1);
start();
}
public void run() {
try{
PrintWriter pw = new PrintWriter(new
OutputStreamWriter(sock.getOutputStream()),true);
BufferedReader br = new BufferedReader(new
InputStreamReader(sock.getInputStream()));

44.

String req = br.readLine();
System.out.println("Requset: "+req);
StringTokenizer st = new StringTokenizer(req);
if ((st.countTokens() >= 2) && st.nextToken().equals("POST")) {
if ((req = st.nextToken()).endsWith("/") || req.equals(""))
req+="index.html";
try{
File f = new File(req);
BufferedReader bfr = new BufferedReader(new FileReader(f));
char [] data = new char[(int) f.length()];
bfr.read(data);
pw.println("HTTP/1.1 200 OK\n");
pw.write(data);
pw.flush();
}catch(FileNotFoundException fe){
pw.println("HTTP/1.1 404 Not Found\n");

45.

}catch(IOException ioe){
System.err.println(ioe);
}
}
else pw.println("HTTP/1.1 400 Bad Request\n");
sock.close();
}catch(IOException ioe){
System.err.println(ioe);
}
}
}

46. Упражнение

Протранслируйте и запустите
клиент и север. Убедитесь в их
работоспособности.
Попробуйте зайти на сервер
браузером. Что видите? В чем
причина? Попробуйте ее
исправить.

47. UDP-обмен

48.

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

49.

import java.net.*; // Отправитель
import java.io.*;
class UdpSender{
private String host;
private int port;
UdpSender(String h, int p){
host=h;
port=p;
}
public void sendMessage(String msg){
try{
byte [] data = msg.getBytes();
InetAddress addr = InetAddress.getByName(host);
DatagramPacket pack = new
DatagramPacket(data,data.length,addr,port);
DatagramSocket ds = new DatagramSocket();

50.

ds.send(pack);
ds.close();
}catch(IOException e){
System.err.println(e);
}
}
public static void main(String[] args) {
UdpSender sndr = new UdpSender("localhost",1111);
for(int k=0; k<args.length; k++)
sndr.sendMessage(args[k]);
}
}

51.

import java.net.*; // получатель
import java.io.*;
class UdpReceiver{
public static void main(String [] args){
try{
DatagramSocket ds = new DatagramSocket(1111);
while(true){
DatagramPacket pack = new DatagramPacket(new byte [1024],1024);
ds.receive(pack);
System.out.println(new String (pack.getData()).trim());
}
}catch(Exception e){
System.err.println(e);
}
}
}

52. Упражнение

Протранслируйте проекты,
запустите и убедитесь в их
работоспособности. Что будет,
если в коде получателя опустить
вызов trim?
English     Русский Правила