<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 18.4 使用Socket流 使用wxWidgets的流,你僅使用很少的代碼就可以很容易傳輸很大量的數據.現在,假設我們要通過socket來傳輸一個文件.你可能使用的方法是: 打開這個文件,將所有的內容讀入內存,然后將這塊內存寫入到socket.這種方法對于小文件來說沒什么問題,但是如果這個文件是一個很多兆的大文件,將其完整讀入內存對于一個速度和內存都很小的電腦來說,顯得有些不太現實.而且通常我們需要對大文件進行壓縮然后才發往socket以便降低網絡流量.怎么辦法呢,把大文件讀入內存,對其整個進行壓縮,然后再一次性發送socket,這樣得作法在效率和實用性方面都值得懷疑. OK,我們來想另外一種辦法,每次從文件里讀入一小段數據,比如幾K數據,然后將其壓縮,然后發往socket,如此反復.不幸得是, 小段壓縮比起整個文件一起壓縮來,壓縮效率是大打折扣的.因此我們需要更進一步,維護一個壓縮的狀態,以便后面的小段數據可以使用前面的壓縮信息,也可以避免多次傳遞壓縮頭信息.可是到目前為止,你的代碼已經變的很龐大了,要分段讀取文件,維護壓縮數據,壓縮并且寫入socket. wxWidgets提供了一種更簡便的方法. 因為wxWidgets提供了wxSocketInputStream和wxSocketOutputStream類,通過別的流來將數據讀出或者寫入socket是非常方便的.因為wxWidgets提供了基于文件,字符串,文本,內存以及zlib壓縮的流操作,將這些流和 socket流結合起來使用,可以實現很有趣也是很強大的socket數據操作方法.現在,回過頭來看看我們剛才說的通過socket壓縮傳輸大文件的問題,我們可能已經找到了一個更方便的途徑.要發送一個文件,我們可以現將來自文件的數據流通過zlib的壓縮流以后發送到socket的發送流,這樣我們一下在就有了強大的支持大文件,支持壓縮的,每次只需要讀幾K的socket文件傳輸方法了.而在接收端,我們同樣可以使用流操作將來自socket流的數據通過zlib解壓縮流發送到文件輸出流,最后還原為原來的文件.所有這些可能幾行代碼就足夠了. 我們將使用線程來處理整個過程,以便我們可以既不占用100%的CPU,又不阻塞GUI(正如上一小節討論的那樣),要知道在使用socket傳輸大型的數據的時候,(如果不使用多線程,)這種阻塞幾乎是不可避免的. 完整的例子可以在光盤的examples/chap18目錄中找到. 文件發送線程 下面的例子中演示了流對象在堆上創建,FileSendThread派生自wxThread. ``` FileSendThread::FileSendThread(wxString Filename, wxSocketBase* Socket) { m_Filename = Filename; m_Socket = Socket; Create(); Run(); } void* FileSendThread::Entry() { // 如果10秒之內我們什么數據都發送不了,就超時退出 m_Socket->SetTimeout(10); // 在所有數據發送完成之前,阻塞一切非socket操作 m_Socket->SetFlags(wxSOCKET_WAITALL | wxSOCKET_BLOCK); // 從特定的文件流中讀入數據 wxFileInputStream* FileInputStream = new wxFileInputStream(m_Filename); // 用來寫入socket的流對象 wxSocketOutputStream* SocketOutputStream = new wxSocketOutputStream(*m_Socket); // 我們寫入的將是壓縮以后的數據 wxZlibOutputStream* ZlibOutputStream = new wxZlibOutputStream(*SocketOutputStream); // 將文件的內容寫入壓縮流 ZlibOutputStream->Write(*FileInputStream); // 寫所有的數據 ZlibOutputStream->Sync(); // 釋放ZlibOutputStream將導致發送zlib的壓縮結束標記 delete ZlibOutputStream; // 釋放資源 delete SocketOutputStream; delete FileInputStream; return NULL; } ``` 文件接收線程 接收例子演示了相關流對象也可以在棧上創建.FileReceiveThread派生自wxThread. ``` FileReceiveThread::FileReceiveThread(wxString Filename, wxSocketBase* Socket) { m_Filename = Filename; m_Socket = Socket; Create(); Run(); } void* FileReceiveThread::Entry() { // 如果10秒內什么也收不到,中止接收 m_Socket->SetTimeout(10); // 在我們成功接收完數據之前,阻塞一切其它的代碼 m_Socket->SetFlags(wxSOCKET_WAITALL | wxSOCKET_BLOCK); // 用于輸出數據到文件的流對象 wxFileOutputStream FileOutputStream(m_Filename); // 從socket接收數據的流對象 wxSocketInputStream SocketInputStream(*m_Socket); // zlib解壓縮流對象 wxZlibInputStream ZlibInputStream(SocketInputStream); // 將解壓縮以后的結果寫入文件 FileOutputStream.Write(ZlibInputStream); return NULL; } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看