網路程式服務端設計二

2021-04-20 15:21:53 字數 1851 閱讀 1270

通訊模組:

socket主要有阻塞套接字和無阻塞套接字兩種,對於無阻塞套結字,每次讀寫後,不管讀寫的位元組數是否達到需要,都立即返回;而對於阻塞套結字,若讀寫位元組數不夠,函式將被阻塞,直到任何待處理的資料都處理完畢才返回。能夠看出,若採用無阻塞套結字,則將使網路傳輸變得很不穩定,在網路環境不好時很難控制傳輸。因此,對於我們的系統,將採用阻塞模式。

我們下乙個面臨的問題是怎麼知道何時讀入,假如在不合適的時候從阻塞套接字讀入資料,那執行緒很可能將被阻塞,這裡採用了select——多路復用技術,原理是對我們的socket進行監控,假如socket上有讀事件發生,將呼叫訊息模組傳送訊息給socket的攜帶物件,對其進行讀寫。

以下是對socket的簡單封裝:

class ssocket

; 通過對socket的封裝,我們完成了通訊模組的基本任務。下一步要做的是傳輸網路上的訊息,此時需要對ssocket繼續封裝,首先定義乙個訊息結構體,然後就是讀寫訊息,訊息結構根據各個遊戲不同,在此就不再深入**了。

執行緒管理模組

由於我們用了阻塞模式,這就意味著必須要為各個socket建立單獨的執行緒,否則很可能會引起伺服器端停止工作。因此我們需要封裝執行緒,封裝內容主要包括:執行緒函式位址,執行緒開始時間,執行緒上次阻塞時間,執行緒最大阻塞時間,執行緒start方法,執行緒stop方法。執行緒stop方法能夠通過傳送訊號給執行緒來達到殺死執行緒的目的。

執行緒類封裝完成後,我們就能夠開始編寫管理模組**了。管理模組其實也是個執行緒,其第一功能就是監控各個執行緒是否阻塞超時,通過察看執行緒上次阻塞時間和最大阻塞時間來完成。一旦發現當前時間超過執行緒最大阻塞時間加上執行緒上次阻塞時間,既可斷定執行緒阻塞超時,此時就需要kill該執行緒。另外,其他一些根執行緒有關的管理方法都有此模組負責。

訊息傳遞模組:

物件、模組之間怎樣傳遞訊息,這也是伺服器端設計的重點。舉乙個簡化的例子說明如下:若某一玩家對另一玩家發了一條資訊,先通過通訊模組接收資料,然後用訊息傳遞模組通知另一玩家,再由另一玩家的執行緒呼叫通訊模組把訊息發回客戶端,這就是訊息傳遞模組的作用。

要怎樣封裝訊息模組呢?第一步就是做乙個messagebox類,他是個堆疊,用來裝訊息,主要由pop和push方法,當然這裡不能忘了必須實現乙個儲存訊息資料結構。第二步封裝就是handlemessage類,這就是我們的訊息模組的主要實現。其中有乙個waitmessage方法,呼叫此方法後,執行緒將被阻塞,直到有訊息到達。在此可通過無名訊號量來實現,也就是unix下的sem,他能夠增加或減少訊號量來實現互斥。然而,有人一定會問,為什麼我們要有waitmesssage呢,這不是將造成執行緒阻塞嗎?其實,伺服器端是個被動驅動的模型,就像沒有踩油門汽車就不會走相同,假如沒有訊息來驅動,伺服器端就不會執行下去。

實現以上封裝後,在兩個物件之間發訊息就變得很簡單,我們直接用sendmessage方法就能夠,sendmessage的實現也很簡單,就是呼叫messagebox裡push方法向裡邊放訊息,之後把sem加一,這樣接受這就能夠收到訊息了。

其他:

剩下的兩個模組,都是和遊戲相關的,事實上他們是兩個更為複雜的模組,根據要編寫的遊戲的不同,這兩個模組實現也不同。但是,他們究竟是做什麼的,下面通過乙個例子來說明:

假設我們現在研發的是個rpg遊戲,我們的玩家在螢幕上讓遊戲人物向前走了一步,此時傳送移動請求給伺服器端,伺服器端的通訊模組收到後,便通知遊戲世界管理模組,遊戲世界管理模組呼叫遊戲規則模組,判斷玩家請求是否符合規則(是否合法),若能夠移動,再由遊戲管理模組將其座標改變,最後再通知其相關玩家。也就是說,規則模組實際上是專門處理遊戲業務邏輯的,管理模組實際上是專門處理遊戲物件的。

小結

C 網路程式設計(服務端程式)

include include 載入靜態lib檔案或者載入動態dll檔案 pragma comment lib,ws2 32.lib void main if lobyte wsadata.wversion 1 hibyte wsadata.wversion 1 建立用於監聽的套接字 socket ...

python tcp網路程式 客戶端 服務端

所謂的伺服器端 就是提供服務的一方,而客戶端,就是需要被服務的一方 比如乙個人想打10086求助人工服務。tcp的客戶端要比伺服器端簡單很多,客戶端只需要找乙個 亭,拿起 撥打即可,流程要少很多 示例 from socket import 建立socket tcp client socket soc...

服務端socket程式

socket是一種ipc方法,本文實現乙個簡單的服務端例程,用於了解socket程式框架。socket函式用於建立套接字。bind函式用於分配ip位址和埠號。listen函式將套接字轉為可接收連線狀態。accept函式受理連線請求。如果在沒有連線的情況下呼叫該函式,則不會返回,直到有連線請求為止。c...