我們的團隊在Windows上實現VNC查看器(= VNC客戶端)。該協議(稱爲RFB)是有狀態的,這意味着觀看者必須讀取1個字節,看看它是什麼,然後再讀取3或10個字節,解析它們,等等。VNC查看器實現
我們決定使用異步套接字和單個(UI)線程。因此,有兩種方法可行:
1)狀態機 - 如果我們在套接字讀取中遇到阻塞,只記得當前狀態並退出。稍後,套接字通知將到達,中斷的邏輯將從適當的階段恢復; 2)內部消息循環 - 一旦我們確定從套接字讀取將阻塞,我們進入一個內部消息循環並在那裏旋轉,直到最終接收到所有必要的數據爲止。 用戶界面不會在塊凍結的情況下被凍結。
經驗表明,第二種方法是不好的,因爲任何消息都可能在我們進入內部消息循環時發生。我不能在這裏講完整的故事,但它不夠可靠。崩潰和kludges。
第一個選項似乎是完全可以接受的,但在這種風格下編程並不容易。必須記住算法的狀態以及進一步處理所需的所有局部變量的值。
這是很有可能使用多線程,但我們只是認爲在這種情況下的問題將更加困難:幀緩衝區訪問的同步,多線程問題等。此外,即使在這種變體中似乎也需要使用異步套接字。
那麼,你認爲最好的方式是什麼?
問題是相當普遍的問題。這是通過有狀態協議組織異步通信的問題。
編輯1:我們使用C++和MFC作爲UI框架。
哪種語言?異步框架通常在屏蔽實現異步IO循環的骯髒細節方面做得很好,例如, Netty for Java等。 – 2012-07-08 18:12:30
C++/MFC應用程序。 – 2012-07-08 18:15:47