那些不好的Socket伺服器設計

2022-01-11 00:22:50 字數 1426 閱讀 5616

自強的程式猿們都喜歡搞socket,而且覺得最好自己來封裝個元件出來,如果再往上,加入某種資料協議,讓上層伺服器開發照著此協議走,就是乙個小小的框架了。於是,從頭開始,最開始的伺服器的雛形與下圖有一些相似。

現在伺服器可以通過socket1到n,分別傳送二進位制資料到達對應的client1到n了,如果伺服器的設計到此打住,本文也就到此打住了,但這個的伺服器,畢竟離實際可以拿來作某種服務太遙遠了,就於就有了更深層次的封裝和擴充套件。

第一種:保留socket1到n不變,擴充套件listenerserver

例如,現在有乙個需求,要伺服器發到客戶端的資料內容為某些物件序列化後的json文字utf8轉碼後的二進位制,通過繼承listenerserver,我們可以封裝乙個sendjson的方法

public

class

jsonserver : listenerserver

public

void sendjson(socket socket, string

json)

}

到此,這種設計感覺依然」完美「,如果往上抽象一層,加入某種協議,基礎的listenerserver的就設計為listenerserverbasewhere t:iprotocol,iprotocol形成協議約束。

讓我說,我覺得這種設計基本能解決問題,但職責不單一,會造成上層通訊相關**和業務服務api**會偶合在一起,無法分離,因為所有返回資料流,都深深依賴於listenerserver這個物件。假設listenerserver為iis,socket1到n為httpcontext,那麼我們的業務api**就依賴於iis而不是依賴於httpcontext了,但寫了這麼多年asp.net程式,沒有人能引用iis程式集,呼叫iis.instance.response.write("這是伺服器回覆的內容「)如此的**吧!

listenerserver只作監聽,而socket1到n作類似httpcontext一樣封裝,在此且命名為session會話,如下圖 

現在解決剛才的json需求的sendjson的方法如下:

public

class

jsonsession : session

public

void sendjson(string

json)

}

到這裡,感覺邏輯通順多了,得到乙個session會話例項,就可以呼叫session.sendjson(json)了,不依賴於listenerserver。而基礎listenerserver可以設計為listenerserverwhere t:session,加入的協議在session的派生類完成。

伺服器模型 socket

伺服器模型 一 迴圈伺服器 迴圈伺服器在同一時刻只可以相應乙個客戶端請求 二 併發伺服器 併發伺服器在同一時刻可以相應多個客戶端的請求.迴圈伺服器 1.udp伺服器 udp迴圈伺服器的實現非常簡單 udp伺服器每次從套接字上讀取乙個客戶端的請求,處理,然後將結果返回給客戶機.可以用下面的演算法來實現...

伺服器那些事兒

linux下檢視系統資訊 uname help usage uname option print certain system information.with no option same as s.a,all print all information,in the following orde...

python的socket伺服器元件

socketserver 2.x中為socketserver class baserequesthandler def init self,request,client address,server self.request request self.client address client ad...