|
|
|
веб сервер
|
|||
|---|---|---|---|
|
#18+
Есть задание написать простой web server на java. Сервер должен уметь принимать запрос и отсылать ответ в виде: HTTP/1.1 200 OK Server: MaServer Content-length: в байтах Content-Language Connection:close Content-type:text/html Содержание файла ............ или HTTP/1.1 404 Not found Server: Тоесть сервер ищет файл в папке DocDir и отсылает ответ клиенту. Плюс надо вести LogDir где должны записываться кто, когда, во сколько и что запрашивал. У меня неснольно проблем: 1. Куда и как правильно написать код для запись в LogDir 2. Куда вписать код ответа клиенту (см. выше) 3. Как открыть файл (содержание) в конце ответа сервера? 4. как записать Content-length: в байтах Заранее спасибо всем кто найдет время мне помочь!!!!!!! Мой код public class HttpServer extends Thread { /** * Первым аргументом может идти номер порта. */ public static void main(String[] args) { /* Если аргументы отсутствуют, порт принимает значение поумолчанию */ int port = 2001; if (args.length > 0) { port = Integer.parseInt(args[0]); } /* Создаем серверный сокет на полученном порту */ ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(port); System.out.println("Server started on port: " + serverSocket.getLocalPort() + "\n"); } catch (IOException e) { System.out.println("Port " + port + " is blocked."); System.exit(-1); } while (true) { try { Socket clientSocket; clientSocket = serverSocket.accept(); /* Для обработки запроса от каждого клиента создается * отдельный объект и отдельный поток */ ClientSession session = new ClientSession(clientSocket); new Thread(session).start(); } catch (IOException e) { System.out.println("Failed to establish connection."); System.out.println(e.getMessage()); System.exit(-1); } } } ____________________________________________________________________________________ public class ClientSession extends Thread { private Socket socket; private InputStream in = null; private OutputStream out = null; private static final String DEFAULT_FILES_DIR = "/DocDir"; @Override public void run() { try { this.socket.getLocalAddress(); /* Получаем заголовок сообщения от клиента */ String header = readHeader(); System.out.println(header + "\n"); /* Получаем из заголовка указатель на интересующий ресурс */ String url = getURIFromHeader(header); System.out.println("Resource: " + url + "\n"); /* Отправляем содержимое ресурса клиенту */ int code = send(url); // in log schreiben System.out.println("************************************"); } catch (IOException e) { e.printStackTrace(); } finally { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } public ClientSession(Socket socket) throws IOException { this.socket = socket; initialize(); } private void initialize() throws IOException { /* Получаем поток ввода, в который помещаются сообщения от клиента */ in = socket.getInputStream(); /* Получаем поток вывода, для отправки сообщений клиенту */ out = socket.getOutputStream(); } /** * Считывает заголовок сообщения от клиента. * * @return строка с заголовком сообщения от клиента. * @throws IOException */ private String readHeader() throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(in)); StringBuilder builder = new StringBuilder(); String ln = null; while (true) { ln = reader.readLine(); if (ln == null || ln.isEmpty() ) { break; } builder.append(ln + System.getProperty("line.separator")); } return builder.toString(); } /** * Вытаскивает идентификатор запрашиваемого ресурса из заголовка сообщения * от клиента. * * @param header заголовок сообщения от клиента. * @return идентификатор ресурса. */ private String getURIFromHeader(String header) { int from = header.indexOf(" ") + 1; int to = header.indexOf(" ", from); String uri = header.substring(from, to); int paramIndex = uri.indexOf("?"); if (paramIndex != -1) { uri = uri.substring(0, paramIndex); } return DEFAULT_FILES_DIR + uri; } // "вырезает" из HTTP заголовка URI ресурса и конвертирует его в filepath // URI берётся только для GET и POST запросов, иначе возвращается null protected String getPath(String header) { // ищем URI, указанный в HTTP запросе // URI ищется только для методов POST и GET, иначе возвращается null String URI = extract(header, "GET ", " "), path; if (URI == null) { URI = extract(header, "POST ", " "); } if (URI == null) { return null; } // если URI записан вместе с именем протокола // то удаляем протокол и имя хоста path = URI.toLowerCase(); if (path.indexOf(" http://", 0) == 0) { URI = URI.substring(7); URI = URI.substring(URI.indexOf("/", 0)); } else if (path.indexOf("/", 0) == 0) { URI = URI.substring(1); // если URI начинается с символа /, удаляем его } // отсекаем из URI часть запроса, идущего после символов ? и # int i = URI.indexOf("?"); if (i > 0) { URI = URI.substring(0, i); } i = URI.indexOf("#"); if (i > 0) { URI = URI.substring(0, i); } // конвертируем URI в путь до документов // предполагается, что документы лежат там же, где и сервер // иначе ниже нужно переопределить path path = "." + File.separator; char a; for (i = 0; i < URI.length(); i++) { a = URI.charAt(i); if (a == '/') { path = path + File.separator; } else { path = path + a; } } return path; } // "вырезает" из строки str часть, находящуюся между строками start и end // если строки end нет, то берётся строка после start // если кусок не найден, возвращается null // для поиска берётся строка до "\n\n" или "\r\n\r\n", если таковые присутствуют protected String extract(String str, String start, String end) { int s = str.indexOf("\n\n", 0), e; if (s < 0) { s = str.indexOf("\r\n\r\n", 0); } if (s > 0) { str = str.substring(0, s); } s = str.indexOf(start, 0) + start.length(); if (s < start.length()) { return null; } e = str.indexOf(end, s); if (e < 0) { e = str.length(); } return (str.substring(s, e)).trim(); } /** * Отправляет ответ клиенту. В качестве ответа отправляется http заголовок и * содержимое указанного ресурса. Если ресурс не указан, отправляется * перечень доступных ресурсов. * * @param url идентификатор запрашиваемого ресурса. * @return код ответа. 200 - если ресурс был найден, 404 - если нет. * @throws IOException */ private int send(String url) throws IOException { InputStream strm = HttpServer.class.getResourceAsStream(url); int code = (strm != null) ? 200 : 404; String header = getHeader(code); PrintStream answer = new PrintStream(out, true, "UTF-8"); ////////////////////////////////// if (code== 200) { int count = 0; byte[] buffer = new byte[1024]; while ((count = strm.read(buffer)) != -1) { out.write(buffer, 0, count); } strm.close(); } return code; } /** * Возвращает http заголовок ответа. * * @param code код результата отправки. * @return http заголовок ответа. */ private String getHeader(int code) { //////////////////////////////////// Logger logger = Logger.getLogger(ClientSession.class.getName()); /////////////////////////////////////// StringBuffer buffer = new StringBuffer(); buffer.append("HTTP/1.1 ").append(code).append(" ").append(getAnswer(code)).append("\n"); System.out.println(buffer.append("Date: ").append(new Date().toString()).append("\n")); return buffer.toString(); } /** * Возвращает комментарий к коду результата отправки. * * @param code код результата отправки. * @return комментарий к коду результата отправки. */ private String getAnswer(int code) { switch (code) { case 200: return "OK"; case 404: return "Not Found\n Server: HttpServer"; default: return "Internal Server Error"; } } Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2013, 00:06:50 |
|
||
|
веб сервер
|
|||
|---|---|---|---|
|
#18+
Я бы сразу удалил тему за неуважение к смотрящим. Вроде не первый-второй пост, чтобы знать как тэги кода проставляются ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2013, 02:02:33 |
|
||
|
веб сервер
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, спасибо за ссылку. У меня осталась проблема только с логами(чтоб сервер записывал логи в папку). Можете мне что то посоветовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2013, 23:20:47 |
|
||
|
|

start [/forum/topic.php?fid=59&tid=2129283]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
31ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 293ms |
| total: | 420ms |

| 0 / 0 |
