Простая реализация веб -сервера Java, относительно простая, основанная на java.net.socket и java.net.serversocket;
1. Шаги выполнения программы
1. Создать объект Serversocket;
2. Вызовите метод принятия объекта Serversocket и дождитесь соединения. Если соединение будет успешным, будет возвращен объект сокета, в противном случае он будет заблокирован и ждать;
3. Получите потоки Byte InputStream и OutputStream из объекта сокета, и эти два потока соответствуют запросу и ответу на запрос и ответе соответственно;
4. Обработайте запрос: прочитайте информацию о потоке Byte InputStream, преобразуйте его в строковую форму и проанализируйте его. Проанализирование здесь относительно прост, и он получает только информацию URI (единый идентификатор ресурсов);
5. Обработка ответа: на основе проанализированной информации URI, найдите запрошенный файл ресурса ресурса из каталога Web_ROOT, прочитать файл ресурса и написать его в поток байта outputStream;
6. Закройте объект сокета;
7. Перейдите к шагу 2 и продолжайте ждать запроса на соединение;
2. Реализация кода
Реализация сервера:
пакет ex01.pyrmont; импорт java.net.socket; import java.net.serversocket; импорт java.net.inetaddress; import java.io.inputstream; импорт java.io.outputstream; import java.io.ioexcept Другие файлы хранятся. Web_root здесь представляет собой каталог WebRoot в рабочем каталоге*/ public Static Final String Web_Root = System.getProperty ("user.dir") + file.separator + "webRoot"; // Close Service Command Private Static Final String uplowdown_command = "/shutdown"; public static void main (string [] args) {httpserver server = new httpserver (); // ждать сервера запроса подключения. Await (); } public void wait () {serversocket serversocket = null; int port = 8080; try {// Server Socket Object Serversocket = new Serversocket (порт, 1, inetAddress.getByName ("127.0.0.1")); } catch (ioException e) {e.printstackTrace (); System.Exit (1); } // Цикл, чтобы ждать запроса, пока (true) {сокет сокет = null; InputStream input = null; OutputStream output = null; try {// ждать соединения после успеха соединения, верните сокет объекта сокета = serversocket.accep (); input = socket.getInputStream (); output = socket.getOutputStream (); // Создание объекта запроса и запроса Parse = New Request (Input); request.parse (); // Проверьте, является ли это закрытой командой службы if (request.geturi (). Equals (shutdown_command)) {break; } // Создать ответ объекта ответа ответа = новый ответ (output); response.setRequest (запрос); response.sendstaticresource (); // закрыть сокет объекта сокета.close (); } catch (Exception e) {e.printstackTrace (); продолжать; }}}}Запрос класса:
пакет ex01.pyrmont; import java.io.inputstream; import java.io.ioexception; Public Class Request {private InputStream Input; частная строка URI; public Request (InputStream Input) {this.input = input; } // Читать информацию о запросе от InputStream и получить значение URI из запроса public void parse () {stringbuffer request = new StringBuffer (2048); int i; Byte [] buffer = новый байт [2048]; try {i = input.read (buffer); } catch (ioException e) {e.printstackTrace (); i = -1; } for (int j = 0; j <i; j ++) {request.append ((char) buffer [j]); } System.out.print (request.tostring ()); uri = parseuri (request.tostring ()); } /** * * * Форма requestString заключается в следующем: * get /index.html http /1.1 * host: localhost: 8080 * Соединение: Keep-alive * Cache-Control: max-age = 0 * ... * Цель этой функции-получить /index.html String * /private String parseuri (строка QueersString) {indEx1; index1 = requestString.indexof (''); if (index1! = -1) {index2 = requestString.indexof ('', index1 + 1); if (index2> index1) return requestString.substring (index1 + 1, index2); } return null; } public String geturi () {return uri; }} Класс ответов:
пакет ex01.pyrmont; импорт java.io.outputstream; import java.io.ioexception; импорт java.io.fileinputstream; импорт java.io.file;/ * http response = status-line * (Общий заголовок | hattp header | intith-header) crlf) crlf [crlf-body-body] Состояние http warsion sppion spphio spphio sppion spphio sp-cde-cde-cde-cde-cde-crode-crode-cde-crode-crode-cde-crode-crlas CRLF*/Ответ открытого класса {Private Static Final Buffer_size = 1024; Запрос на запрос; Выходные выходные данные; Public Response (OutputStream Output) {this.Output = output; } public void setRequest (запрос запроса) {this.Request = request; } public void sendStaticResource () бросает ioException {byte [] bytes = new Byte [buffer_size]; FileInputStream fis = null; try {// Записать веб -файл в файл outputstream byte file = new File (httpserver.web_root, request.geturi ()); if (file.exists ()) {fis = new FileInputStream (file); int ch = fis.read (bytes, 0, buffer_size); while (ch! = -1) {output.write (bytes, 0, ch); ch = fis.read (байты, 0, buffer_size); }} else {// Файл не найден string errormessage = "http/1.1 404 Файл не найден/r/n" + "content-type: text/html/r/n" + "content-length: 23/r/n" + "/r/n" + "<h1> файл не найден </h1>"; output.write (errormessage.getbytes ()); }} catch (Exception e) {// брошен, если не может создать экземпляр системы объекта файла. } наконец {if (fis! = null) fis.close (); }}} 3. Тест результатов
Доступ к существующим файлам ресурсов (обратите внимание, что они хранятся в папке WebRoot в каталоге проекта):
Доступ к несуществующим файлам ресурсов:
Закройте сервер:
Ссылка: «Глубокий анализ Tomcat»
@author, похожий на ветру, кодировщик
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.