編寫基於TCP的應用程序
這似乎是一個非常簡單的話題, 就跟"是個人就能做網站"一樣, 你可能也認為"是個人就能寫使用TCP socket的網路程序". 不過, 下面介紹的幾個基本的原理的做法, 你可能並沒有理解.
TCP是一種流式的協議, 簡單的說, TCP不檢查數據的語義, 更不會檢查數據的邊界, 而應用層一般使用的是報文協議, 所以會有所謂的"粘包""拆包"問題. 為此, 產生了一些特定的用法和模式.
任何應用程序, 都必須先進行報文協議設計. 雖然有些人捂上耳朵叫道"我不需要報文協議", 但是, 他還是需要進行報文協議設計. 有幾種方式可用來設計報文協議:
明確聲明報文數據的長度.
使用分隔符.
發送方發送完數據後關閉連接.
第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應用程序慣用法:
必須使用循環來發送數據
對於原始的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商店消失