服務器網絡編程注意事項

不管什麼服務器,也不管你用什麼語言開發服務器。這些都要注意。(如果方法不一樣,那只是語言給你封裝好了。)

  1. 每個服務器在創建 的時候 都會 有 Listen這個或者功能。服務器開始監聽鏈接。其中裏面有個int 類型的參數。我在之前一直以爲,這個int類型 表示的 是 可以鏈接的客戶數量,其實不然,這個是每毫秒可以用戶訪問的併發數量。 比如,在同一毫秒時間寬度內,有三個客戶同時鏈接,而這個參數確實2。那麼這一毫秒他就只接收兩個客戶的請求。

  2. 然後會調用accept這個方法。 通常會有一個參數是你 剛纔已經在監聽模式的Socket的句柄。 還有兩個參數會是鏈接進來的客戶端的 地址。 然他會有一個返回值。或者你所使用的語言已經封裝了這個返回值。 這個不重要 。 重要的是,每次有個新用戶鏈接, 他都會重新生成一個新的Socket 的 句柄,用來專門和這個客戶端進行收發數據和關閉鏈接等等操作。 而 第一次原先的那個socket 還會進行他等待其他客戶端鏈接請求的使命。

  3. (2)中我們知道。每次一個客戶端的鏈接,都是實例一個新的Socket,而每一個Socket 都是會佔用一個端口的,只是他在實例的時候會自動選擇未被佔用的端口。這樣,如果你的遊戲服務應用,數據庫服務應用,什麼商場服務應用,用戶信息服務應用等等……各種服務應用都在一個服務器上面運行。這樣就會很消耗服務器的承載量,會造成明顯的延時卡頓,如果你使用了各種優化,各種策略之後還是會造成極大的網絡延時,那麼,就把他們 分別部署到不同的 服務器上面吧

  4. 大型網絡遊戲,如果客戶訪問量夠大的話,需要引用一個集羣化的方法,把所有鏈接請求分發出去。所有的服務器 由功能可以分爲“前置接收任務”,“後置處理任務”兩組服務器。“接收任務”負責接收客戶端的 任務請求,然後查看 “處理任務“服務器組那個服務器空閒,空閒則直接由這個 服務器 來完成 用戶 ”任務“。這樣就可以保障一臺服務器概念下永遠不會超過自己的承載量。

  5. 要注意的是在數據的收發方法 int send(...); int recv(...);中。(C++語言)其中參數 類型 Char*是表示提供數據緩衝的類型。雖然函數原型中註明是Char*類型,但是實際上可以接收任何類型的緩衝指針並做強制類型轉化即可
    那爲什麼還要用Char*這一類型呢,其實在在早期的時候 C++語言中沒有 Void* 這個概念。然後後期才加入的。而這個Void*在C++語言中又明確規定: 任何類型的指針,都可以轉化爲Void*
    那麼其實,這個Char* 你完全可以看做是Void*

  6. 在收發數據的時候需要注意。一方調用Send發送的時候,另一方應該調用Recv接收。如果兩端同時 Send 或者 Recv 那麼稍後一端的調用就會失敗。 如果Recv調用指定的緩衝過於小的時候,一般這時候返回值是實際接收的字節數,當這個值等於緩衝長度的時候,要考慮循環調用Recv直到返回值小於緩衝長度,以接收所有的數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章