21
Разработка сетевых приложений на Java Алексей Владыкин 5 декабря 2016 Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 1 / 21

Программирование на Java, осень 2016: Разработка сетевых приложений на Java

Embed Size (px)

Citation preview

Page 1: Программирование на Java, осень 2016: Разработка сетевых приложений на Java

Разработка сетевых приложений на Java

Алексей Владыкин

5 декабря 2016

Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 1 / 21

Page 2: Программирование на Java, осень 2016: Разработка сетевых приложений на Java

1 Как компьютеры общаются между собой?

2 Сокеты

3 URL и URI

4 Пишем свой HTTP-сервер

Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 2 / 21

Page 3: Программирование на Java, осень 2016: Разработка сетевых приложений на Java

Как компьютеры общаются между собой?

Стек протоколов:Прикладной уровень(HTTP, FTP, SSH, . . . )Транспортный уровень(TCP, UDP, . . . )Сетевой уровеньКанальный уровень

Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 3 / 21

Page 4: Программирование на Java, осень 2016: Разработка сетевых приложений на Java

Как компьютеры общаются между собой?

TCP

Transmission Control Protocol

Протокол транспортного уровняС установлением соединенияС гарантиями доставки и порядка

Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 4 / 21

Page 5: Программирование на Java, осень 2016: Разработка сетевых приложений на Java

Как компьютеры общаются между собой?

UDP

User Datagram Protocol

Протокол транспортного уровняБез установления соединенияБез гарантий доставки и порядкаНо зато минимизируются задержки

Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 5 / 21

Page 6: Программирование на Java, осень 2016: Разработка сетевых приложений на Java

Как компьютеры общаются между собой?

HTTP

Request:

GET / HTTP/1.1Host: localhostUser-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:50.0)

Gecko/20100101 Firefox/50.0

Response:

HTTP/1.1 200 OKContent-Type: text/html

<h1>Hello world</h1>

Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 6 / 21

Page 7: Программирование на Java, осень 2016: Разработка сетевых приложений на Java

Как компьютеры общаются между собой?

Поддержка в Java

TCP:java.net.Socket и java.net.ServerSocket

UDP:java.net.DatagramSocket

HTTP:java.net.URL (но лучше сторонние библиотеки)

Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 7 / 21

Page 8: Программирование на Java, осень 2016: Разработка сетевых приложений на Java

Сокеты

Низкоуровневый API для пересылки байтов по сети

Поддерживаются протоколы TCP и UDP

Поддерживается адресация IPv4 (213.180.204.3)и IPv6 (2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d)

Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 8 / 21

Page 9: Программирование на Java, осень 2016: Разработка сетевых приложений на Java

Сокеты

java.net.DatagramSocket (клиент)

try (DatagramSocket s = new DatagramSocket ()) {DatagramPacket p = new DatagramPacket(

buf , buf.length , remoteAddress );s.send(p);

}

Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 9 / 21

Page 10: Программирование на Java, осень 2016: Разработка сетевых приложений на Java

Сокеты

java.net.DatagramSocket (сервер)

try (DatagramSocket s = new DatagramSocket(port )){byte[] buf = new byte [1024];DatagramPacket p = new DatagramPacket(

buf , buf.length );s.receive(p);

}

Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 10 / 21

Page 11: Программирование на Java, осень 2016: Разработка сетевых приложений на Java

Сокеты

java.net.Socket

Клиентский сокет, устанавливает TCP соединение с сервером

Socket socket = new Socket("localhost", 11111);

OutputStream os = socket.getOutputStream ();os.write(requestBytes );os.flush ();

InputStream is = socket.getInputStream ();is.read(responseBytes );

Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 11 / 21

Page 12: Программирование на Java, осень 2016: Разработка сетевых приложений на Java

Сокеты

java.net.ServerSocket

Серверный сокет, ожидает подключений от клиентов

ServerSocket server = new ServerSocket (11111);Socket socket = server.accept ();

InputStream is = socket.getInputStream ();is.read(requestBytes );

OutputStream os = socket.getOutputStream ();os.write(responseBytes );os.flush ();

Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 12 / 21

Page 13: Программирование на Java, осень 2016: Разработка сетевых приложений на Java

URL и URI

Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 13 / 21

Page 14: Программирование на Java, осень 2016: Разработка сетевых приложений на Java

URL и URI

java.net.URI

Uniform Resource Identifier, RFC 3986

Примеры:mailto:[email protected]:isbn:096139210xhttp://java.sun.com/j2se/1.3/docs/guide/collections/designfaq.html#28

Синтаксические операции:разбор на компонентыresolverelativize

Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 14 / 21

Page 15: Программирование на Java, осень 2016: Разработка сетевых приложений на Java

URL и URI

java.net.URL

Uniform Resource Locator, RFC 1738

Примеры:http://java.sun.com/j2se/1.3/file:/home/av/projects/

Поддерживает операции доступа:openConnection(), openStream()

Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 15 / 21

Page 16: Программирование на Java, осень 2016: Разработка сетевых приложений на Java

Пишем свой HTTP-сервер

HTTP-сервер на «голых» сокетах

См. пример

Ручной разбор заголовковОтдельный Thread на каждого клиента – организуем вручную

Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 16 / 21

Page 17: Программирование на Java, осень 2016: Разработка сетевых приложений на Java

Пишем свой HTTP-сервер

HTTP-сервер на Netty

См. пример

Особенности протокола HTTP и многопоточность скрыты NettyПишем только бизнес-логику

Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 17 / 21

Page 18: Программирование на Java, осень 2016: Разработка сетевых приложений на Java

Пишем свой HTTP-сервер

Сервлеты

Сервлет — Java-класс, унаследованный отjavax.servlet.http.HttpServlet

Работает под управлением контейнера сервлетов (IoC)Tomcat, Jetty, . . .

Часть Java Enterprise Edition

См. пример

Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 18 / 21

Page 19: Программирование на Java, осень 2016: Разработка сетевых приложений на Java

Пишем свой HTTP-сервер

Сервлеты

Требуется конфигурационный файл WEB-INF/web.xmlЛибо аннотация @WebServlet

Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 19 / 21

Page 20: Программирование на Java, осень 2016: Разработка сетевых приложений на Java

Пишем свой HTTP-сервер

Сервлеты

Особенности HTTP и организацию многопоточности берет насебя контейнер сервлетовПоддержка пользовательской сессии

В одном war’е может быть много сервлетовВ одном контейнере может быть развернуто много war’овКонтейнер обеспечивает мониторинг и управление

Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 20 / 21

Page 21: Программирование на Java, осень 2016: Разработка сетевых приложений на Java

Пишем свой HTTP-сервер

JSP

HTML с элементами Java-кодаКомпилируются в Java-классы специальным сервлетом

Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 21 / 21