專利名稱:一種基于socket的網絡通信方法、裝置及系統的制作方法
技術領域:
本發明涉及網絡通信技術領域,尤其涉及一種基于socket的網絡通信方法、裝置及系統。
背景技術:
在TCP/IP網絡應用中,通信的兩個進程間相互作用的主要模式是客戶/服務器模式(Client/Server model),即客戶向服務器發出服務請求,服務器接收到請求后,提供相應的服務。套接字,是支持TCP/IP的網絡通信的基本操作單元,可以看作是不同主機之間的進程進行雙向通信的端面點,簡單的說就是通信的雙方的一種約定,用套接字中的相關函數來完成通信過程。
在利用套接字通信時要先建立套接字的連接,根據連接啟動的方式以及本地套接字要連接的目標,套接字之間的連接過程可以分為三個步驟:服務器監聽、客戶端請求、連接確認。服務器監聽是指服務器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態,按時監控網絡狀態;客戶端請求是指由客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。連接確認是指當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求,它就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,連接就建立好了。而服務器套接字繼續處于監聽狀態,繼續接收其他客戶端套接字的連接請求。
例如,應用程序a、b、C、d等分別為運行在同一網絡上的不同結點的計算機中,若應用程序a希望發送數據到應用程序b中,而應用程序b希望自己的b-Ι線程接收并處理該數據,假設a為服務端,b為客戶端,其實現方式如下:在a的某處建立服務端socket,在b的b-Ι線程處建立客戶端socket并連接;a程序調用socket發送函數,發送數據至b程序的b-Ι線程中的socket ;b_l線程調用socket接收函數讀取數據,應用程序b對接收數據進行處理。
由上述應用程序a與b的通信過程可得知,運行在網絡上的兩個不同結點的多線程應用程序,若想建立穩定的socket連接并收發數據,且發送方希望接收方的指定線程接收數據,一般情況下,需要在發送方和接收方的指定線程編寫socket通信代碼。因此,在進行應用程序的設計時,應用程序的設計者需要關心socket程序設計的細節,包括調用socket函數來建立連接、讀取、發送、查詢網絡消息以及維護socket通信網絡等,整個網絡通信過程較為復雜。發明內容
有鑒于此,本發明提供了一種基于socket的網絡通信方法、裝置及系統,用于解決應用程序的設計者需要考慮socket程序設計細節、整個網絡通信過程復雜的問題。
一種基于socket的網絡通信方法,該方法包括:
A:初始化過程,包括:
Al:確定與服務端具有連接關系的客戶端,分別創建與每一個客戶端對應的socket類對象,并記錄所述客戶端與其對應的socket類對象的對應關系,所述socket類對象中包含了與其對應的客戶端主機的主機名,將所述socket類對象指針存入預先建立的服務端socket鏈表;
A2:分別建立與所述服務端socket鏈表中每一個socket類對象對應的socket通信隊列,并記錄所述socket類對象與其對應的socket通信隊列的對應關系;
B:通信過程,包括:
B1:服務端監聽網絡狀態,當監聽到客戶端發送的連接請求,接收來自發送連接請求的客戶端的連接;
B2:服務端指定待接收數據客戶端的主機名、線程名和待發送的數據,服務端根據主機名確定帶發送數據客戶端對應的socket類對象,并確定與所述socket類對象對應的socket通信隊列;
B3:將所述線程名和待發送數據寫入與待接收數據的客戶端對應的socket通信隊列中;
B4:與所述socket類對象對應的socket執行程序提取所述socket通信隊列中的線程名和待發送數據,并發送給待接收數據的客戶端;
B5:所述待接收數據的客戶端接收所述服務端發送的數據,從所述數據中解析出線程名,將所述數據中去除線程名后的數據存入預先建立的所述解析出的線程名所對應的線程隊列中,客戶端的指定線程從所述線程隊列中提取數據。
所述服務端接收來自發送連接請求的客戶端的連接具體為:
判斷所述發送請求的客戶端對應的socket類對象是否存在于所述服務端socket鏈表中時,如果是,則接收來自發送連接請求的客戶端的連接;如果否,則倉Il建socket類對象并進行綁定監聽,然后接收來自發送連接請求的客戶端的連接。
一種基于socket的網絡通信方法,該方法包括:
C:初始化過程,包括:
Cl:確定與客戶端具有連接關系的服務端,分別創建與每一個服務端對應的socket類對象,并記錄所述服務端與其對應的socket類對象的對應關系,所述socket類對象中包含了與其對應的服務端的主機信息,將所述socket類對象指針存入預先建立的客戶端socket鏈表;
C2:客戶端創建線程隊列鏈表,然后注冊線程隊列,將線程隊列和線程名綁定;
D:通信過程,包括:
Dl:向與所述客戶端socket鏈表中的socket類對象對應的服務端發送連接請求,當客戶端發送的連接請求被所述服務端監聽到,客戶端與監聽到所述連接請求的服務端建立連接;
D2:服務端指定待接收數據客戶端的主機名、線程名和待發送的數據,與客戶端建立連接的服務端將線程名和待發送數據存入服務端socket鏈表中與客戶端對應的socket類對象所對應的通信隊列中,與所述socket類對象對應的socket執行程序提取所述socket通信隊列中的線程名和待發送數據,并發送給所述客戶端;
D3:客戶端接收與其建立連接的服務端發送的數據,從接收的數據中解析出線程名;
D4:將所述線程名從所述接收的數據中去除;
D5:將去除線程名后的數據寫入所述解析出的線程名所對應的線程隊列中;
D6:從線程隊列中提取所述去除線程名后的數據。
所述線程隊列鏈表中的存放單元為含有線程隊列句柄和線程名的結構體,注冊線程隊列時,將所述線程隊列句柄和線程名寫入結構體,將結構體添加至線程隊列鏈表尾部。
一種基于socket的服務端網絡通信裝置,包括:
第一初始化模塊,用于確定與服務端具有連接關系的客戶端,分別創建與每一個客戶端對應的socket類對象,并記錄所述客戶端與其對應的socket類對象的對應關系,所述socket類對象中包含了與其對應的客戶端主機的主機名,將所述socket類對象指針存入預先建立的服務端socket鏈表;分別建立與所述服務端socket鏈表中每一個socket類對象對應的socket通信隊列,并記錄所述socket類對象與其對應的socket通信隊列的對應關系;
監聽模塊,用于監聽客戶端發送的連接請求,接收來自客戶端的連接;
發送模塊,用于確定與所述發送請求客戶端對應的socket類對象,并確定與所述socket類對象對應的socket通信隊列;將服務端指定的線程名和待發送數據寫入與待接收數據的客戶端對應的socket通信隊列中;與所述socket類對象對應的socket執行程序提取所述socket通信隊列中的線程名和待發送數據,并發送給所述發送請求的客戶端。
一種基于socket的客戶端網絡通信裝置,包括:
第二初始化模塊,用于確定與客戶端具有連接關系的服務端,分別創建與每一個服務端對應的socket類對象,并記錄所述服務端與其對應的socket類對象的對應關系,所述socket類對象中包含了與其對應的服務端主機的主機名,將所述socket類對象指針存入預先建立的客戶端socket鏈表;還用于創建線程隊列,然后注冊線程隊列,將線程隊列和線程名綁定;
連接模塊,用于加載套接字庫,倉Il建客戶端socket,向與所述客戶端socket鏈表中的socket類對象對應的服務端發出連接請求直至連接成功;
接收模塊,用于接收服務端發送的數據,并對數據進行解析,解析出線程名,將去除線程名后的數據寫入所述解析出的線程名所對應的線程隊列中,讀取所述線程隊列的數據。
一種基于socket的網絡通信系統,包括上述客戶端網絡通信裝置和服務端的網絡通信裝置。
本發明提供的基于socket的網絡通信方法及系統中,當服務端發送數據時,根據客戶端的主機名尋找對應的socket類對象和socket通信隊列,將客戶端的線程名和待發送數據寫入socket通信隊列;從socket通信隊列中提取出待發送數據并發送;客戶端的socket接收到服務端發送的數據,進行解析,根據解析出的線程名得到相應的線程隊列,并將去除線程名后的原始數據寫入線程隊列中;從線程隊列中提取出客戶端發送的數據。本發明提供的網絡通信方法及系統,使得應用程序設計者在進行應用程序開發時,不需要考慮socket程序設計細節,整個網絡通信過程簡潔明了。
為了更清楚地說明本發明實施例或現有技術中的技術方案,下面將對實施例或現有技術描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發明的實施例,對于本領域普通技術人員來講,在不付出創造性勞動的前提下,還可以根據提供的附圖獲得其他的附圖。
圖1為本發明實施例提供的網絡通信方法的時序圖。
具體實施方式
下面將結合本發明實施例中的附圖,對本發明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發明一部分實施例,而不是全部的實施例。基于本發明中的實施例,本領域普通技術人員在沒有做出創造性勞動前提下所獲得的所有其他實施例,都屬于本發明保護的范圍。
實施例一
本發明實施例提供了一種基于socket的網絡通信方法,該方法的時序圖如圖1所示,包括:初始化過程和通信過程,對于服務端而言,初始化過程包括:
Sll:確定與服務端具有連接關系的客戶端,分別創建與每一個客戶端對應的socket類對象,并記錄客戶端與其對應的socket類對象的對應關系;
其中,socket類對象中包含了與其對應的客戶端的主機信息,包括客戶端主機的主機名、IP地址。
S12:將socket類對象指針存入預先建立的服務端socket鏈表;
在本實施例中,將socket類對象指針存入服務端socket鏈表中,socket類對象指針指向socket類對象,當然,也可將socket類對象直接存入服務端socket鏈表中。
S13:分別建立與服務端socket鏈表中每一個socket類對象對應的socket通信隊列,并記錄所述socket類對象與其對應的socket通信隊列的對應關系;
在本實施例中,建立通信隊列的同時,為通信隊列標識,以方便查找。
通信過程包括:
服務端監聽網絡狀態,當監聽到客戶端發送的連接請求,接收來自發送連接請求的客戶端的連接;
其中,服務端接收來自發送連接請求的客戶端的連接之前,首先判斷發送連接請求的客戶端對應的socket類對象是否存在于服務端socket鏈表中,如果是,則接收來自發送連接請求的客戶端的連接;如果否,則倉Il建socket類對象,然后接收來自發送連接請求的客戶端的連接。
服務端向客戶端發送數據的過程為:
S21:服務端指定待接收數據客戶端的主機名、線程名和待發送的數據,服務端根據主機名確定待接收數據的客戶端對應的socket類對象,并確定與所述socket類對象對應的socket通信隊列;
在本實施例中,客戶端的主機名、線程名和待發送數據由服務端的應用層指定,對于服務端而言,接收服務端發送的數據的客戶端是已知的。
S22:將線程名和待發送數據寫入待接收數據的客戶端對應的socket通信隊列中;
S23:與socket類對象對應的socket執行程序提取socket通信隊列中的線程名和待發送數據,并發送給待接收數據的客戶端;
對于客戶端而言,接收服務端發送的數據的過程包括初始化過程和通信過程,其中,初始化過程包括:
S31:確定與客戶端具有連接關系的服務端,分別創建與每一個服務端對應的socket類對象,并記錄服務端與其對應的socket類對象的對應關系,socket類對象中包含了與其對應的服務端的主機信息;
其中,socket類對象中包含了與其對應的服務端主機的主機名、IP地址和端口號。
S32:將socket類對象指針存入預先建立的客戶端socket鏈表;
S33:創建線程隊列鏈表,然后注冊線程隊列,將線程隊列和線程名綁定。
通信過程包括:
客戶端加載套接字庫,倉Il建客戶端socket,向與客戶端socket鏈表中的socket類對象對應的服務端發送連接請求,當客戶端發送的連接請求被服務端監聽到,客戶端與監聽到連接請求的服務端建立連接;與客戶端建立連接的服務端將線程名和待發送數據寫入通信隊列中,該通信隊列為與服務端socket中與客戶端對應的socket類對象所對應的通信隊列,與socket類對象對應的socket執行程序提取socket通信隊列中的線程名和待發送數據,并發送給客戶端;
客戶端接收發送端發送的數據的過程為:
S41:客戶端接收服務端發送的數據,從接收的數據中解析出線程名;
S42:將線程名從接收的數據中去除;
S43:將接收數據中去除線程名后的數據寫入所述解析出的線程名所對應的線程隊列中;
其中,接收數據中去除線程名后的數據即為服務端發送的原始數據。
S44:客戶端的指定線程從線程隊列中提取出服務端發送的原始數據。
其中,注冊線程隊列,將線程隊列和線程名綁定的過程如下:創建一個線程隊列鏈表,存放的單元為含有線程隊列句柄和線程名的結構體,注冊線程隊列時,將線程隊列句柄和線程名寫入結構體中,再將此結構體添加至線程隊列鏈表尾部。
本發明實施例提供的網絡通信方法實現的是網絡底層的socket通信,服務端發送數據時,只需在應用層指定接收數據的客戶端的主機名、線程名和待發送數據即可。
實施例二
本發明實施例提供了一種基于socket的網絡通信系統,包括服務端的網絡通信裝置和客戶端的網絡通信裝置,其中服務端的網絡通信裝置包括:第一初始化模塊、監聽模塊和發送模塊。
第一初始化模塊,用于確定與服務端具有連接關系的客戶端,分別創建與每一個客戶端對應的socket類對象,并記錄客戶端與其對應的socket類對象的對應關系,socket類對象中包含了與其對應的客戶端主機的主機名,將socket類對象指針存入預先建立的服務端socket鏈表;分別建立與服務端socket鏈表中每一個socket類對象對應的socket通信隊列,并記錄socket類對象與其對應的socket通信隊列的對應關系。
監聽模塊,用于監聽客戶端發送的連接請求,接收來自客戶端的連接。
發送模塊,用于確定與待接收數據的客戶端對應的socket類對象,并確定與socket類對象對應的socket通信隊列;將服務端指定的線程名和待發送數據寫入與待接收數據的客戶端對應的socket通信隊列中;與socket類對象對應的socket執行程序提取socket通信隊列中的線程名和待發送數據,并發送給待接收數據的客戶端。
其中,服務端的應用層指定接收數據客戶端的主機名、線程名和待發送數據,根據指定的主機名查找該主機名對應的socket類對象,在根據找出的socket類對象查找對應的socket通信隊列,然后將線程名和待發送數據寫入找出的socket通信隊列中。
客戶端的網絡通信裝置包括:第二初始化模塊、連接模塊和接收模塊。
第二初始化模塊,用于確定與客戶端具有連接關系的服務端,分別創建與每一個服務端對應的socket類對象,并記錄服務端與其對應的socket類對象的對應關系,socket類對象中包含了與其對應的服務端主機的主機名,將socket類對象指針存入預先建立的客戶端socket鏈表;還用于創建線程隊列,然后注冊線程隊列,將線程隊列和線程名綁定。
連接模塊,用于加載套接字庫,倉Il建客戶端socket,向與客戶端socket鏈表中的socket類對象對應的服務端發出連接請求直至連接成功。
接收模塊,用于接收服務端發送的數據,并對數據進行解析,解析出線程名,將去除線程名后的數據寫入所述解析出的線程名所對應的線程隊列中,讀取所述線程隊列的數據。
對所公開的實施例的上述說明,使本領域專業技術人員能夠實現或使用本發明。對這些實施例的多種修改對本領域的專業技術人員來說將是顯而易見的,本文中所定義的一般原理可以在不脫離本發明的精神或范圍的情況下,在其它實施例中實現。因此,本發明將不會被限制于本文所示的這些實施例,而是要符合與本文所公開的原理和新穎特點相一致的最寬的范圍。
權利要求
1.一種基于socket的網絡通信方法,其特征在于,該方法包括: A:初始化過程,包括: Al:確定與服務端具有連接關系的客戶端,分別創建與每一個客戶端對應的socket類對象,并記錄所述客戶端與其對應的socket類對象的對應關系,所述socket類對象中包含了與其對應的客戶端主機的主機名,將所述socket類對象指針存入預先建立的服務端socket鏈表中; A2:分別建立與所述服務端socket鏈表中每一個socket類對象對應的socket通信隊列,并記錄所述socket類對象與其對應的socket通信隊列的對應關系; B:通信過程,包括: B1:服務端監聽網絡狀態,當監聽到客戶端發送的連接請求,接收來自發送連接請求的客戶端的連接; B2:服務端指定待接收數據客戶端的主機名、線程名和待發送的數據,根據所述主機名確定待接收數據客戶端對應的socket類對象,并確定與所述socket類對象對應的socket通信隊列; B3:將所述線程名和所述待發送數據寫入待接收數據的客戶端對應的socket通信隊列中; B4:與所述socket類對象對應的socket執行程序提取所述socket通信隊列中的線程名和待發送數據,并發送給待接收數據的客戶端; B5:所述待接收數據的客戶端接收服務端發送的數據,從所述服務端發送的數據中解析出線程名,將所述數據中去除線程名后的數據存入預先建立的所述解析出的線程名所對應的線程隊列中,客戶端的指定線程從所述線程隊列中提取數據。
2.根據權利要求1所述的方法,其特征在于,所述服務端接收來自發送連接請求的客戶端的連接具體為: 判斷所述發送請求 的客戶端對應的socket類對象是否存在于所述服務端socket鏈表中時,如果是,則接收來自發送連接請求的客戶端的連接;如果否,則創建socket類對象并進行綁定監聽,然后接收來自發送連接請求的客戶端的連接。
3.一種基于socket的網絡通信方法,其特征在于,該方法包括: C:初始化過程,包括: Cl:確定與客戶端具有連接關系的服務端,分別創建與每一個服務端對應的socket類對象,并記錄所述服務端與其對應的socket類對象的對應關系,所述socket類對象中包含了與其對應的服務端的主機信息,將所述socket類對象指針存入預先建立的客戶端socket 鏈表; C2:客戶端創建線程隊列鏈表,然后注冊線程隊列,將線程隊列和線程名綁定; D:通信過程,包括: Dl:向與所述客戶端socket鏈表中的socket類對象對應的服務端發送連接請求,當客戶端發送的連接請求被所述服務端監聽到,客戶端與監聽到所述連接請求的服務端建立連接; D2:與客戶端建立連接的服務端指定待接收數據客戶端的主機名、線程名和待發送的數據,將線程名和待發送的數據存入服務端socket鏈表中與客戶端對應的socket類對象所對應的通信隊列中,與所述socket類對象對應的socket執行程序提取所述socket通信隊列中的線程名和待發送數據,并發送給客戶端; D3:客戶端接收與其建立連接的服務端發送的數據,從接收的數據中解析出線程名; D4:將所述線程名從所述接收的數據中去除; D5:將去除線程名后的數據寫入所述解析出的線程名所對應的線程隊列中; D6:從線程隊列中提取所述去除線程名后的數據。
4.根據權利要求3所述的方法,其特征在于,所述線程隊列鏈表中的存放單元為含有線程隊列句柄和線程名的結構體,注冊線程隊列時,將所述線程隊列句柄和線程名寫入結構體,將結構體添加至線程隊列鏈表尾部。
5.一種基于socket的服務端網絡通信裝置,其特征在于,包括: 第一初始化模塊,用于確定與服務端具有連接關系的客戶端,分別創建與每一個客戶端對應的socket類對象,并記錄所述客戶端與其對應的socket類對象的對應關系,所述socket類對象中包含了與其對應的客戶端主機的主機名,將所述socket類對象指針存入預先建立的服務端socket鏈表;分別建立與所述服務端socket鏈表中每一個socket類對象對應的socket通信隊列,并記錄所述socket類對象與其對應的socket通信隊列的對應關系; 監聽模塊,用于監聽客戶端發送的連接請求,接收來自客戶端的連接; 發送模塊,用于確定與所述發送請求客戶端對應的socket類對象,并確定與所述socket類對象對應的socket通信隊列;將服務端所指定的線程名和待發送數據寫入與所述待接收數據的客戶端對應的socket通信隊列中;與所述socket類對象對應的socket執行程序提取所述socket通信隊列中的線程名和待發送數據,并發送給待接收數據的客戶端。
6.一種基于socket的客戶端網絡通信裝置,其特征在于,包括: 第二初始化模塊,用于確定與客戶端具有連接關系的服務端,分別創建與每一個服務端對應的socket類對象,并記錄所述服務端與其對應的socket類對象的對應關系,所述socket類對象中包含了與其對應的服務端的主機信息,將所述socket類對象指針存入預先建立的客戶端so cket鏈表;還用于創建線程隊列,然后注冊線程隊列,將線程隊列和線程名綁定; 連接模塊,用于加載套接字庫,倉Il建客戶端socket,向與所述客戶端socket鏈表中的socket類對象對應的服務端發出連接請求直至連接成功; 接收模塊,用于接收服務端發送的數據,并對數據進行解析,解析出線程名,將去除線程名后的數據寫入所述解析出的線程名所對應的線程隊列中,讀取所述線程隊列的數據。
7.一種基于socket的網絡通信系統,其特征在于,包括如權利要求5和權利要求6所述的網絡通信裝置。
全文摘要
本發明提供的基于socket的網絡通信方法中,服務端發送數據時,根據客戶端的主機名尋找對應的socket類對象和socket通信隊列,將客戶端的線程名和待發送數據寫入socket通信隊列;從socket通信隊列中提取出待發送數據并發送;客戶端的socket接收到服務端發送的數據,進行解析,根據解析出的線程名找到相應的線程隊列,并將去除線程名后的原始數據寫入線程隊列中;從線程隊列中提取出服務端發送的數據。本發明提供的網絡通信方法及系統,使得應用程序設計者在進行應用程序開發時,不需要考慮底層socket網絡通信編程,只需調用網絡接口函數即可,整個網絡通信過程簡潔明了。
文檔編號H04L29/06GK103139157SQ20111038544
公開日2013年6月5日 申請日期2011年11月28日 優先權日2011年11月28日
發明者吳晶晶 申請人:北京南車時代信息技術有限公司