Хорошо известно, что связь между веб -сервером и клиентом использует протокол HTTP. HTTP является стандартом для запросов и ответов клиента и сервера (TCP). Поскольку протокол HTTP основан на протоколе TCP, я буду использовать сокет в Java для завершения этого простого веб -сервера. Для получения более подробной информации HTTP вы можете проконсультироваться с соответствующей информацией, чтобы узнать об этом.
Перед написанием сервера давайте посмотрим на правила связи между браузером и сервером.
Прежде всего, мы используем Serversocket для моделирования сервера, доступ к нему через браузер и просматриваем контент, запрашиваемый браузером:
Импорт java.io.bufferedwriter; import java.io.inputstream; import java.io.outputstreamwriter; import java.net.inetadress; импорт java.net.inetsocketAddress; импорт java.net.serversocket; импорт java.net.socket; import org.junit.test; jianggujin * */public class hqhttpprotocoltest {@test public void server () throws exection {serversocket serversocket = new Serversocket (80); Сокет сокет = serversocket.accep (); Inputstream stream = socket.getInputStream (); int r = -1; while ((r = stream.read ())! = -1) {System.out.print ((char) r); }}}Запустите его с Junit и получите доступ к нему через браузер: http://127.0.0.1 , мы видим, что вывод содержимого запроса браузера на консоли выглядит следующим образом:
Get/http/1.1host: 127.0.0.1connection: Keep-aliveaccept: text/html, application/xhtml+xml, приложение/xml; q = 0,9, изображение/webp,*/*; Q = 0,837.36 (Mozilla/5.0 (Windows nt 5.1) Applebkit/537.36 (geckla/5.0 (Windows nt 5.1). Chrome/31.0.1650.63 Safari/537.36-accept-encoding: gzip, deflate, sdchaccept-language: Zh-CN, ZH; Q = 0,8
Чтобы лучше проанализировать контент запроса, мы записываем HTML -страницу, чтобы отправить некоторые данные и снова просмотреть контент запроса:
<! Doctype html> <html> <head> <meta charset = "utf-8"> <title> test </title> </head> <body> <form method = "post" action = "http://127.0.0.1? type = "propect"/> </form> </body> </html>
Введите BOB в поле ввода, нажмите кнопку, чтобы отправить, и соблюдайте вывод консоли:
Post/? Test = 123 http/1.1host: 127.0.0.1concection: keep-alivecontent-lengh (Windows NT 5.1) AppleWebkit/537,36 (khtml, как гекко) хром/31,0,1650,63 Safari/537,36Content-Type: Application/X-WWW-Form-Urlencodedaccept-Encoding: Gzip, Deflate, Sdchaccept-language: ZH-CN, Q = Q = Q = Q = Q = Q =.
Давайте проанализируем содержание этого запроса:
Первая строка: состоит из трех частей, разделенных пространствами в середине, первой частью является метод запроса (get, post), вторая часть - это путь запроса и параметры запроса, а третья часть - версия протокола HTTP (http/1.1).
Строка 2 до строки 10: Информация о заголовке запроса, имя и значение заголовка запроса передается: разделяйте одиннадцатую строку: пустая строка 12 -я строка: Отправленное содержание формы, мы можем сделать следующий вывод: Первое поведение информации о запросе - это метод запроса, путь запроса, параметры запроса и версия протокола HTTP. После разрыва строки /r /n информацию заголовка запроса сразу же сопровождается разрывом строки /r /n, информация о заголовке запроса сопровождается пустой строкой после завершения информации о заголовке запроса, и данные запроса сразу же следует пустой строке. Следует отметить, что это только моделируется. Что касается сложных файловых материалов и т. Д., Это не обсуждается здесь, и формат содержания запроса немного отличается.
На этом этапе мы уже знали контент, запрошенный клиентом. Давайте посмотрим на формат данных ответа сервера после получения запроса. Мы создаем новый веб -проект для тестирования и редактирования содержания страницы HTML следующим образом:
<! Doctype html> <html> <head> <meta charset = "utf-8"> <title> test </title> </head> <body> Это тестовая страница. </Body> </html>
Запустите сервер, затем напишите тестовый код клиента, чтобы получить данные возврата сервера:
Импорт java.io.bufferedwriter; import java.io.inputstream; import java.io.outputstreamwriter; import java.net.serversocket; импорт java.net.socket; импорт org.junit.test;/** * Server () бросает исключение {serversocket serversocket = new Serversocket (80); Сокет сокет = serversocket.accep (); Inputstream stream = socket.getInputStream (); // BufferedInputStream inputStream = new BufferedInputStream (Stream); int r = -1; while ((r = stream.read ())! = -1) {System.out.print ((char) r); }} @Test public void client () Throws Exception {Socket Socket = new Socket ("127.0.0.1", 80); BufferedWriter Writer = New BufferedWriter (New OutputStreamWriter (socket.getOutputStream ())); writer.write ("get /servlet/test.html http/1.1/r/n"); writer.write ("Ведущий: 127.0.0.1/r/n"); writer.write ("Connection: Keep-alive/r/n"); writer.write ("Принять: Text/html, Application/xhtml+xml, Application/xml; q = 0,9, image/webp,*/*; q = 0,8/r/n"); writer.write («Пользовательский агент: Mozilla/5.0 (Windows NT 5.1) AppleWebkit/537.36 (khtml, как гекко) Chrome/31.0.1650.63 Safari/537.36/r/n»); writer.write ("Принятие-кодирование: gzip, deflate, sdch/r/n"); writer.write ("Принятие языка: zh-cn, zh; q = 0,8/r/n"); writer.write ("/r/n"); writer.flush (); Inputstream stream = socket.getInputStream (); int r = -1; while ((r = stream.read ())! = -1) {System.out.print ((char) r); }}}Запуск программы, чтобы получить сервер, возвращает следующий контент:
Http/1.1 200 Okserver: Apache-Coyote/1.1accept-Ranges: Bytesetag: w/"129-1456125361109" GMT <! Doctype html> <html> <head> <head> <meta charset = "utf-8"> <title> test </title> </head> <body> Это тестовая страница. </Body> </html>
Точно так же давайте проанализируем это возвращаемое сообщение:
Первая строка состоит из трех частей, разделенных пространствами в середине, первой частью является версия протокола HTTP (http/1.1), вторая часть - код состояния ответа, а третья часть - это описание состояния ответа второй строки на седьмую строку, информация о ответе с именем ответа может: «Отдельная линия»: «В конце концов». Заключение: Первое, что - это версия протокола HTTP информации о запросе, код состояния ответа и описание состояния ответа, и информация о заголовке ответа сопровождается разрывом строки /r /n, а информация заголовка ответа передается /R /N Line Break, а информация о заголовке ответов сопровождается пустой строкой после завершения информации заголовка ответа, а данные ответа сразу следуют данными ответа. Следует отметить, что в дополнение к этому ответу, на самом деле существуют другие соответствующие методы, такие как кусок, которые здесь не обсуждаются, и вы можете проверить соответствующую информацию.
До сих пор мы проанализировали формат контента запроса клиента и соответствующий формат контента сервера. Эта статья заканчивается здесь. Я надеюсь, что это будет полезно для каждого обучения.