專(zhuān)利名稱(chēng):一種時(shí)間可控的客戶(hù)端服務(wù)器傳輸方法
技術(shù)領(lǐng)域:
本發(fā)明涉及數(shù)據(jù)傳輸,具體來(lái)說(shuō),涉及一種時(shí)間可控的客戶(hù)端服務(wù)器傳輸方法。
背景技術(shù):
大部分網(wǎng)絡(luò)協(xié)議的實(shí)現(xiàn)都由客戶(hù)端和服務(wù)器端來(lái)協(xié)作完成。這種模型本質(zhì)上涉及兩個(gè)不同的程序,通常這兩個(gè)程序在不同機(jī)器上運(yùn)行。這些機(jī)器之間都有網(wǎng)絡(luò)連接,服務(wù)器端程序提供服務(wù)并對(duì)來(lái)自客戶(hù)程序的請(qǐng)求做出響應(yīng),而客戶(hù)端程序則是在使用者和服務(wù)器端程序之間建立某種溝通的渠道,或者是作為使用服務(wù)器提供的某種網(wǎng)絡(luò)服務(wù)的工具。一個(gè)典型的服務(wù)器與客戶(hù)端之間的交互可能如下所示客戶(hù)端發(fā)出一個(gè)請(qǐng)求;服務(wù)器收到客戶(hù)端的請(qǐng)求,進(jìn)行分析處理;服務(wù)器將運(yùn)行處理的結(jié)果返回給客戶(hù)端。通常一個(gè)服務(wù)器需要向多個(gè)客戶(hù)端提供服務(wù),因此對(duì)服務(wù)器來(lái)說(shuō),還需要考慮如何有效地處理多個(gè)客戶(hù)的請(qǐng)求。Socket的連接類(lèi)型可以分為兩種,分別是面向連接的字節(jié)流類(lèi)型和面向無(wú)連接數(shù)據(jù)報(bào)類(lèi)。面向無(wú)連接數(shù)據(jù)報(bào)類(lèi)型的Socket工作流程比較簡(jiǎn)單,雙方不需要進(jìn)行太多的溝通與交互,客戶(hù)端直接將用戶(hù)的請(qǐng)求打包發(fā)送到服務(wù)器端,省略了建立一個(gè)固定信息通道的過(guò)程,服務(wù)器端也是直接將處理的結(jié)果發(fā)送給客戶(hù)端,每個(gè)發(fā)送的數(shù)據(jù)報(bào)都攜帶有傳遞所需要的所有地址信息;面向連接的字節(jié)流類(lèi)型的Socket工作中有比較嚴(yán)格的操作次序,工作的原理也比較復(fù)雜。在這種類(lèi)型的Socket的工作過(guò)程中.必須首先啟動(dòng)服務(wù)器端,通過(guò)調(diào)用SocketO函數(shù)建立一個(gè)Socket對(duì)象,然后調(diào)用BindO函數(shù)將該Socket對(duì)象和本地網(wǎng)絡(luò)地址綁定到一起。再調(diào)用ListenO函數(shù)使該Socket對(duì)象處于偵聽(tīng)狀態(tài),并規(guī)定它的最大請(qǐng)求的數(shù)量,其工作流程如圖1所示。總的來(lái)說(shuō),無(wú)連接和面向連接的通信方式各有長(zhǎng)處和短處,在僅僅涉及少量的信息傳遞的場(chǎng)合可以使用無(wú)連接操作,如果涉及大量信息傳遞的場(chǎng)合可以采用面向連接操作。
發(fā)明內(nèi)容
為解決上述問(wèn)題,本發(fā)明提供了一種時(shí)間可控的客戶(hù)端服務(wù)器傳輸方法。一種時(shí)間可控的客戶(hù)端服務(wù)器傳輸方法,在客戶(hù)端和服務(wù)器操作中,將每個(gè)操作函數(shù)分為阻塞函數(shù)和非阻塞函數(shù),為客戶(hù)端和服務(wù)器連接過(guò)程中的阻塞函數(shù)創(chuàng)建獨(dú)立的等待線程,對(duì)于發(fā)送和接收函數(shù),設(shè)置一個(gè)超時(shí)重連參數(shù)。優(yōu)選的,所述等待線程在創(chuàng)建后,連接過(guò)程中的主線程可以繼續(xù)執(zhí)行其它操作。優(yōu)選的,所述發(fā)送和接收函數(shù)無(wú)論是否成功都會(huì)在超時(shí)重連參數(shù)時(shí)間之內(nèi)做出返回。優(yōu)選的,所述操作封裝成lib庫(kù)的形式提供給用戶(hù),包括客戶(hù)端和服務(wù)器端兩部分。
優(yōu)選的,所述服務(wù)器端的lib庫(kù)包括服務(wù)器初始化庫(kù),用于初始化服務(wù)器端運(yùn)行環(huán)境,輸入?yún)?shù)為IP地址、端口,執(zhí)行的操作為創(chuàng)建一個(gè)socket、綁定到指定地址和端口、設(shè)置偵聽(tīng),另外專(zhuān)門(mén)創(chuàng)建一個(gè)新的線程來(lái)等待客戶(hù)端的連接;如果整個(gè)過(guò)程沒(méi)有錯(cuò)誤則返回給用戶(hù)新創(chuàng)建的socket,如果出錯(cuò)則通知用戶(hù)出錯(cuò)的地方和原因;服務(wù)器發(fā)送庫(kù),用于發(fā)送數(shù)據(jù)到指定客戶(hù)端,輸入?yún)?shù)為socket句柄、數(shù)據(jù)緩沖區(qū)地址和大小、timeout ;該函數(shù)采用非阻塞方式循環(huán)發(fā)送數(shù)據(jù),一旦超過(guò)timeout時(shí)間則終止發(fā)送,并通知用戶(hù);否則一直嘗試發(fā)送緩沖區(qū)數(shù)據(jù)到指定客戶(hù)端;服務(wù)器接收庫(kù),用于從客戶(hù)端收取數(shù)據(jù),輸入?yún)?shù)為socket句柄、接收緩沖區(qū)地址和大小、timeout ;該函數(shù)采用非阻塞方式循環(huán)接收數(shù)據(jù),一旦超過(guò)timeout時(shí)間則終止接收過(guò)程,并通知用戶(hù);否則一直嘗試從指定客戶(hù)端接收數(shù)據(jù);服務(wù)器中止庫(kù),用于終止整個(gè)運(yùn)行環(huán)境,輸入?yún)?shù)為socket句柄,該函數(shù)關(guān)閉 socket連接并終止之前建立的線程,整個(gè)過(guò)程沒(méi)有阻塞操作。優(yōu)選的,所述客戶(hù)端的lib庫(kù)包括客戶(hù)端初始化庫(kù),用于初始化客戶(hù)端運(yùn)行環(huán)境,輸入?yún)?shù)為服務(wù)器端的IP地址、 端口、timeout,執(zhí)行的操作為創(chuàng)建一個(gè)socket,并用此socket連接服務(wù)器端,連接過(guò)程是非阻塞的,嘗試時(shí)間超過(guò)用戶(hù)指定的timeout后不再?lài)L試,而是返回給用戶(hù)具體的出錯(cuò)原因,等待用戶(hù)的進(jìn)一步動(dòng)作;客戶(hù)端發(fā)送庫(kù),用于發(fā)送數(shù)據(jù)到指定客戶(hù)端,輸入?yún)?shù)為socket句柄、數(shù)據(jù)緩沖區(qū)地址和大小、timeout ;該函數(shù)采用非阻塞方式循環(huán)發(fā)送數(shù)據(jù),一旦超過(guò)timeout時(shí)間則終止發(fā)送,并通知用戶(hù);否則一直嘗試發(fā)送緩沖區(qū)數(shù)據(jù)到指定客戶(hù)端;客戶(hù)端接收庫(kù),用于從客戶(hù)端收取數(shù)據(jù),輸入?yún)?shù)為socket句柄、接收緩沖區(qū)地址和大小、timeout ;該函數(shù)采用非阻塞方式循環(huán)接收數(shù)據(jù),一旦超過(guò)timeout時(shí)間則終止接收過(guò)程,并通知用戶(hù);否則一直嘗試從指定客戶(hù)端接收數(shù)據(jù);客戶(hù)端中止庫(kù),用于終止整個(gè)運(yùn)行環(huán)境,輸入?yún)?shù)為socket句柄,該函數(shù)關(guān)閉 socket連接,整個(gè)過(guò)程沒(méi)有阻塞操作。
圖1是面向連接的客戶(hù)端服務(wù)器模型圖2是服務(wù)器端與客戶(hù)端完整執(zhí)行流程
具體實(shí)施例方式本發(fā)明將傳輸雙方分別稱(chēng)為服務(wù)器端和客戶(hù)端,服務(wù)器端首先建立Socket環(huán)境, 創(chuàng)建獨(dú)立線程等待客戶(hù)端連接;客戶(hù)端事先知道服務(wù)器端的地址,本地Socket環(huán)境建立以后即向服務(wù)器端發(fā)出建立連接的請(qǐng)求;連接建立以后雙方可以互相發(fā)送數(shù)據(jù)直到Socket 關(guān)閉。以上過(guò)程的關(guān)鍵是在所有的執(zhí)行點(diǎn)都需要消除阻塞的影響,任何調(diào)用都可以在設(shè)定的時(shí)間內(nèi)返回,用戶(hù)可以根據(jù)返回值來(lái)判斷下一步的動(dòng)作。下面分別針對(duì)服務(wù)器端和客戶(hù)端給出解決方法服務(wù)器端。SocketO >Bind()和ListenO都是標(biāo)準(zhǔn)的非阻塞函數(shù),不需要做特別的操作即可滿(mǎn)足需求;但是Acc印t()是典型的阻塞函數(shù),執(zhí)行后會(huì)一直等待客戶(hù)端的連接而不返回,除非客戶(hù)端連接的到來(lái),這里采用的解決方法是創(chuàng)建一個(gè)獨(dú)立的等待線程來(lái)執(zhí)行Acc印t()函數(shù)的操作,這樣主線程可以無(wú)阻塞地執(zhí)行其他操作;建立連接后,服務(wù)器端會(huì)接收從客戶(hù)端發(fā)來(lái)的數(shù)據(jù),也會(huì)向客戶(hù)端發(fā)送數(shù)據(jù),這兩個(gè)操作都可能阻塞,對(duì)于RecvO 函數(shù),本發(fā)明封裝此函數(shù),給調(diào)用者提供另外一個(gè)timeout參數(shù),使得本操作無(wú)論接收成功與否都會(huì)在timeout時(shí)間內(nèi)返回,對(duì)于knd()函數(shù)也做類(lèi)似操作??蛻?hù)端。SocketO是標(biāo)準(zhǔn)的非阻塞函數(shù),不需要做特別的操作即可滿(mǎn)足需求; ConnectO需要設(shè)置建立的socket為非阻塞模式,然后根據(jù)用戶(hù)設(shè)定的時(shí)間來(lái)嘗試多次連接,如果在限定的時(shí)間內(nèi)未連接成功則返回用戶(hù)具體的不成功的原因;發(fā)送和接收操作參考服務(wù)器端的設(shè)計(jì)即可。本發(fā)明將所有的操作封裝成lib庫(kù)的形式提供給用戶(hù),分為服務(wù)器端和客戶(hù)端兩部分服務(wù)器端的接口Server_Init ()——初始化服務(wù)器端運(yùn)行環(huán)境,輸入?yún)?shù)為IP地址、端口等,執(zhí)行的操作為創(chuàng)建一個(gè)socket、綁定到指定地址和端口、設(shè)置偵聽(tīng),另外專(zhuān)門(mén)創(chuàng)建一個(gè)新的線程來(lái)等待客戶(hù)端的連接。如果整個(gè)過(guò)程沒(méi)有錯(cuò)誤則返回給用戶(hù)新創(chuàng)建的socket,如果出錯(cuò)則通知用戶(hù)出錯(cuò)的地方和原因。Server_Send()——發(fā)送數(shù)據(jù)到指定客戶(hù)端,輸入?yún)?shù)為socket句柄、數(shù)據(jù)緩沖區(qū)地址和大小、timeout等。本函數(shù)采用非阻塞方式循環(huán)發(fā)送數(shù)據(jù),一旦超過(guò)timeout時(shí)間則終止發(fā)送,并通知用戶(hù);否則一直嘗試發(fā)送緩沖區(qū)數(shù)據(jù)到指定客戶(hù)端。Server_Recv()——從客戶(hù)端收取數(shù)據(jù),輸入?yún)?shù)為socket句柄、接收緩沖區(qū)地址和大小、timeout等。本函數(shù)采用非阻塞方式循環(huán)接收數(shù)據(jù),一旦超過(guò)timeout時(shí)間則終止接收過(guò)程,并通知用戶(hù);否則一直嘗試從指定客戶(hù)端接收數(shù)據(jù)。ServerJtopO——終止整個(gè)運(yùn)行環(huán)境,輸入?yún)?shù)為socket句柄,本函數(shù)關(guān)閉 socket連接并終止之前建立的線程,整個(gè)過(guò)程沒(méi)有阻塞操作??蛻?hù)端的接口 Client_Init()——初始化客戶(hù)端運(yùn)行環(huán)境,輸入?yún)?shù)為服務(wù)器端的IP地址、端口、timeout等,執(zhí)行的操作為創(chuàng)建一個(gè)socket,并用此socket連接服務(wù)器端,連接過(guò)程是非阻塞的,嘗試時(shí)間超過(guò)用戶(hù)指定的timeout后不再?lài)L試,而是返回給用戶(hù)具體的出錯(cuò)原因,等待用戶(hù)的進(jìn)一步動(dòng)作。Client_Send()-同 Server_Send ()。Client_Recv()-同 Server_Recv ()。Client_Stop ()——終止整個(gè)運(yùn)行環(huán)境,輸入?yún)?shù)為socket句柄,本函數(shù)關(guān)閉 socket連接,整個(gè)過(guò)程沒(méi)有阻塞操作。服務(wù)器端與客戶(hù)端完整執(zhí)行流程如圖2所示。
權(quán)利要求
1.一種時(shí)間可控的客戶(hù)端服務(wù)器傳輸方法,其特征在于在客戶(hù)端和服務(wù)器操作中, 將每個(gè)操作函數(shù)分為阻塞函數(shù)和非阻塞函數(shù),為客戶(hù)端和服務(wù)器連接過(guò)程中的阻塞函數(shù)創(chuàng)建獨(dú)立的等待線程,對(duì)于發(fā)送和接收函數(shù),設(shè)置一個(gè)超時(shí)重連參數(shù)。
2.如權(quán)利要求1所述的方法,其特征在于所述等待線程在創(chuàng)建后,連接過(guò)程中的主線程可以繼續(xù)執(zhí)行其它操作。
3.如權(quán)利要求1所述的方法,其特征在于所述發(fā)送和接收函數(shù)無(wú)論是否成功都會(huì)在超時(shí)重連參數(shù)時(shí)間之內(nèi)做出返回。
4.如權(quán)利要求1所述的方法,其特征在于所述操作封裝成lib庫(kù)的形式提供給用戶(hù), 包括客戶(hù)端和服務(wù)器端兩部分。
5.如權(quán)利要求4所述的方法,其特征在于所述服務(wù)器端的lib庫(kù)包括服務(wù)器初始化庫(kù),用于初始化服務(wù)器端運(yùn)行環(huán)境,輸入?yún)?shù)為IP地址、端口,執(zhí)行的操作為創(chuàng)建一個(gè)socket、綁定到指定地址和端口、設(shè)置偵聽(tīng),另外專(zhuān)門(mén)創(chuàng)建一個(gè)新的線程來(lái)等待客戶(hù)端的連接;如果整個(gè)過(guò)程沒(méi)有錯(cuò)誤則返回給用戶(hù)新創(chuàng)建的socket,如果出錯(cuò)則通知用戶(hù)出錯(cuò)的地方和原因;服務(wù)器發(fā)送庫(kù),用于發(fā)送數(shù)據(jù)到指定客戶(hù)端,輸入?yún)?shù)為socket句柄、數(shù)據(jù)緩沖區(qū)地址和大小、timeout ;該函數(shù)采用非阻塞方式循環(huán)發(fā)送數(shù)據(jù),一旦超過(guò)timeout時(shí)間則終止發(fā)送,并通知用戶(hù);否則一直嘗試發(fā)送緩沖區(qū)數(shù)據(jù)到指定客戶(hù)端;服務(wù)器接收庫(kù),用于從客戶(hù)端收取數(shù)據(jù),輸入?yún)?shù)為socket句柄、接收緩沖區(qū)地址和大小、timeout ;該函數(shù)采用非阻塞方式循環(huán)接收數(shù)據(jù),一旦超過(guò)timeout時(shí)間則終止接收過(guò)程,并通知用戶(hù);否則一直嘗試從指定客戶(hù)端接收數(shù)據(jù);服務(wù)器中止庫(kù),用于終止整個(gè)運(yùn)行環(huán)境,輸入?yún)?shù)為socket句柄,該函數(shù)關(guān)閉socket 連接并終止之前建立的線程,整個(gè)過(guò)程沒(méi)有阻塞操作。
6.如權(quán)利要求4所述的方法,其特征在于所述客戶(hù)端的lib庫(kù)包括客戶(hù)端初始化庫(kù),用于初始化客戶(hù)端運(yùn)行環(huán)境,輸入?yún)?shù)為服務(wù)器端的IP地址、端口、 timeout,執(zhí)行的操作為創(chuàng)建一個(gè)socket,并用此socket連接服務(wù)器端,連接過(guò)程是非阻塞的,嘗試時(shí)間超過(guò)用戶(hù)指定的timeout后不再?lài)L試,而是返回給用戶(hù)具體的出錯(cuò)原因,等待用戶(hù)的進(jìn)一步動(dòng)作;客戶(hù)端發(fā)送庫(kù),用于發(fā)送數(shù)據(jù)到指定客戶(hù)端,輸入?yún)?shù)為socket句柄、數(shù)據(jù)緩沖區(qū)地址和大小、timeout ;該函數(shù)采用非阻塞方式循環(huán)發(fā)送數(shù)據(jù),一旦超過(guò)timeout時(shí)間則終止發(fā)送,并通知用戶(hù);否則一直嘗試發(fā)送緩沖區(qū)數(shù)據(jù)到指定客戶(hù)端;客戶(hù)端接收庫(kù),用于從客戶(hù)端收取數(shù)據(jù),輸入?yún)?shù)為socket句柄、接收緩沖區(qū)地址和大小、timeout ;該函數(shù)采用非阻塞方式循環(huán)接收數(shù)據(jù),一旦超過(guò)timeout時(shí)間則終止接收過(guò)程,并通知用戶(hù);否則一直嘗試從指定客戶(hù)端接收數(shù)據(jù);客戶(hù)端中止庫(kù),用于終止整個(gè)運(yùn)行環(huán)境,輸入?yún)?shù)為socket句柄,該函數(shù)關(guān)閉socket 連接,整個(gè)過(guò)程沒(méi)有阻塞操作。
全文摘要
本發(fā)明提供了一種時(shí)間可控的客戶(hù)端服務(wù)器傳輸方法,在客戶(hù)端和服務(wù)器操作中,將每個(gè)操作函數(shù)分為阻塞函數(shù)和非阻塞函數(shù),為客戶(hù)端和服務(wù)器連接過(guò)程中的阻塞函數(shù)創(chuàng)建獨(dú)立的等待線程,對(duì)于發(fā)送和接收函數(shù),設(shè)置一個(gè)超時(shí)重連參數(shù)。
文檔編號(hào)H04L29/06GK102413133SQ20111036429
公開(kāi)日2012年4月11日 申請(qǐng)日期2011年11月17日 優(yōu)先權(quán)日2011年11月17日
發(fā)明者劉新春, 袁清波, 許建衛(wèi), 邵宗有 申請(qǐng)人:曙光信息產(chǎn)業(yè)(北京)有限公司