<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    聶永的博客

    記錄工作/學(xué)習(xí)的點(diǎn)點(diǎn)滴滴。

    c_socket.io_server筆記之htmlfile塊傳輸

    關(guān)于htmlfile chunked傳輸

    Google天才工程師們使用一個(gè)稱為“htmlfile”的 ActiveX 解決了在 IE 中的加載顯示問題,具體是封裝了一個(gè)基于 iframe 和 htmlfile 的 JavaScript comet 對(duì)象,支持 IE、Mozilla Firefox 瀏覽器,但需要服務(wù)器端配合使用。
    稍微熟悉一下有關(guān)Transfer-Encoding: chunked的同學(xué),會(huì)感覺一點(diǎn)技術(shù)含量都沒有。但那是他們的事情,笨鳥先飛,記錄下來,以作備忘。
    我們做一個(gè)時(shí)間顯示,每隔一秒自動(dòng)顯示在頁(yè)面上。那么做這件事情的順序,就很簡(jiǎn)單。

    輸出頭部

    chunked塊傳輸,需要瀏覽器支持,服務(wù)器需要提前告訴瀏覽器端:

    #define HTMLFILE_RESPONSE_HEADER \
    "HTTP/1.1 200 OK\r\n" \
    "Connection: keep-alive\r\n" \
    "Content-Type: text/html; charset=utf-8\r\n" \
    "Transfer-Encoding: chunked\r\n" \
    "\r\n"......
    write_ori(client, HTMLFILE_RESPONSE_HEADER);
    

    在socket.io服務(wù)器中,數(shù)據(jù)量不大,傳輸內(nèi)容無須gzip壓縮,畢竟壓縮算法要耗費(fèi)一些CPU時(shí)間。

    傳輸部分HTML預(yù)備內(nèi)容

    這部分不是必須的,為了調(diào)用客戶端javascript方便,可以提前定義好調(diào)用函數(shù)。

    #define HTMLFILE_RESPONSE_FIRST \
        "<html><head><title>htmlfile chunked example</title><script>var _ = function (msg) { document.getElementById('div').innerHTML = msg; };</script></head><body><div id=\"div\"></div>"......
    char target_message[strlen(HTMLFILE_RESPONSE_FIRST) + 20];
    sprintf(target_message, "%X\r\n%s\r\n", (int)strlen(HTMLFILE_RESPONSE_FIRST), HTMLFILE_RESPONSE_FIRST);
    write_ori(client, target_message);
    

    除了http header頭部輸出,剩下內(nèi)容的輸出,需要注意輸出的簡(jiǎn)單格式:

    具體輸出內(nèi)容長(zhǎng)度16進(jìn)制數(shù)字表示\r\n具體輸出內(nèi)容\r\n

    2D
    <script>_('now time is 1364040943');</script>

    掌握了格式要求之后,其它的,就沒有什么難點(diǎn)。

    設(shè)置定時(shí)器,周期性循環(huán)

    client->timeout.data = client;
    ev_timer_init(&client->timeout, timeout_cb, 1.0, 1.0);
    ev_timer_start(loop, &client->timeout);
    

    時(shí)間觸發(fā)函數(shù)timeout_cb每一秒會(huì)定時(shí)觸發(fā):

    static void timeout_cb(EV_P_ struct ev_timer *timer, int revents) {
    if (EV_ERROR & revents) {
        fprintf(stderr, "error event in timer_beat\n");
        return ;
    }
    if (timer == NULL) {
        fprintf(stderr, "the timer is NULL now !\n");
    }
    client_t *client = timer->data;
    if (client == NULL) {
         fprintf(stderr, "Timeout the client is NULL !\n");
        return;
    }
    char target_msg[50];
    snprintf(target_msg, 50, "now time is %d", (int)ev_time());
    write_body(client, target_msg);
    }
    

    OK,基本功能完畢。

    編譯運(yùn)行

    編譯一下:

    gcc htmlfile.c -o htmlfile ../include/libev.a -lm

    運(yùn)行它:

    ./htmlfile

    打開瀏覽器,輸入地址 http://192.168.190.150:8080/htmlfile,可以看到時(shí)間一點(diǎn)點(diǎn)的流逝,諸如:

    now time is 1364043695

    完整代碼

    posted on 2013-03-28 08:41 nieyong 閱讀(2555) 評(píng)論(0)  編輯  收藏 所屬分類: socket.io

    公告

    所有文章皆為原創(chuàng),若轉(zhuǎn)載請(qǐng)標(biāo)明出處,謝謝~

    新浪微博,歡迎關(guān)注:

    導(dǎo)航

    <2013年3月>
    242526272812
    3456789
    10111213141516
    17181920212223
    24252627282930
    31123456

    統(tǒng)計(jì)

    常用鏈接

    留言簿(58)

    隨筆分類(130)

    隨筆檔案(151)

    個(gè)人收藏

    最新隨筆

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 中文字幕看片在线a免费| 日本免费人成网ww555在线| 亚洲AV乱码久久精品蜜桃| 四虎永久精品免费观看| 青娱乐免费在线视频| 久久成人a毛片免费观看网站| 亚洲黄色在线观看网站| 国产精品亚洲玖玖玖在线观看| 野花香在线视频免费观看大全 | 亚洲精品高清国产一久久| 丁香亚洲综合五月天婷婷| 成人激情免费视频| 免费国产高清毛不卡片基地 | 久久精品中文字幕免费| 亚洲黄片手机免费观看| 久久青青草原亚洲av无码app | 亚洲男人的天堂在线va拉文| 免费人成在线观看视频高潮| 在线播放国产不卡免费视频| 久久精品亚洲日本波多野结衣| 亚洲综合无码精品一区二区三区| 久久九九兔免费精品6| 99精品视频免费在线观看| 久久国产精品国产自线拍免费| 国产人成亚洲第一网站在线播放| 亚洲成AⅤ人影院在线观看| 国产成人在线观看免费网站 | 亚洲午夜国产精品无码| AV在线亚洲男人的天堂| 4虎永免费最新永久免费地址| 美女又黄又免费的视频| 偷自拍亚洲视频在线观看| 理论秋霞在线看免费| 四虎精品成人免费视频| 四虎一区二区成人免费影院网址| 亚洲综合激情另类小说区| 4444亚洲国产成人精品| 亚洲精品成人区在线观看| 真人做人试看60分钟免费视频| 久久精品无码专区免费| 亚洲GV天堂GV无码男同|