當前位置:
首頁 > 知識 > 編寫基於TCP的應用程序

編寫基於TCP的應用程序

這似乎是一個非常簡單的話題, 就跟"是個人就能做網站"一樣, 你可能也認為"是個人就能寫使用TCP socket的網路程序". 不過, 下面介紹的幾個基本的原理的做法, 你可能並沒有理解.

TCP是一種流式的協議, 簡單的說, TCP不檢查數據的語義, 更不會檢查數據的邊界, 而應用層一般使用的是報文協議, 所以會有所謂的"粘包""拆包"問題. 為此, 產生了一些特定的用法和模式.

任何應用程序, 都必須先進行報文協議設計. 雖然有些人捂上耳朵叫道"我不需要報文協議", 但是, 他還是需要進行報文協議設計. 有幾種方式可用來設計報文協議:

  1. 明確聲明報文數據的長度.

  2. 使用分隔符.

  3. 發送方發送完數據後關閉連接.

第3種是socket的特定用法.報文設計方法1: 明確聲明報文數據的長度

此種方法一般較為常用, 因為兼容性好性能高. 一會介紹方法2的時候你就知道了. 一般會在數據的最前面用固定的幾個位元組存儲一個二進位整數, 顯示後面的數據的長度. 不過, 這是比較接近硬體底層報文協議設計. 應用層一般不這樣, 在數據的前端固定幾個位元組存儲ASCII數字, 前端補字元串"0", 或者在數字串後面跟換行符"n", 這是一種和2的方法的混用.報文設計方法2: 使用分隔符

前面介紹方法1的時候提過了, 使用分隔符來分隔報文, 然後在一般的語言都有 split 函數, 用起來簡單. 不過, 使用分隔符有一個缺點, 就是要進行數據轉義, 避免報文數據中帶有分隔符, 那就不好了. 此種方法還有一個缺點, 就是要遍歷每一個位元組, 查找分隔符, 性能不好. 介紹方法1的時候, 因為我們明確知道是數字串後面跟換行符, 所以不需要轉義, 不會有轉義性能損失, 同時數字串一般很短, 也可以忽略遍歷性能損失.報文設計方法3: 發送方發送完數據後關閉連接

這是 HTTP 1.0 採用的方式, HTTP 1.0 會在發送完響應後關閉連接(當然, 發送完請求後不能關閉連接, 所以可想而知, HTTP 1.0 必然使用方法1或者方法2, 你可以自己去學習了解). 這種方法不常用, 因為適用場景非常窄, 功能差.

很難被理解的常用的TCP應用程序慣用法:

  1. 必須使用循環來發送數據

對於原始的socket, 發送數據的函數是write:

ssize_t write(int fd, const void *buf, size_t count);

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科技優家 的精彩文章:

一不小心,陷入TCP的性能問題
ZooKeeper分布式鎖淺談(一)
javascript痛點之一變數作用域
react router 4.0以上的路由應用
Java 8 新特性1-函數式介面

TAG:科技優家 |

您可能感興趣

啟用PHP程序
XML 應用程序
微軟應用商店即將支持命令行類型的UWP應用程序
PWA 即將終結應用程序商店
利用機器學習突破基於文本的CAPTCHA驗證碼程序
中鈔BROP推區塊鏈小程序「Pick你的畫」 實踐可信登記應用
機器學習應用程序:如何將AI和ML應用到您的應用程序中
微軟為Teams添加新的應用程序集成和應用程序商店
使用LIVR應用程序,享受VR戲劇
用C+寫成的機器學習和數據分析應用程序工具包——dlib
微軟正在將先進的網路應用程序轉變為Windows應用程序
使用Python構建的七大應用程序
微軟發布Your Phone UWP應用程序將用戶手機與PC連接
Pulumi開源基礎架構,能簡化AWS應用程序部署工作
AI-商業應用程序的採樣器
IBM公布區塊鏈應用新技術,可測試軟體應用程序
DISCO和VISYON合作開發新的教育AR應用程序
風河支持OPNFV驗證程序簡化商業NFV應用
你的Mac將可以運行iPad應用程序!
艱難生存? HTC應用程序從谷歌Play商店消失