Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вебинтерфейс 
:(
    Опции темы
GoldFinch
Дата 2.10.2009, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



нужно сделать вебинтерфейс к программе, для того чтобы просматривать ее состояние, и при необходимости изменять его

на мой взгляд - оптимальное решение - это статичные html файлы со скриптами (js) которые будут запрашивать данные у сервера вебинтерфейса и отправлять ему ввод пользователя

соответственно вебинтерфейс должен уметь 
- грузить файлы с диска (html, js, css, картинки)
- вызывать пользовательские коллбеки при запросе данных

в коллбеки передаются параметры запроса, а результат работы коллбека отправляется клиенту (js коду в браузере)

я написал библиотеку со следующим интерфейсом
Код

namespace webui {
// тип контейнера входных параметров коллбека
class Query;
// тип контейнера выходных параметров коллбека 
class JSON;  
// тип коллбека, 
// вход - параметры GET запроса, 
// выход - JSON структура с данными
typedef boost::function<JSON(const Query& GET)> callback_t;
// тип карты коллбеков
// ключ - путь http запроса, например "test" для http://address:port/test
typedef std::map<std::string,callback_t> callback_map_t;

class Query
{
public:
    //возвращает значение параметра key, которое само приводится к нужному типу
        // пример: int x = query["x"];
    class RVar { public: template<typename T> operator T () const; };
    RVar operator[] (const std::string& key) const;

    //возвращает значение параметра key, с типом T
        // пример: int x = query.cast<int>("x");
    template<typename T> 
    T cast(const std::string& key) const;
};

class JSON
{
public:
    // создает пустой контейнер с ответом
    JSON();
    // создает контейнер содержащий пару key : val
    template<typename T>
    JSON(const char* key, T val);
    // добавляет в контейнер пару key : val
    template<typename T>
    JSON& operator() (const char* key, T val);

    // добавляет\изменяет пару key : val
    // например reply["x"]=x;
    struct LVar { template<typename T> T operator=(const T rhs); };
    LVar operator[] (const char* key) { return LVar(map_,key); }
};

/*********************************************************/

class Server
{
public:
    // задает карту коллбеков
    explicit Server( callback_map_t& callbacks );

    // запускает сервер используя указанный порт 
    // блокирует поток
    void Run( unsigned short port );
};

} // namespace webui

пример использования
Код

struct Point
{
    webui::JSON rotate(const webui::Query& GET)
    {
        int dphi = GET["dphi"];
        double R = sqrt(x*x+y*y);
        double phi = atan(y/x)+dphi*3.14/180;

        webui::JSON r;
        r["x"] = x= R*cos(phi);
        r["y"] = y= R*sin(phi);
        return r;
    }

    Point() : x(0),y(0) {}
    double x,y;
};

webui::JSON move(Point& pt,const webui::Query& GET)
{
    return webui::JSON
        ( "x", pt.x+=GET.cast<int>("dx") )
        ( "y", pt.y+=GET.cast<int>("dy") ) 
        ;
}


int main()
{
        Point pt;

        webui::callback_map_t cb_map;
        cb_map["move"]=boost::bind( move,boost::ref(pt),_1 );
        cb_map["rotate"]=boost::bind( &Point::rotate,&pt,_1 );

        webui::Server srv(cb_map);
        srv.run(1337);        
        // или например
        // boost::thread( &webui::Server::Run, webui::Server(cb_map)/*this*/, 1337/*port*/ );
...............

Код

<script type="text/javascript" src="jquery-1.3.2.js"></script>
<script type="text/javascript">
function update(fn,elems)
{
    var data={};
    for(var i in elems)
        data[elems[i]]=$('#'+elems[i]).val();
    $.getJSON( fn, data, 
        function(r){ for(var i in r) $('#'+i).html(r[i]);} );
}
</script>
<p>
    dx=<input type="text" id="dx" value="1"/>;
    dy=<input type="text" id="dy" value="1"/>;
    phi=<input type="text" id="dphi" value="30"/>
</p>
<button onclick="update('move',['dx','dy'])">move</button>
<button onclick="update('rotate',['dphi'])">rotate</button>
<p>
    x=<span id="x">-</span>
    y=<span id="y">-</span>
</p>


меня в этом интерфейсе библиотеки webui практически все устраивает (где-то может надо что-то сделать поудобнее)
но, реализация моей библиотеки весьма плоха.
и мне очень лень писать нормальный код работы с http, заниматься проблемами с безопасностью http серва, и т.п.

может где-то уже есть похожая готовая библиотека?
или библиотека, которую можно быстро переделать к такому же виду?


PM MAIL ICQ   Вверх
W4FhLF
Дата 3.10.2009, 04:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 20
Всего: 121



Глянь статьи на этой странице.

Библиотеку оформить и на Google Code!

Добавлено через 3 минуты и 1 секунду
http://code.google.com/p/madfish-webtoolkit/


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
jonie
Дата 3.10.2009, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



http://www.terrainformatica.com/htmlayout/
+есть еще гугл V8 либа (javascript движек)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
GoldFinch
Дата 3.10.2009, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



jonie, зачем мне "HTML/CSS renderer" ?
у меня для этого браузер есть
PM MAIL ICQ   Вверх
GoldFinch
Дата 3.10.2009, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Цитата(W4FhLF @  3.10.2009,  05:40 Найти цитируемый пост)
Библиотеку оформить и на Google Code!

пока залил как есть
http://code.google.com/p/cpp-webui/
PM MAIL ICQ   Вверх
GoldFinch
Дата 7.10.2009, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



посмотрел как хттп сервер выглядит на D
http://dsource.org/projects/tango/wiki/HttpServerExample

что-то все больше хочется перейти на D =\
PM MAIL ICQ   Вверх
zim22
Дата 7.10.2009, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(GoldFinch @  7.10.2009,  18:29 Найти цитируемый пост)
посмотрел как хттп сервер выглядит на D

посмотри Pion Network Library
мне кажется, это то, что тебе нужно 


--------------------
PM MAIL   Вверх
GoldFinch
Дата 7.10.2009, 19:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



zim22, я уже смотрел.
мне достаточно было увидеть вот это
Код

00023 void HelloService::operator()(HTTPRequestPtr& request, TCPConnectionPtr& tcp_conn)
00024 {
00025     static const std::string HELLO_HTML = "<html><body>Hello World!</body></html>";
00026     HTTPResponseWriterPtr writer(HTTPResponseWriter::create(tcp_conn, *request,
00027                                                             boost::bind(&TCPConnection::finish, tcp_conn)));
00028     writer->writeNoCopy(HELLO_HTML);
00029     writer->writeNoCopy(HTTPTypes::STRING_CRLF);
00030     writer->writeNoCopy(HTTPTypes::STRING_CRLF);
00031     writer->send();
00032 }

чтобы понять что это невозможно использовать
PM MAIL ICQ   Вверх
zim22
Дата 7.10.2009, 20:01 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(GoldFinch @  7.10.2009,  19:49 Найти цитируемый пост)
мне достаточно было увидеть вот это

как по мне - хорошая либа. с комментариями! smile

Код

//\net\include\pion\net\PionUser.hpp 
/**
 * used to remove given user 
 *
 * @return false if no user with such username
 */
virtual bool removeUser(const std::string &username) {
    boost::mutex::scoped_lock lock(m_mutex);
    UserMap::iterator i = m_users.find(username);
    if (i==m_users.end())
        return false;
    m_users.erase(i);
    return true;
}




--------------------
PM MAIL   Вверх
GoldFinch
Дата 7.10.2009, 20:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



zim22, эти коментарии пишутся затем что лень писать нормальную документацию

а судя по примерам, библиотека совершенно неюзабельна,
как библиотека она ничуть не облегчает написание сервера
PM MAIL ICQ   Вверх
xvr
Дата 8.10.2009, 11:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(GoldFinch @ 7.10.2009,  18:29)
посмотрел как хттп сервер выглядит на D
http://dsource.org/projects/tango/wiki/HttpServerExample

что-то все больше хочется перейти на D =\

Что то не заметил большого преимущества перед С++. Весь сервер построен на библиотеках, взять аналоги для С++ получишь сервер такого же размера.

Вот тут я выкладывал исходники WEB сервера для встраивания в приложение на С++ (без всяких библиотек)

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0598 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.