Программирование на java, осень 2016: Разработка сетевых...
Post on 15-Apr-2017
145 Views
Preview:
TRANSCRIPT
Разработка сетевых приложений на Java
Алексей Владыкин
5 декабря 2016
Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 1 / 21
1 Как компьютеры общаются между собой?
2 Сокеты
3 URL и URI
4 Пишем свой HTTP-сервер
Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 2 / 21
Как компьютеры общаются между собой?
Стек протоколов:Прикладной уровень(HTTP, FTP, SSH, . . . )Транспортный уровень(TCP, UDP, . . . )Сетевой уровеньКанальный уровень
Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 3 / 21
Как компьютеры общаются между собой?
TCP
Transmission Control Protocol
Протокол транспортного уровняС установлением соединенияС гарантиями доставки и порядка
Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 4 / 21
Как компьютеры общаются между собой?
UDP
User Datagram Protocol
Протокол транспортного уровняБез установления соединенияБез гарантий доставки и порядкаНо зато минимизируются задержки
Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 5 / 21
Как компьютеры общаются между собой?
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
Как компьютеры общаются между собой?
Поддержка в Java
TCP:java.net.Socket и java.net.ServerSocket
UDP:java.net.DatagramSocket
HTTP:java.net.URL (но лучше сторонние библиотеки)
Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 7 / 21
Сокеты
Низкоуровневый API для пересылки байтов по сети
Поддерживаются протоколы TCP и UDP
Поддерживается адресация IPv4 (213.180.204.3)и IPv6 (2001:0db8:11a3:09d7:1f34:8a2e:07a0:765d)
Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 8 / 21
Сокеты
java.net.DatagramSocket (клиент)
try (DatagramSocket s = new DatagramSocket ()) {DatagramPacket p = new DatagramPacket(
buf , buf.length , remoteAddress );s.send(p);
}
Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 9 / 21
Сокеты
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
Сокеты
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
Сокеты
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
URL и URI
Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 13 / 21
URL и URI
java.net.URI
Uniform Resource Identifier, RFC 3986
Примеры:mailto:java-net@java.sun.comurn:isbn:096139210xhttp://java.sun.com/j2se/1.3/docs/guide/collections/designfaq.html#28
Синтаксические операции:разбор на компонентыresolverelativize
Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 14 / 21
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
Пишем свой HTTP-сервер
HTTP-сервер на «голых» сокетах
См. пример
Ручной разбор заголовковОтдельный Thread на каждого клиента – организуем вручную
Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 16 / 21
Пишем свой HTTP-сервер
HTTP-сервер на Netty
См. пример
Особенности протокола HTTP и многопоточность скрыты NettyПишем только бизнес-логику
Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 17 / 21
Пишем свой HTTP-сервер
Сервлеты
Сервлет — Java-класс, унаследованный отjavax.servlet.http.HttpServlet
Работает под управлением контейнера сервлетов (IoC)Tomcat, Jetty, . . .
Часть Java Enterprise Edition
См. пример
Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 18 / 21
Пишем свой HTTP-сервер
Сервлеты
Требуется конфигурационный файл WEB-INF/web.xmlЛибо аннотация @WebServlet
Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 19 / 21
Пишем свой HTTP-сервер
Сервлеты
Особенности HTTP и организацию многопоточности берет насебя контейнер сервлетовПоддержка пользовательской сессии
В одном war’е может быть много сервлетовВ одном контейнере может быть развернуто много war’овКонтейнер обеспечивает мониторинг и управление
Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 20 / 21
Пишем свой HTTP-сервер
JSP
HTML с элементами Java-кодаКомпилируются в Java-классы специальным сервлетом
Алексей Владыкин Разработка сетевых приложений 5 декабря 2016 21 / 21
top related