Windows窗體應用程序(非Console)使用libuv實現簡單的異步WEB服務器

  libuv是一個很強大的異步處理框架(嚴格意義上不能叫框架,其實就是一組異步函數庫,固然框架這東西有各類各樣的定義和理解_^...),最初的的目的是用於NODEJS的異步處理,不過由於它是一個獨立的項目,能夠獨立於NODEJS存在,同時又能夠跨平臺(類UNIX平臺基於LIBEV,WINDOWS平臺基於IOCP),因此也有不少人直接把他當作異步處理庫來使用,其中.net core 的Kestrel Sever就是基於它構建的 。  web

  由於WO對LIBUV理解的也不是很深刻,因此就不詳細的講了,只把源碼附上來,本身看源碼,其中異步的部分是從網上找的TINYWEB的例子,只是和WINDOWS窗體應用程序進行了一次整合而已 。  特此說明  。瀏覽器

  仍是遵循老習慣,先運行起來看看操做,至少先知道程序是個什麼樣子,是作什麼用的 。   服務器

  第一步先下載源碼 
  下載地址 : http://files.cnblogs.com/files/jivi/WinFormLibuvTest.zip框架

  下載下來後是一個壓縮包,解壓縮,目錄結構異步

  

  WinFormLibuv.sln : VS2013的解決方案文件  函數

  lib : libuv的頭文件和Debug以及Release模式下的庫文件放在這個目錄裏 (2016年11月3號)oop

  WinFomrLibuv 主程序目錄   spa

  打開 WinFormLibuv.sln  並運行程序,出現以下界面 .net

  

   點擊啓動服務orm

  

  而後打開瀏覽器,輸入地址 http://localhost:8080

  瀏覽器返加

  

  再看程序

  

  

程序很簡單,就是一個簡單的WEB服務器,監聽端口8080 . 一旦有WEB請求了,就回復Welcome to tinyweb字樣 。

  

由於WINDOWS應用程序有本身的消息(事件)循環 ,

LIBUV也有本身的事件循環,因此主要的點就是怎麼融合這兩個循環,其實方法很簡單(不過官方不推薦這種方式)

while (true)
{
    // 關鍵點在這裏 在WINDOWS的消息循環裏,使用UV_RUN_NOWAIT的方式執行LIBUV的事件循環   
    uv_run(uv_default_loop(), UV_RUN_NOWAIT);
    if (GetMessage(&msg, NULL, 0, 0)){
        if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    else
    {
        break ;  
    }
}
    

固然這種方式對於DialogBox建立的模態窗體沒用,由於DialogBox建立的模態窗體會有本身的消息循環,只有退出模態窗口才會回到主程序的消息循環 。  

另外有沒有其它反作用,也不知 。 :)

----------------------------------------------------------------------------------------------------------

相關文章
相關標籤/搜索