本發明涉及電子技術領域,尤其涉及一種進程間通信方法、電子設備及可讀存儲介質。
背景技術:
在windows系統下,進行進程間通信時,可以采用命名管道namedpipe的方式來實現。在采用命名管道實現進程間數據傳輸時,既可以采用異步的方式也可以采用同步的方式。如果采用同步方式,在發送或者接收大數據量的數據時,極有可能會引起上層應用程序的阻塞或者卡頓。而采用異步傳輸時,由于上層的應用不會等到將所有數據處理完成后才返回,所以利用命名管道進行異步傳輸時,會起到更好的效果。現有技術在使用命名管道時,大多采用的是一對一的方式,也就是單個進程與單個進程之間進行通信,并沒有采用一個進程與多個進程之間進行通信的方式。
技術實現要素:
本發明實施例提供了一種進程間通信方法、電子設備及可讀存儲介質,用于提供一種利用windows的命名管道實現一個服務器進程與多個客戶端進程之間進行異步數據通信的方法。
第一方面,本發明提供了一種進程間通信方法,應用于服務器,包括:
創建服務線程,所述服務線程用于處理針對客戶端的異步任務,所述異步任務包括處理客戶端的連接請求、接收客戶端發送的數據請求以及向客戶端發送數據請求;
調用accept函數,創建所述異步任務對應的異步的命名管道句柄和重疊io,將所述異步的命名管道句柄傳入所述重疊io的pointer字段中,調用connectnamedpipe函數,異步等待來自客戶端的所述異步任務,將所述重疊io存放至所述異步任務對應的存儲空間中,所述服務器中設置有用于存儲所述處理客戶端的連接請求對應的重疊io的第一存儲空間、用于存儲所述接收客戶端發送的數據請求對應的重疊io的第二存儲空間以及用于存儲所述向客戶端發送數據請求對應的重疊io的第三存儲空間;
通過所述服務線程循環查看所述第一存儲空間、所述第二存儲空間以及所述第三存儲空間中的重疊io,如果查看的當前重疊io處理完成,繼續處理下一個存儲空間的重疊io。
可選的,在所述如果查看的當前重疊io處理完成之后,所述方法還包括:
將所述當前重疊io從對應的存儲空間中刪除。
可選的,所述如果查看的當前重疊io處理完成,繼續處理下一個存儲空間的重疊io,包括:
如果所述當前重疊io為所述第一存儲空間中的重疊io,調用hasoverlappediocompleted函數查看所述當前重疊io,如果所述hasoverlappediocompleted函數返回值為“true”,確定有客戶端連接到所述服務器;
調用onaccepted函數,在所述onaccepted函數中創建第一會話對象,調用所述第一會話對象的asyncreadsome函數,讀取所述客戶端發送的數據;
繼續處理下一個存儲空間的重疊io。
可選的,所述如果查看的當前重疊io處理完成,繼續處理下一個存儲空間的重疊io,包括:
如果所述當前重疊io為所述第二存儲空間中的重疊io,調用hasoverlappediocompleted函數查看所述當前重疊io,如果所述hasoverlappediocompleted函數返回值為“true”,確定成功接收到來自客戶端發送的數據;
通過所述當前重疊io中pointer字段獲取所述當前重疊io對應的第二會話對象;
調用所述第二會話對象的onreadcomplete函數處理接收到的數據;
調用所述第二會話對象的asyncreadsome函數,把下一個讀取的重疊io放入到所述第二存儲空間;
繼續處理下一個存儲空間的重疊io。
可選的,所述如果查看的當前重疊io處理完成,繼續處理下一個存儲空間的重疊io,包括:
如果所述當前重疊io為所述第三存儲空間中的重疊io,定位與所述當前重疊io對應的第三會話對象;
調用所述第三會話對象的asyncwritesome函數異步的發送數據至客戶端;
調用hasoverlappediocompleted函數查看所述當前重疊io,如果所述hasoverlappediocompleted函數返回值為“true”,確定成功的將數據發送至客戶端;
繼續處理下一個存儲空間的重疊io。
第二方面,本發明實施例提供一種電子設備,應用于服務器,包括:
創建單元,用于創建服務線程,所述服務線程用于處理針對客戶端的異步任務,所述異步任務包括處理客戶端的連接請求、接收客戶端發送的數據請求以及向客戶端發送數據請求;
調用單元,用于調用accept函數,創建所述異步任務對應的異步的命名管道句柄和重疊io,將所述異步的命名管道句柄傳入所述重疊io的pointer字段中,調用connectnamedpipe函數,異步等待來自客戶端的所述異步任務,將所述重疊io存放至所述異步任務對應的存儲空間中,所述服務器中設置有用于存儲所述處理客戶端的連接請求對應的重疊io的第一存儲空間、用于存儲所述接收客戶端發送的數據請求對應的重疊io的第二存儲空間以及用于存儲所述向客戶端發送數據請求對應的重疊io的第三存儲空間;
處理單元,用于通過所述服務線程循環查看所述第一存儲空間、所述第二存儲空間以及所述第三存儲空間中的重疊io,如果查看的當前重疊io處理完成,繼續處理下一個存儲空間的重疊io。
可選的,所述電子設備還包括:
刪除單元,用于在所述如果查看的當前重疊io處理完成之后,將所述當前重疊io從對應的存儲空間中刪除。
可選的,所述處理單元用于:
如果所述當前重疊io為所述第一存儲空間中的重疊io,調用hasoverlappediocompleted函數查看所述當前重疊io,如果所述hasoverlappediocompleted函數返回值為“true”,確定有客戶端連接到所述服務器;
調用onaccepted函數,在所述onaccepted函數中創建第一會話對象,調用所述第一會話對象的asyncreadsome函數,讀取所述客戶端發送的數據;
繼續處理下一個存儲空間的重疊io。
可選的,所述處理單元用于:
如果所述當前重疊io為所述第二存儲空間中的重疊io,調用hasoverlappediocompleted函數查看所述當前重疊io,如果所述hasoverlappediocompleted函數返回值為“true”,確定成功接收到來自客戶端發送的數據;
通過所述當前重疊io中pointer字段獲取所述當前重疊io對應的第二會話對象;
調用所述第二會話對象的onreadcomplete函數處理接收到的數據;
調用所述第二會話對象的asyncreadsome函數,把下一個讀取的重疊io放入到所述第二存儲空間;
繼續處理下一個存儲空間的重疊io。
可選的,所述處理單元用于:
如果所述當前重疊io為所述第三存儲空間中的重疊io,定位與所述當前重疊io對應的第三會話對象;
調用所述第三會話對象的asyncwritesome函數異步的發送數據至客戶端;
調用hasoverlappediocompleted函數查看所述當前重疊io,如果所述hasoverlappediocompleted函數返回值為“true”,確定成功的將數據發送至客戶端;
繼續處理下一個存儲空間的重疊io。
第三方面,本發明實施例提供一種電子設備,所述電子設備包括處理器,所述處理器用于執行存儲器中存儲的計算機程序時實現如前述第一方面實施例中所述的進程間通信方法的步驟。
第四方面,本發明實施例提供了一種可讀存儲介質,其上存儲有計算機程序,所述計算機程序被處理器執行時實現如前述第一方面實施例中所述的進程間通信方法的步驟。
本申請實施例中的上述一個或多個技術方案,至少具有如下一種或多種技術效果:
在本發明實施例的技術方案中,創建服務進程,用于與多個客戶端的進程通信,處理客戶端的異步任務。進而,再調用accept函數創建異步任務對應的異步的命名管道句柄和重疊io,將異步的命名管道句柄傳入重疊io的pointer字段中,調用connectnamedpipe函數,異步等待來自客戶端的所述異步任務,然后將重疊io存放至所述異步任務對應的存儲空間中,通過服務線程循環查看存儲的重疊io,如果查看的當前重疊io處理完成,繼續處理下一個存儲空間的重疊io。進而,利用windows的命名管道實現一個服務器進程與多個客戶端進程之間進行異步數據通信。
附圖說明
圖1為本發明第一實施例中的一種進程間通信方法的流程圖;
圖2為本發明第二實施例中的電子設備的示意圖;
圖3為本發明第三實施例中電子設備的示意圖。
具體實施方式
本發明實施例提供了一種進程間通信方法、電子設備及可讀存儲介質,用于提供一種利用windows的命名管道實現一個服務器進程與多個客戶端進程之間進行異步數據通信的方法。該方法包括:創建服務線程,所述服務線程用于處理針對客戶端的異步任務,所述異步任務包括處理客戶端的連接請求、接收客戶端發送的數據請求以及向客戶端發送數據請求;調用accept函數,創建所述異步任務對應的異步的命名管道句柄和重疊io,將所述異步的命名管道句柄傳入所述重疊io的pointer字段中,調用connectnamedpipe函數,異步等待來自客戶端的所述異步任務,將所述重疊io存放至所述異步任務對應的存儲空間中,所述服務器中設置有用于存儲所述處理客戶端的連接請求對應的重疊io的第一存儲空間、用于存儲所述接收客戶端發送的數據請求對應的重疊io的第二存儲空間以及用于存儲所述向客戶端發送數據請求對應的重疊io的第三存儲空間;通過所述服務線程循環查看所述第一存儲空間、所述第二存儲空間以及所述第三存儲空間中的重疊io,如果查看的當前重疊io處理完成,繼續處理下一個存儲空間的重疊io。
下面通過附圖以及具體實施例對本發明技術方案做詳細的說明,應當理解本申請實施例以及實施例中的具體特征是對本申請技術方案的詳細的說明,而不是對本申請技術方案的限定,在不沖突的情況下,本申請實施例以及實施例中的技術特征可以相互組合。
本文中術語“和/或”,僅僅是一種描述關聯對象的關聯關系,表示可以存在三種關系,例如,a和/或b,可以表示:單獨存在a,同時存在a和b,單獨存在b這三種情況。另外,本文中字符“/”,一般表示前后關聯對象是一種“或”的關系。
實施例
請參考圖1,本發明第一實施例提供一種進程間通信方法,應用于服務器,該進程間通信方法包括如下步驟:
s101:創建服務線程,所述服務線程用于處理針對客戶端的異步任務,所述異步任務包括處理客戶端的連接請求、接收客戶端發送的數據請求以及向客戶端發送數據請求;
s102:調用accept函數,創建所述異步任務對應的異步的命名管道句柄和重疊io,將所述異步的命名管道句柄傳入所述重疊io的pointer字段中,調用connectnamedpipe函數,異步等待來自客戶端的所述異步任務,將所述重疊io存放至所述異步任務對應的存儲空間中,所述服務器中設置有用于存儲所述處理客戶端的連接請求對應的重疊io的第一存儲空間、用于存儲所述接收客戶端發送的數據請求對應的重疊io的第二存儲空間以及用于存儲所述向客戶端發送數據請求對應的重疊io的第三存儲空間;
s103:通過所述服務線程循環查看所述第一存儲空間、所述第二存儲空間以及所述第三存儲空間中的重疊io,如果查看的當前重疊io處理完成,繼續處理下一個存儲空間的重疊io。
其中,在所述如果查看的當前重疊io處理完成之后,將所述當前重疊io從對應的存儲空間中刪除。
具體的,本實施例中的方法主要應用于服務器端,在服務器端,服務器進程調用createnamedpipe函數根據一個指定的名稱pipename來創建一個有名稱的命名管道,然后調用connectnamedpipe來等待客戶端的連接請求,這個函數既可以支持同步方式,又可以支持異步方式,若果服務器進程以同步方式調用connectnamedpipe函數,那么如果沒有得到客戶端的連接請求,那么會一直等到客戶端的連接請求,所以此時會阻塞調用該函數的線程,當該函數返回時,客戶端便與服務端建立了通信連接。如果服務端以異步的方式調用connectnamedpipe函數來處理客戶端的連接請求,那么該函數會立即返回,不會阻塞調用該函數的線程。但是在以異步方式調用該函數時,需要指定一個結構類型為overlapped的重疊io參數,傳遞給該connectnamedpipe函數,然后在一個服務線程中定時的查看該重疊io是否完成,如果該重疊io完成,那么就代表有客戶端的連接請求。
在客戶端,客戶端進程首先調用waitnamedpipe函數,將同樣的管道名稱pipename傳入到waitnamedpipe函數中,如果waitnamedpipe函數返回成功,則代表連接服務器成功,然后調用createfile函數打開服務端的管道句柄,這樣便可以與服務端進行通信了。
上面簡要的概述了利用windows操作系統的命名管道api進行服務端與客戶端之間建立通信連接的簡要過程,后面的步驟來詳細的說明實現一個服務器進程與多個客戶端進程之間進行異步通信的方法。
本實施例中,實現了通過一個namedpipeserver的模塊用來代表一個命名管道服務器,該模塊實現了上述的與多個客戶端之間進行異步連接以及異步數據通信的功能。
首先,通過步驟s101創建服務線程,因為本實施例中的方法采取的時異步的方式,所以,首先創建一個獨立的線程來處理所有的異步任務,這些異步任務包括來自客戶端的連接請求,接收來自客戶端發送的數據以及向客戶端發送數據。
進一步,在namedpipeserver中有三個數據集合,這三個數據集合中,存放的都是類型為overlapped的異步重疊io,它們分別是m_pipependingarray,用來代表所有的異步連接,存放在第一存儲空間。m_readpendingarray用來代表所有正在異步接收的請求,存放在第二存儲空間;m_writependingarray用來代表所有異步發送的請求,存放在第三存儲空間。在服務線程中循環的處理這三個數據集合,后面針對客戶端的異步連接、異步接收以及異步發送都是分別對這三個數據集合的處理。
然后,通過步驟s102準備客戶端鏈接請求,在namedpipeserver模塊中調用accept函數,accept函數的主要功能是創建一個異步的命名管道句柄,然后創建一個重疊io來異步的處理連接請求,然后將該異步連接重疊io存放到上面的m_pipependingarray中,從而在服務線程中處理異步連接的結果。accept函數中的主要邏輯如下:
首先,調用createnamedpipe函數創建一個命名管道句柄,在調用該函數時,將命名管道的名稱傳入到該函數的第一個參數中,然后將file_flag_overlapped傳入到該函數的第二個參數中,表示要創建的是一個異步的命名管道。如果該函數的返回值不等于invalid_handle_value則代表創建命名管道句柄成功。
然后,創建一個類型為overlapped的重疊io結構,將上步中創建的命名管道句柄傳入到該結構的pointer字段中,然后調用connectnamedpipe函數,異步的等待來自客戶端的連接請求。
最后,將創建的overlapped重疊io放入到對應的存儲空間中去,從而在服務線程中查看處理該異步連接的結果。
對于三種不同的異步任務,處理過程可分為以下三種:
第一種:處理異步連接。
如果所述當前重疊io為所述第一存儲空間中的重疊io,調用hasoverlappediocompleted函數查看所述當前重疊io,如果所述hasoverlappediocompleted函數返回值為“true”,確定有客戶端連接到所述服務器;
調用onaccepted函數,在所述onaccepted函數中創建第一會話對象,調用所述第一會話對象的asyncreadsome函數,讀取所述客戶端發送的數據;
繼續處理下一個存儲空間的重疊io。
具體的,在本實施例中,繼續沿用上述示例,在服務線程中,如果當前重疊io為第一存儲空間中的重疊io,即對于m_pipependingarray中的每一個類型為overlapped的重疊io,調用hasoverlappediocompleted函數,如果該函數返回true,那么代表已有客戶端連接到服務器中,connectnamedpipe的結果最終得到處理,然后調用namedpipeserver的onaccepted函數,在onaccepted函數中,主要是創建一個namedpipesession會話對象用來代表服務端與客戶端的一個通信連接,然后調用namedpipesession的asyncreadsome函數,準備讀取來著客戶端發送的數據,最后在onaccepted函數中再次調用accpet函數。具體的過程如下:
首先,創建一個類型為namedpipesession的會話對象,然后將該overlapped對象中的pointer字段賦值給namedpipesession的m_pipe字段,從而根據m_pipe管道句柄來與客戶端進行數據通信,然后給該namedpipesession指定一個數字型的sessionid,用來區分不同的namedpipesession對象。
然后,調用namedpipesession對象的asyncreadsome函數,異步的讀取來自客戶端的數據。在asyncreadsome函數中,首先同樣創建一個overlapped的重疊io,并且將該namedpipesession的this指針值放入到重疊io的pointer字段中,然后調用操作系統的readfile函數去異步的讀取數據,在調用readfile函數時,將overlapped重疊io傳入到該函數的最后一個參數中,表示以異步的方式去讀區客戶端的數據,否則,會以同步的方式去讀區數據然后將該overlapped重疊io存入到namedpipeserver的m_readpendingarray中,去處理異步讀取的結果。
接著,調用完asyncreadsome函數后,再次調用namedpipeserver的accept函數,處理下一個客戶端的連接請求,從而再次執行本實施例中上述s102的相關邏輯,重復這樣的邏輯,從而實現了一個服務器可以連接多個客戶端的邏輯。
最后,因為已成功處理完異步連接請求,所以在m_pipependingarray中移除該重疊io。
第二種:處理異步接收。
如果所述當前重疊io為所述第二存儲空間中的重疊io,調用hasoverlappediocompleted函數查看所述當前重疊io,如果所述hasoverlappediocompleted函數返回值為“true”,確定成功接收到來自客戶端發送的數據;
通過所述當前重疊io中pointer字段獲取所述當前重疊io對應的第二會話對象;
調用所述第二會話對象的onreadcomplete函數處理接收到的數據;
調用所述第二會話對象的asyncreadsome函數,把下一個讀取的重疊io放入到所述第二存儲空間;
繼續處理下一個存儲空間的重疊io。
具體的,在本實施例中,在服務線程中,如果當前重疊io為第二存儲空間中的重疊io,即對于m_readpendingarray中的每一個類型為overlapped的重疊io,調用hasoverlappediocompleted函數,如果該函數返回true,那么代表成功接收到來自客戶端發送的數據。從而根據overlapped結果中的pointer字段來獲取namedpipesession對象,然后調用該namedpipesession對象的onreadcomplete函數,在namedpipesession對象的onreadcomplete函數中,處理完接收到的數據后,再次調用namedpipesession對象的asyncreadsome函數,再次把下一個讀取的異步重疊io放入到m_readpendingarray中,從而實現了namedpipesession對象的異步循環讀取數據。同樣的道理,因為已成功處理完異步發送數據的請求,所以,可從m_readpendingarray中移除該重疊io。
第三種:處理異步發送。
如果所述當前重疊io為所述第三存儲空間中的重疊io,定位與所述當前重疊io對應的第三會話對象;
調用所述第三會話對象的asyncwritesome函數異步的發送數據至客戶端;
調用hasoverlappediocompleted函數查看所述當前重疊io,如果所述hasoverlappediocompleted函數返回值為“true”,確定成功的將數據發送至客戶端;
繼續處理下一個存儲空間的重疊io。
具體的,在本實施例中,在服務線程中,如果當前重疊io為第三存儲空間中的重疊io,即在服務線程中,對于m_writependingarray中的每一個類型為overlapped的重疊io,調用hasoverlappediocompleted函數,如果該函數返回true,那么代表成功的將數據發送到了客戶端從而根據overlapped結果中的pointer字段來獲取namedpipesession對象,然后調用該對象的onwritecomplete函數,將該重疊io從namedpipeserver的m_writependingarray中刪除。
同時,當namedpipeserver向相應的客戶端發送數據時,需要將向客戶端發送數據請求對應的重疊io存儲至第三存儲空間。首先根據制定的會話id,即namedpipesession的sessionid找到相對應的會話對象namedpipesession,然后調用會話對象namedpipesession的asyncwritesome函數異步的發送數據。在asyncwritesome函數中,同樣首先創建一個overlapped的重疊io,同樣將該namedpipesession的this指針,傳入到重疊io的pointer字段中,然后調用操作系統的writefile函數,將重疊io傳入到writefile函數的最后一個參數中,表示以異步的方式發送數據。最后將該重疊io放入到m_writependingarray集合中。
請參見圖2,本發明的第二實施例提供了一種電子設備,所述電子設備包括:
創建單元201,用于創建服務線程,所述服務線程用于處理針對客戶端的異步任務,所述異步任務包括處理客戶端的連接請求、接收客戶端發送的數據請求以及向客戶端發送數據請求;
調用單元202,用于調用accept函數,創建所述異步任務對應的異步的命名管道句柄和重疊io,將所述異步的命名管道句柄傳入所述重疊io的pointer字段中,調用connectnamedpipe函數,異步等待來自客戶端的所述異步任務,將所述重疊io存放至所述異步任務對應的存儲空間中,所述服務器中設置有用于存儲所述處理客戶端的連接請求對應的重疊io的第一存儲空間、用于存儲所述接收客戶端發送的數據請求對應的重疊io的第二存儲空間以及用于存儲所述向客戶端發送數據請求對應的重疊io的第三存儲空間;
處理單元203,用于通過所述服務線程循環查看所述第一存儲空間、所述第二存儲空間以及所述第三存儲空間中的重疊io,如果查看的當前重疊io處理完成,繼續處理下一個存儲空間的重疊io。
所述電子設備還包括:刪除單元,用于在所述如果查看的當前重疊io處理完成之后,將所述當前重疊io從對應的存儲空間中刪除。
具體的,本實施例中的電子設備主要應用于服務器端,在服務器端,服務器進程調用createnamedpipe函數根據一個指定的名稱pipename來創建一個有名稱的命名管道,然后調用connectnamedpipe來等待客戶端的連接請求,這個函數既可以支持同步方式,又可以支持異步方式,若果服務器進程以同步方式調用connectnamedpipe函數,那么如果沒有得到客戶端的連接請求,那么會一直等到客戶端的連接請求,所以此時會阻塞調用該函數的線程,當該函數返回時,客戶端便與服務端建立了通信連接。如果服務端以異步的方式調用connectnamedpipe函數來處理客戶端的連接請求,那么該函數會立即返回,不會阻塞調用該函數的線程。但是在以異步方式調用該函數時,需要指定一個結構類型為overlapped的重疊io參數,傳遞給該connectnamedpipe函數,然后在一個服務線程中定時的查看該重疊io是否完成,如果該重疊io完成,那么就代表有客戶端的連接請求。
在客戶端,客戶端進程首先調用waitnamedpipe函數,將同樣的管道名稱pipename傳入到waitnamedpipe函數中,如果waitnamedpipe函數返回成功,則代表連接服務器成功,然后調用createfile函數打開服務端的管道句柄,這樣便可以與服務端進行通信了。
上面簡要的概述了利用windows操作系統的命名管道api進行服務端與客戶端之間建立通信連接的簡要過程,后面的步驟來詳細的說明實現一個服務器進程與多個客戶端進程之間進行異步通信的方法。
本實施例中,實現了通過一個namedpipeserver的模塊用來代表一個命名管道服務器,該模塊實現了上述的與多個客戶端之間進行異步連接以及異步數據通信的功能。
首先,電子設備通過創建單元201創建服務線程,因為本實施例中的方法采取的時異步的方式,所以,首先創建一個獨立的線程來處理所有的異步任務,這些異步任務包括來自客戶端的連接請求,接收來自客戶端發送的數據以及向客戶端發送數據。
進一步,在namedpipeserver中有三個數據集合,這三個數據集合中,存放的都是類型為overlapped的異步重疊io,它們分別是m_pipependingarray,用來代表所有的異步連接,存放在第一存儲空間。m_readpendingarray用來代表所有正在異步接收的請求,存放在第二存儲空間;m_writependingarray用來代表所有異步發送的請求,存放在第三存儲空間。在服務線程中循環的處理這三個數據集合,后面針對客戶端的異步連接、異步接收以及異步發送都是分別對這三個數據集合的處理。
然后,通過調用單元202準備客戶端鏈接請求,在namedpipeserver模塊中調用accept函數,accept函數的主要功能是創建一個異步的命名管道句柄,然后創建一個重疊io來異步的處理連接請求,然后將該異步連接重疊io存放到上面的m_pipependingarray中,從而在服務線程中處理異步連接的結果。accept函數中的主要邏輯如下:
首先,調用createnamedpipe函數創建一個命名管道句柄,在調用該函數時,將命名管道的名稱傳入到該函數的第一個參數中,然后將file_flag_overlapped傳入到該函數的第二個參數中,表示要創建的是一個異步的命名管道。如果該函數的返回值不等于invalid_handle_value則代表創建命名管道句柄成功。
然后,創建一個類型為overlapped的重疊io結構,將上步中創建的命名管道句柄傳入到該結構的pointer字段中,然后調用connectnamedpipe函數,異步的等待來自客戶端的連接請求。
最后,將創建的overlapped重疊io放入到對應的存儲空間中去,從而在服務線程中查看處理該異步連接的結果。
對于三種不同的異步任務,處理單元203處理過程可分為以下三種:
第一種:處理異步連接。
如果所述當前重疊io為所述第一存儲空間中的重疊io,調用hasoverlappediocompleted函數查看所述當前重疊io,如果所述hasoverlappediocompleted函數返回值為“true”,確定有客戶端連接到所述服務器;
調用onaccepted函數,在所述onaccepted函數中創建第一會話對象,調用所述第一會話對象的asyncreadsome函數,讀取所述客戶端發送的數據;
繼續處理下一個存儲空間的重疊io。
具體的,在本實施例中,繼續沿用上述示例,在服務線程中,如果當前重疊io為第一存儲空間中的重疊io,即對于m_pipependingarray中的每一個類型為overlapped的重疊io,調用hasoverlappediocompleted函數,如果該函數返回true,那么代表已有客戶端連接到服務器中,connectnamedpipe的結果最終得到處理,然后調用namedpipeserver的onaccepted函數,在onaccepted函數中,主要是創建一個namedpipesession會話對象用來代表服務端與客戶端的一個通信連接,然后調用namedpipesession的asyncreadsome函數,準備讀取來著客戶端發送的數據,最后在onaccepted函數中再次調用accpet函數。具體的過程如下:
首先,創建一個類型為namedpipesession的會話對象,然后將該overlapped對象中的pointer字段賦值給namedpipesession的m_pipe字段,從而根據m_pipe管道句柄來與客戶端進行數據通信,然后給該namedpipesession指定一個數字型的sessionid,用來區分不同的namedpipesession對象。
然后,調用namedpipesession對象的asyncreadsome函數,異步的讀取來自客戶端的數據。在asyncreadsome函數中,首先同樣創建一個overlapped的重疊io,并且將該namedpipesession的this指針值放入到重疊io的pointer字段中,然后調用操作系統的readfile函數去異步的讀取數據,在調用readfile函數時,將overlapped重疊io傳入到該函數的最后一個參數中,表示以異步的方式去讀區客戶端的數據,否則,會以同步的方式去讀區數據然后將該overlapped重疊io存入到namedpipeserver的m_readpendingarray中,去處理異步讀取的結果。
接著,調用完asyncreadsome函數后,再次調用namedpipeserver的accept函數,處理下一個客戶端的連接請求,從而再次執行本實施例中上述s102的相關邏輯,重復這樣的邏輯,從而實現了一個服務器可以連接多個客戶端的邏輯。
最后,因為已成功處理完異步連接請求,所以在m_pipependingarray中移除該重疊io。
第二種:處理異步接收。
如果所述當前重疊io為所述第二存儲空間中的重疊io,調用hasoverlappediocompleted函數查看所述當前重疊io,如果所述hasoverlappediocompleted函數返回值為“true”,確定成功接收到來自客戶端發送的數據;
通過所述當前重疊io中pointer字段獲取所述當前重疊io對應的第二會話對象;
調用所述第二會話對象的onreadcomplete函數處理接收到的數據;
調用所述第二會話對象的asyncreadsome函數,把下一個讀取的重疊io放入到所述第二存儲空間;
繼續處理下一個存儲空間的重疊io。
具體的,在本實施例中,在服務線程中,如果當前重疊io為第二存儲空間中的重疊io,即對于m_readpendingarray中的每一個類型為overlapped的重疊io,調用hasoverlappediocompleted函數,如果該函數返回true,那么代表成功接收到來自客戶端發送的數據。從而根據overlapped結果中的pointer字段來獲取namedpipesession對象,然后調用該namedpipesession對象的onreadcomplete函數,在namedpipesession對象的onreadcomplete函數中,處理完接收到的數據后,再次調用namedpipesession對象的asyncreadsome函數,再次把下一個讀取的異步重疊io放入到m_readpendingarray中,從而實現了namedpipesession對象的異步循環讀取數據。同樣的道理,因為已成功處理完異步發送數據的請求,所以,可從m_readpendingarray中移除該重疊io。
第三種:處理異步發送。
如果所述當前重疊io為所述第三存儲空間中的重疊io,定位與所述當前重疊io對應的第三會話對象;
調用所述第三會話對象的asyncwritesome函數異步的發送數據至客戶端;
調用hasoverlappediocompleted函數查看所述當前重疊io,如果所述hasoverlappediocompleted函數返回值為“true”,確定成功的將數據發送至客戶端;
繼續處理下一個存儲空間的重疊io。
具體的,在本實施例中,在服務線程中,如果當前重疊io為第三存儲空間中的重疊io,即在服務線程中,對于m_writependingarray中的每一個類型為overlapped的重疊io,調用hasoverlappediocompleted函數,如果該函數返回true,那么代表成功的將數據發送到了客戶端從而根據overlapped結果中的pointer字段來獲取namedpipesession對象,然后調用該對象的onwritecomplete函數,將該重疊io從namedpipeserver的m_writependingarray中刪除。
同時,當namedpipeserver向相應的客戶端發送數據時,需要將向客戶端發送數據請求對應的重疊io存儲至第三存儲空間。首先根據制定的會話id,即namedpipesession的sessionid找到相對應的會話對象namedpipesession,然后調用會話對象namedpipesession的asyncwritesome函數異步的發送數據。在asyncwritesome函數中,同樣首先創建一個overlapped的重疊io,同樣將該namedpipesession的this指針,傳入到重疊io的pointer字段中,然后調用操作系統的writefile函數,將重疊io傳入到writefile函數的最后一個參數中,表示以異步的方式發送數據。最后將該重疊io放入到m_writependingarray集合中。
請參見圖3,本發明的第三實施例提供了一種電子設備,該實施例的電子設備包括:處理器301、存儲器302以及存儲在所述存儲器中并可在所述處理器上運行的計算機程序,例如第一實施例中進程間通信方法對應的程序。所述處理器執行所述計算機程序時實現上述第一實施例中各路徑檢測中的步驟。或者,所述處理器執行所述計算機程序時實現上述第二實施例的電子設備中各模塊/單元的功能。
示例性的,所述計算機程序可以被分割成一個或多個模塊/單元,所述一個或者多個模塊/單元被存儲在所述存儲器中,并由所述處理器執行,以完成本發明。所述一個或多個模塊/單元可以是能夠完成特定功能的一系列計算機程序指令段,該指令段用于描述所述計算機程序在所述計算機裝置中的執行過程。例如,所述計算機程序可以被分割成創建單元、調用單元、處理單元的功能,各單元具體功能如下:
創建單元,用于創建服務線程,所述服務線程用于處理針對客戶端的異步任務,所述異步任務包括處理客戶端的連接請求、接收客戶端發送的數據請求以及向客戶端發送數據請求;
調用單元,用于調用accept函數,創建所述異步任務對應的異步的命名管道句柄和重疊io,將所述異步的命名管道句柄傳入所述重疊io的pointer字段中,調用connectnamedpipe函數,異步等待來自客戶端的所述異步任務,將所述重疊io存放至所述異步任務對應的存儲空間中,所述服務器中設置有用于存儲所述處理客戶端的連接請求對應的重疊io的第一存儲空間、用于存儲所述接收客戶端發送的數據請求對應的重疊io的第二存儲空間以及用于存儲所述向客戶端發送數據請求對應的重疊io的第三存儲空間;
處理單元,用于通過所述服務線程循環查看所述第一存儲空間、所述第二存儲空間以及所述第三存儲空間中的重疊io,如果查看的當前重疊io處理完成,繼續處理下一個存儲空間的重疊io。
所述電子設備可包括,但不僅限于,處理器、存儲器。本領域技術人員可以理解,所述示意圖3僅僅是計算機裝置的示例,并不構成對電子設備的限定,可以包括比圖示更多或更少的部件,或者組合某些部件,或者不同的部件,例如所述電子設備還可以包括輸入輸出設備、網絡接入設備、總線等。
所稱處理器301可以是中央處理單元(centralprocessingunit,cpu),還可以是其他通用處理器、數字信號處理器(digitalsignalprocessor,dsp)、專用集成電路(applicationspecificintegratedcircuit,asic)、現成可編程門陣列(field-programmablegatearray,fpga)或者其他可編程邏輯器件、分立門或者晶體管邏輯器件、分立硬件組件等。通用處理器可以是微處理器或者該處理器也可以是任何常規的處理器等,所述處理器是所述計算機裝置的控制中心,利用各種接口和線路連接整個計算機裝置的各個部分。
所述存儲器302可用于存儲所述計算機程序和/或模塊,所述處理器通過運行或執行存儲在所述存儲器內的計算機程序和/或模塊,以及調用存儲在存儲器內的數據,實現所述計算機裝置的各種功能。所述存儲器可主要包括存儲程序區和存儲數據區,其中,存儲程序區可存儲操作系統、至少一個功能所需的應用程序(比如聲音播放功能、圖像播放功能等)等;存儲數據區可存儲根據手機的使用所創建的數據(比如音頻數據、視頻數據等)等。此外,存儲器可以包括高速隨機存取存儲器,還可以包括非易失性存儲器,例如硬盤、內存、插接式硬盤,智能存儲卡(smartmediacard,smc),安全數字(securedigital,sd)卡,閃存卡(flashcard)、至少一個磁盤存儲器件、閃存器件、或其他易失性固態存儲器件。
進一步,該電子設備所包括的處理器301還具有以下功能:
在所述如果查看的當前重疊io處理完成之后,將所述當前重疊io從對應的存儲空間中刪除。
進一步,該電子設備所包括的處理器301還具有以下功能:
如果所述當前重疊io為所述第一存儲空間中的重疊io,調用hasoverlappediocompleted函數查看所述當前重疊io,如果所述hasoverlappediocompleted函數返回值為“true”,確定有客戶端連接到所述服務器;
調用onaccepted函數,在所述onaccepted函數中創建第一會話對象,調用所述第一會話對象的asyncreadsome函數,讀取所述客戶端發送的數據;
繼續處理下一個存儲空間的重疊io。
進一步,該電子設備所包括的處理器301還具有以下功能:
如果所述當前重疊io為所述第二存儲空間中的重疊io,調用hasoverlappediocompleted函數查看所述當前重疊io,如果所述hasoverlappediocompleted函數返回值為“true”,確定成功接收到來自客戶端發送的數據;
通過所述當前重疊io中pointer字段獲取所述當前重疊io對應的第二會話對象;
調用所述第二會話對象的onreadcomplete函數處理接收到的數據;
調用所述第二會話對象的asyncreadsome函數,把下一個讀取的重疊io放入到所述第二存儲空間;
繼續處理下一個存儲空間的重疊io。
進一步,該電子設備所包括的處理器301還具有以下功能:
如果所述當前重疊io為所述第三存儲空間中的重疊io,定位與所述當前重疊io對應的第三會話對象;
調用所述第三會話對象的asyncwritesome函數異步的發送數據至客戶端;
調用hasoverlappediocompleted函數查看所述當前重疊io,如果所述hasoverlappediocompleted函數返回值為“true”,確定成功的將數據發送至客戶端;
繼續處理下一個存儲空間的重疊io。
本發明第四實施例提供了一種計算機可讀存儲介質,其上存儲有計算機程序,本發明第二實施例中的所述電子設備集成的功能單元如果以軟件功能單元的形式實現并作為獨立的產品銷售或使用時,可以存儲在一個計算機可讀取存儲介質中?;谶@樣的理解,本發明實現上述第一實施例的進程間通信方法中的全部或部分流程,也可以通過計算機程序來指令相關的硬件來完成,所述的計算機程序可存儲于一計算機可讀存儲介質中,該計算機程序在被處理器執行時,可實現上述各個方法實施例的步驟。其中,所述計算機程序包括計算機程序代碼,所述計算機程序代碼可以為源代碼形式、對象代碼形式、可執行文件或某些中間形式等。所述計算機可讀介質可以包括:能夠攜帶所述計算機程序代碼的任何實體或裝置、記錄介質、u盤、移動硬盤、磁碟、光盤、計算機存儲器、只讀存儲器(rom,read-onlymemory)、隨機存取存儲器(ram,randomaccessmemory)、電載波信號、電信信號以及軟件分發介質等。需要說明的是,所述計算機可讀介質包含的內容可以根據司法管轄區內立法和專利實踐的要求進行適當的增減,例如在某些司法管轄區,根據立法和專利實踐,計算機可讀介質不包括電載波信號和電信信號。
盡管已描述了本發明的優選實施例,但本領域內的技術人員一旦得知了基本創造性概念,則可對這些實施例作出另外的變更和修改。所以,所附權利要求意欲解釋為包括優選實施例以及落入本發明范圍的所有變更和修改。
顯然,本領域的技術人員可以對本發明進行各種改動和變型而不脫離本發明的精神和范圍。這樣,倘若本發明的這些修改和變型屬于本發明權利要求及其等同技術的范圍之內,則本發明也意圖包含這些改動和變型在內。