Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / веб сервер / 5 сообщений из 5, страница 1 из 1
18.05.2013, 00:06:50
    #38262911
chicito1988
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб сервер
Есть задание написать простой 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";
}
}

Спасибо
...
Рейтинг: 0 / 0
18.05.2013, 02:02:33
    #38262984
IDVsbruck
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб сервер
Я бы сразу удалил тему за неуважение к смотрящим. Вроде не первый-второй пост, чтобы знать как тэги кода проставляются ...
...
Рейтинг: 0 / 0
18.05.2013, 10:33:44
    #38263076
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб сервер
...
Рейтинг: 0 / 0
25.05.2013, 23:20:47
    #38273405
chicito1988
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб сервер
Blazkowicz,

спасибо за ссылку. У меня осталась проблема только с логами(чтоб сервер записывал логи в папку). Можете мне что то посоветовать?
...
Рейтинг: 0 / 0
26.05.2013, 16:01:18
    #38273701
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
веб сервер
IDVsbruckнеуважение к смотрящим
вечер в хату посоны
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / веб сервер / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]