- 01
 - 02
 - 03
 - 04
 - 05
 - 06
 - 07
 - 08
 - 09
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 - 25
 - 26
 - 27
 - 28
 - 29
 - 30
 - 31
 - 32
 - 33
 - 34
 - 35
 - 36
 - 37
 - 38
 - 39
 - 40
 - 41
 - 42
 - 43
 - 44
 - 45
 - 46
 - 47
 - 48
 - 49
 - 50
 - 51
 - 52
 - 53
 - 54
 - 55
 - 56
 - 57
 - 58
 - 59
 - 60
 - 61
 
                        public class HttpServer {
    public static void main(String[] args) throws Throwable {
        ServerSocket ss = new ServerSocket(8080);
        while (true) {
            Socket s = ss.accept();
            System.err.println("Client accepted");
            new Thread(new SocketProcessor(s)).start();
        }
    }
    private static class SocketProcessor implements Runnable {
        private Socket s;
        private InputStream is;
        private OutputStream os;
        private SocketProcessor(Socket s) throws Throwable {
            this.s = s;
            this.is = s.getInputStream();
            this.os = s.getOutputStream();
        }
        public void run() {
            try {
                readInputHeaders();
                writeResponse("<html><body><h1>Hello from Habrahabr</h1></body></html>");
            } catch (Throwable t) {
                /*do nothing*/
            } finally {
                try {
                    s.close();
                } catch (Throwable t) {
                    /*do nothing*/
                }
            }
            System.err.println("Client processing finished");
        }
        private void writeResponse(String s) throws Throwable {
            String response = "HTTP/1.1 200 OK\r\n" +
                    "Server: YarServer/2009-09-09\r\n" +
                    "Content-Type: text/html\r\n" +
                    "Content-Length: " + s.length() + "\r\n" +
                    "Connection: close\r\n\r\n";
            String result = response + s;
            os.write(result.getBytes());
            os.flush();
        }
        private void readInputHeaders() throws Throwable {
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            while(true) {
                String s = br.readLine();
                if(s == null || s.trim().length() == 0) {
                    break;
                }
            }
        }
    }
}
                                 
        
            Это весь код вебсервера.
К слову сказать, это от сюда:
http://habrahabr.ru/blogs/java/69136/
        
        
примерно так
В какой раздел?
как маленькие дети со стековерфлоу, ёмоё
плагины, это совсем, совсем другое
у меня юзерскрипт в GM режиме этим занимается
точно, я имел ввиду Жирную Обезьяну
эта неведомая зверушка -- ложная лиса
у меня опера если чо, в ФФ по причине долбоебизма тех, кто попап-блокер делал клик надо диспатчить через три жопы
у оперы только позавчера в релиз пошло, я не поигрался еще толком, похоже на виджеты
а я написал уже плаг с сиськаме
а про ГМ интересная идея, мне тамошний набор API нра, надо поглянуть как оно внутри устроено
Виджеты уже оперы давно. http://www.opera.com/widgets/
без UI свистоперделок букмарклетов вполне достаточно
Хорошо бы понимать, что на самом деле происходит, прежде чем наворачивать десять уровней абстракций. А то так и появляются продукты для этого сайта.
1)Сильно громкое название (HTTP сервер) для почти ничего не делающей заглушки.
2)Способ представления странцы и кодировка, который запрашивается браузером - здесь игнорируется. Opera скорее всего откроет нормально странцу, а IE её пошлёт.
3)Вообще на любой запрос открывает одно и тоже. Во браузер удивиться, когда на запрос favicon.ico ему придёт HTML страница. О_о (Браузеры всегда запрашивают favicon.ico автоматически).
>YarServer
Название LolServer подошло бы больше.
Пример вполне корректен.
Вот пример хелоуворда для Си:
#include <stdio.h>
int main()
{
printf("Hello, world!\n");
return 0;
}
Где ошибки? Все верно. Плохому не учит.
puts() быстрее чем printf()
>class SocketProcessor implements Runnable
Должно быть так:
При подключении нового клиента - из пула потоков береться новый поток и обрабатывает его запрос, а в это время основной поток ждет новых подключений клиентов.
да, только то, что клиент смог подключится - ошибка )
By convention, this output stream is used to display error messages or other information that should come to the immediate attention of a user even if the principal output stream, the value of the variable out, has been redirected to a file or other destination that is typically not continuously monitored.