Jack Jiang

          我的最新工程MobileIMSDK:http://git.oschina.net/jackjiang/MobileIMSDK
          posts - 499, comments - 13, trackbacks - 0, articles - 1

          1、引言

          本文接上篇《腦殘式網絡編程入門(一):跟著動畫來學TCP三次握手和四次揮手》,繼續腦殘式的網絡編程知識學習 ^_^。

          套接字socket是大多數程序員都非常熟悉的概念,它是計算機網絡編程的基礎,TCP/UDP收發消息都靠它。我們熟悉的web服務器底層依賴它,我們用到的MySQL關系數據庫、Redis內存數據庫底層依賴它。我們用微信和別人聊天也依賴它,我們玩網絡游戲時依賴它,讀者們能夠閱讀這篇文章也是因為有它在背后默默地支持著網絡通信。

          本篇文章依然嘗試使用動畫圖片的方式,來對這個知識點進行“腦殘式”講解(哈哈),期望讀者們可以更加簡單、直觀地理解Socket通信的數據讀寫本質。

          友情提示:如果您的網速較慢,加載gif動畫可能較慢,請耐心等候哦。

          學習交流:

          - 即時通訊開發交流3群:185926912[推薦]

          - 移動端IM開發入門文章:《新手入門一篇就夠:從零開發移動端IM

          (本文同步發布于:http://www.52im.net/thread-1732-1-1.html

          2、關于作者

          錢文品(老錢):畢業于華中科技大學計算機科學與技術專業,互聯網分布式高并發技術十年老兵,目前任掌閱科技資深后端工程師。熟練使用 Java、Python、Golang 等多種計算機語言,開發過游戲,制作過網站,寫過消息推送系統和MySQL 中間件,實現過開源的 ORM 框架、Web 框架、RPC 框架等。

          作者的Github: https://github.com/pyloque

          3、系列文章

          本文是系列文章中的第2篇,本系列大綱如下:

          腦殘式網絡編程入門(一):跟著動畫來學TCP三次握手和四次揮手

          腦殘式網絡編程入門(二):我們在讀寫Socket時,究竟在讀寫什么?》(本文)

          4、Socket讀寫的簡單過程理解

          當客戶端和服務器使用TCP協議進行通信時,客戶端封裝一個請求對象req,將請求對象req序列化成字節數組,然后通過套接字socket將字節數組發送到服務器,服務器通過套接字socket讀取到字節數組,再反序列化成請求對象req,進行處理,處理完畢后,生成一個響應對應res,將響應對象res序列化成字節數組,然后通過套接字將自己數組發送給客戶端,客戶端通過套接字socket讀取到自己數組,再反序列化成響應對象。

          通信框架往往可以將序列化的過程隱藏起來,我們所看到的現象就是上圖所示,請求對象req和響應對象res在客戶端和服務器之間跑來跑去。

          也許你覺得這個過程還是挺簡單的,很好理解,但是實際上背后發生的一系列事件超出了你們中大多數人的想象。通信的真實過程要比上面的這張圖復雜太多。你也許會問,我們需要了解的那么深入么,直接拿來用不就可以了么?

          在互聯網技術服務行業工作多年的經驗告訴我,如果你對底層機制不了解,你就會不明白為什么對套接字socket的讀寫會出現各種奇奇乖乖的問題,為什么有時會阻塞,有時又不阻塞,有時候還報錯,為什么會有粘包半包問題,NIO具體又是什么,它是什么特別新鮮的技術么?對于這些問題的理解都需要你了解底層機制。

          5、Socket讀寫的細節過程分析

          為了方便大家對通信底層的理解,我花了些時間做了下面這個動畫,它并不能完全覆蓋底層細節的全貌,但是對于理解套接字的工作機制已經足夠了。請讀者仔細觀察這個動畫,后面的講解將圍繞著這個動畫展開。

          我們平時用到的套接字其實只是一個引用(一個對象ID),這個套接字對象實際上是放在操作系統內核中。這個套接字對象內部有兩個重要的緩沖結構,一個是讀緩沖(read buffer),一個是寫緩沖(write buffer),它們都是有限大小的數組結構。

          當我們對客戶端的socket寫入字節數組時(序列化后的請求消息對象req),是將字節數組拷貝到內核區套接字對象的write buffer中,內核網絡模塊會有單獨的線程負責不停地將write buffer的數據拷貝到網卡硬件,網卡硬件再將數據送到網線,經過一些列路由器交換機,最終送達服務器的網卡硬件中。

          同樣,服務器內核的網絡模塊也會有單獨的線程不停地將收到的數據拷貝到套接字的read buffer中等待用戶層來讀取。最終服務器的用戶進程通過socket引用的read方法將read buffer中的數據拷貝到用戶程序內存中進行反序列化成請求對象進行處理。然后服務器將處理后的響應對象走一個相反的流程發送給客戶端,這里就不再具體描述。

          5.1 細節過程:阻塞

          我們注意到write buffer空間都是有限的,所以如果應用程序往套接字里寫的太快,這個空間是會滿的。一旦滿了,寫操作就會阻塞,直到這個空間有足夠的位置騰出來。不過有了NIO(非阻塞IO),寫操作也可以不阻塞,能寫多少是多少,通過返回值來確定到底寫進去多少,那些沒有寫進去的內容用戶程序會緩存起來,后續會繼續重試寫入。

          同樣我們也注意到read buffer的內容可能會是空的。這樣套接字的讀操作(一般是讀一個定長的字節數組)也會阻塞,直到read buffer中有了足夠的內容(填充滿字節數組)才會返回。有了NIO,就可以有多少讀多少,無須阻塞了。讀不夠的,后續會繼續嘗試讀取。

          5.2 細節過程:ack

          那上面這張圖就展現了套接字的全部過程么?顯然不是,數據的確認過程(ack)就完全沒有展現。比如當寫緩沖的內容拷貝到網卡后,是不會立即從寫緩沖中將這些拷貝的內容移除的,而要等待對方的ack過來之后才會移除。如果網絡狀況不好,ack遲遲不過來,寫緩沖很快就會滿的。

          5.3 細節過程:包頭

          細心的同學可能注意到圖中的消息req被拷貝到網卡的時候變成了大寫的REQ,這是為什么呢?因為這兩個東西已經不是完全一樣的了。內核的網絡模塊會將緩沖區的消息進行分塊傳輸,如果緩沖區的內容太大,是會被拆分成多個獨立的小消息包的。并且還要在每個消息包上附加上一些額外的頭信息,比如源網卡地址和目標網卡地址、消息的序號等信息,到了接收端需要對這些消息包進行重新排序組裝去頭后才會扔進讀緩沖中。這些復雜的細節過程就非常難以在動畫上予以呈現了。

          5.4 細節過程:速率

          還有個問題那就是如果讀緩沖滿了怎么辦,網卡收到了對方的消息要怎么處理?一般的做法就是丟棄掉不給對方ack,對方如果發現ack遲遲沒有來,就會重發消息。那緩沖為什么會滿?是因為消息接收方處理的慢而發送方生產的消息太快了,這時候tcp協議就會有個動態窗口調整算法來限制發送方的發送速率,使得收發效率趨于匹配。如果是udp協議的話,消息一丟那就徹底丟了。

          網絡協議內部實現還有更多復雜的細節有待繼續挖掘,留著以后繼續分析吧。

          附錄1:同類文章精選

          如果您覺得本系列文章過于基礎,您可直接閱讀以下系列:

          網絡編程懶人入門(一):快速理解網絡通信協議(上篇)

          網絡編程懶人入門(二):快速理解網絡通信協議(下篇)

          網絡編程懶人入門(三):快速理解TCP協議一篇就夠

          網絡編程懶人入門(四):快速理解TCP和UDP的差異

          網絡編程懶人入門(五):快速理解為什么說UDP有時比TCP更有優勢

          網絡編程懶人入門(六):史上最通俗的集線器、交換機、路由器功能原理入門

          網絡編程懶人入門(七):深入淺出,全面理解HTTP協議

          《不為人知的網絡編程》系列文章為高階必讀,該系列目錄如下:

          不為人知的網絡編程(一):淺析TCP協議中的疑難雜癥(上篇)

          不為人知的網絡編程(二):淺析TCP協議中的疑難雜癥(下篇)

          不為人知的網絡編程(三):關閉TCP連接時為什么會TIME_WAIT、CLOSE_WAIT

          不為人知的網絡編程(四):深入研究分析TCP的異常關閉

          不為人知的網絡編程(五):UDP的連接性和負載均衡

          不為人知的網絡編程(六):深入地理解UDP協議并用好它

          關于移動端網絡特性及優化手段的總結性文章請見:

          現代移動端網絡短連接的優化手段總結:請求速度、弱網適應、安全保障

          移動端IM開發者必讀(一):通俗易懂,理解移動網絡的“弱”和“慢”

          移動端IM開發者必讀(二):史上最全移動弱網絡優化方法總結

          附錄2:參考資料

          TCP/IP詳解 - 第11章·UDP:用戶數據報協議

          TCP/IP詳解 - 第17章·TCP:傳輸控制協議

          TCP/IP詳解 - 第18章·TCP連接的建立與終止

          TCP/IP詳解 - 第21章·TCP的超時與重傳

          通俗易懂-深入理解TCP協議(上):理論基礎

          通俗易懂-深入理解TCP協議(下):RTT、滑動窗口、擁塞處理

          理論經典:TCP協議的3次握手與4次揮手過程詳解

          理論聯系實際:Wireshark抓包分析TCP 3次握手、4次揮手過程

          計算機網絡通訊協議關系圖(中文珍藏版)

          高性能網絡編程(一):單臺服務器并發TCP連接數到底可以有多少

          高性能網絡編程(二):上一個10年,著名的C10K并發連接問題

          高性能網絡編程(三):下一個10年,是時候考慮C10M并發問題了

          高性能網絡編程(四):從C10K到C10M高性能網絡應用的理論探索

          簡述傳輸層協議TCP和UDP的區別

          為什么QQ用的是UDP協議而不是TCP協議?

          移動端即時通訊協議選擇:UDP還是TCP?

          技術往事:改變世界的TCP/IP協議(珍貴多圖、手機慎點)

          UDP中一個包的大小最大能多大?

          Java新一代網絡編程模型AIO原理及Linux系統AIO介紹

          NIO框架入門(一):服務端基于Netty4的UDP雙向通信Demo演示

          NIO框架入門(二):服務端基于MINA2的UDP雙向通信Demo演示

          NIO框架入門(三):iOS與MINA2、Netty4的跨平臺UDP雙向通信實戰

          NIO框架入門(四):Android與MINA2、Netty4的跨平臺UDP雙向通信實戰

          P2P技術詳解(一):NAT詳解——詳細原理、P2P簡介

          P2P技術詳解(二):P2P中的NAT穿越(打洞)方案詳解

          P2P技術詳解(三):P2P技術之STUN、TURN、ICE詳解

          通俗易懂:快速理解P2P技術中的NAT穿透原理

          >> 更多同類文章 ……

          (本文同步發布于:http://www.52im.net/thread-1732-1-1.html

          posted @ 2018-07-05 14:19 Jack Jiang 閱讀(210) | 評論 (0)編輯 收藏

          、引言

          網絡編程中TCP協議的三次握手和四次揮手的問題,在面試中是最為常見的知識點之一。很多讀者都知道“三次”和“四次”,但是如果問深入一點,他們往往都無法作出準確回答。

          本篇文章嘗試使用動畫圖片的方式,來對這個知識點進行“腦殘式”講解(哈哈),期望讀者們可以更加簡單、直觀地理解TCP網絡通信交互的本質。

          另外,社區里的另兩篇文章《理論經典:TCP協議的3次握手與4次揮手過程詳解》、《理論聯系實際:Wireshark抓包分析TCP 3次握手、4次揮手過程》也是不錯的入門文章,有興趣可一并詳讀之。

          友情提示:因本文gif動畫較多,如果您的網速較慢,請耐心等候圖片加載完成哦。

          學習交流:

          - 即時通訊開發交流3群:185926912[推薦]

          - 移動端IM開發入門文章:《新手入門一篇就夠:從零開發移動端IM

          (本文同步發布于:http://www.52im.net/thread-1729-1-1.html

          2、關于作者

          錢文品(老錢):畢業于華中科技大學計算機科學與技術專業,互聯網分布式高并發技術十年老兵,目前任掌閱科技資深后端工程師。熟練使用 Java、Python、Golang 等多種計算機語言,開發過游戲,制作過網站,寫過消息推送系統和MySQL 中間件,實現過開源的 ORM 框架、Web 框架、RPC 框架等。

          作者的Github: https://github.com/pyloque

          3、系列文章

          本文是系列文章中的第1篇,本系列大綱如下:

          腦殘式網絡編程入門(一):跟著動畫來學TCP三次握手和四次揮手》(本文)

          《腦殘式網絡編程入門(二):我們在讀寫Socket時,究竟在讀寫什么?》

          4、TCP 三次握手:“Say hello !”

          TCP 三次握手就好比兩個人在街上隔著50米看見了對方,但是因為霧霾等原因不能100%確認,所以要通過招手的方式相互確定對方是否認識自己。

          張三首先向李四招手(syn),李四看到張三向自己招手后,向對方點了點頭擠出了一個微笑(ack)。張三看到李四微笑后確認了李四成功辨認出了自己(進入estalished狀態)。

          但是李四還有點狐疑,向四周看了一看,有沒有可能張三是在看別人呢,他也需要確認一下。所以李四也向張三招了招手(syn),張三看到李四向自己招手后知道對方是在尋求自己的確認,于是也點了點頭擠出了微笑(ack),李四看到對方的微笑后確認了張三就是在向自己打招呼(進入established狀態)。

          于是兩人加快步伐,走到了一起,相互擁抱。

          我們看到這個過程中一共是四個動作,張三招手--李四點頭微笑--李四招手--張三點頭微笑。其中李四連續進行了2個動作,先是點頭微笑(回復對方),然后再次招手(尋求確認),實際上可以將這兩個動作合一,招手的同時點頭和微笑(syn+ack)。于是四個動作就簡化成了三個動作,張三招手--李四點頭微笑并招手--張三點頭微笑。這就是三次握手的本質,中間的一次動作是兩個動作的合并。

          我們看到有兩個中間狀態,syn_sent和syn_rcvd,這兩個狀態叫著「半打開」狀態,就是向對方招手了,但是還沒來得及看到對方的點頭微笑。syn_sent是主動打開方的「半打開」狀態,syn_rcvd是被動打開方的「半打開」狀態。客戶端是主動打開方,服務器是被動打開方。

          syn_sent: syn package has been sent

          syn_rcvd: syn package has been received

          5、握手完成:開始TCP 數據傳輸

          TCP 數據傳輸就是兩個人隔空對話,差了一點距離,所以需要對方反復確認聽見了自己的話。

          張三喊了一句話(data),李四聽見了之后要向張三回復自己聽見了(ack)。

          如果張三喊了一句,半天沒聽到李四回復,張三就認為自己的話被大風吹走了,李四沒聽見,所以需要重新喊話,這就是tcp重傳。

          也有可能是李四聽到了張三的話,但是李四向張三的回復被大風吹走了,以至于張三沒聽見李四的回復。張三并不能判斷究竟是自己的話被大風吹走了還是李四的回復被大風吹走了,張三也不用管,重傳一下就是。

          既然會重傳,李四就有可能同一句話聽見了兩次,這就是「去重」。「重傳」和「去重」工作操作系統的網絡內核模塊都已經幫我們處理好了,用戶層是不用關心的。

          張三可以向李四喊話,同樣李四也可以向張三喊話,因為tcp鏈接是「雙工的」,雙方都可以主動發起數據傳輸。不過無論是哪方喊話,都需要收到對方的確認才能認為對方收到了自己的喊話。

          張三可能是個高射炮,一說連說了八句話,這時候李四可以不用一句一句回復,而是連續聽了這八句話之后,一起向對方回復說前面你說的八句話我都聽見了,這就是批量ack。但是張三也不能一次性說了太多話,李四的腦子短時間可能無法消化太多,兩人之間需要有協商好的合適的發送和接受速率,這個就是「TCP窗口大小」。

          網絡環境的數據交互同人類之間的對話還要復雜一些,它存在數據包亂序的現象。同一個來源發出來的不同數據包在「網際路由」上可能會走過不同的路徑,最終達到同一個地方時,順序就不一樣了。操作系統的網絡內核模塊會負責對數據包進行排序,到用戶層時順序就已經完全一致了。

          6、TCP 四次揮手:“Say goodbye!”

          TCP斷開鏈接的過程和建立鏈接的過程比較類似,只不過中間的兩部并不總是會合成一步走,所以它分成了4個動作,張三揮手(fin)——李四傷感地微笑(ack)——李四揮手(fin)——張三傷感地微笑(ack)。

          之所以中間的兩個動作沒有合并,是因為tcp存在「半關閉」狀態,也就是單向關閉。張三已經揮了手,可是人還沒有走,只是不再說話,但是耳朵還是可以繼續聽,李四呢繼續喊話。等待李四累了,也不再說話了,超張三揮了揮手,張三傷感地微笑了一下,才徹底結束了。

          上面有一個非常特殊的狀態time_wait,它是主動關閉的一方在回復完對方的揮手后進入的一個長期狀態,這個狀態標準的持續時間是4分鐘,4分鐘后才會進入到closed狀態,釋放套接字資源。不過在具體實現上這個時間是可以調整的。

          它就好比主動分手方要承擔的責任,是你提出的要分手,你得付出代價。這個后果就是持續4分鐘的time_wait狀態,不能釋放套接字資源(端口),就好比守寡期,這段時間內套接字資源(端口)不得回收利用。

          它的作用是重傳最后一個ack報文,確保對方可以收到。因為如果對方沒有收到ack的話,會重傳fin報文,處于time_wait狀態的套接字會立即向對方重發ack報文。

          同時在這段時間內,該鏈接在對話期間于網際路由上產生的殘留報文(因為路徑過于崎嶇,數據報文走的時間太長,重傳的報文都收到了,原始報文還在路上)傳過來時,都會被立即丟棄掉。4分鐘的時間足以使得這些殘留報文徹底消逝。不然當新的端口被重復利用時,這些殘留報文可能會干擾新的鏈接。

          4分鐘就是2個MSL,每個MSL是2分鐘。MSL就是maximium segment lifetime——最長報文壽命。這個時間是由官方RFC協議規定的。至于為什么是2個MSL而不是1個MSL,我還沒有看到一個非常滿意的解釋。

          四次揮手也并不總是四次揮手,中間的兩個動作有時候是可以合并一起進行的,這個時候就成了三次揮手,主動關閉方就會從fin_wait_1狀態直接進入到time_wait狀態,跳過了fin_wait_2狀態。

          7、本文小結

          TCP狀態轉換是一個非常復雜的過程,本文僅對一些簡單的基礎知識點進行了類比講解。關于TCP的更多知識還需要讀者去搜尋相關技術文章進入深入學習。如果讀者對TCP的基礎知識掌握得比較牢固,高級的知識理解起來就不會太過于吃力。

          附錄1:同類文章精選

          如果您覺得本系列文章過于基礎,您可直接閱讀以下系列:

          網絡編程懶人入門(一):快速理解網絡通信協議(上篇)

          網絡編程懶人入門(二):快速理解網絡通信協議(下篇)

          網絡編程懶人入門(三):快速理解TCP協議一篇就夠

          網絡編程懶人入門(四):快速理解TCP和UDP的差異

          網絡編程懶人入門(五):快速理解為什么說UDP有時比TCP更有優勢

          網絡編程懶人入門(六):史上最通俗的集線器、交換機、路由器功能原理入門

          網絡編程懶人入門(七):深入淺出,全面理解HTTP協議

          《不為人知的網絡編程》系列文章為高階必讀,該系列目錄如下:

          不為人知的網絡編程(一):淺析TCP協議中的疑難雜癥(上篇)

          不為人知的網絡編程(二):淺析TCP協議中的疑難雜癥(下篇)

          不為人知的網絡編程(三):關閉TCP連接時為什么會TIME_WAIT、CLOSE_WAIT

          不為人知的網絡編程(四):深入研究分析TCP的異常關閉

          不為人知的網絡編程(五):UDP的連接性和負載均衡

          不為人知的網絡編程(六):深入地理解UDP協議并用好它

          關于移動端網絡特性及優化手段的總結性文章請見:

          現代移動端網絡短連接的優化手段總結:請求速度、弱網適應、安全保障

          移動端IM開發者必讀(一):通俗易懂,理解移動網絡的“弱”和“慢”

          移動端IM開發者必讀(二):史上最全移動弱網絡優化方法總結

          附錄2:參考資料

          TCP/IP詳解 - 第11章·UDP:用戶數據報協議

          TCP/IP詳解 - 第17章·TCP:傳輸控制協議

          TCP/IP詳解 - 第18章·TCP連接的建立與終止

          TCP/IP詳解 - 第21章·TCP的超時與重傳

          通俗易懂-深入理解TCP協議(上):理論基礎

          通俗易懂-深入理解TCP協議(下):RTT、滑動窗口、擁塞處理

          理論經典:TCP協議的3次握手與4次揮手過程詳解

          理論聯系實際:Wireshark抓包分析TCP 3次握手、4次揮手過程

          計算機網絡通訊協議關系圖(中文珍藏版)

          高性能網絡編程(一):單臺服務器并發TCP連接數到底可以有多少

          高性能網絡編程(二):上一個10年,著名的C10K并發連接問題

          高性能網絡編程(三):下一個10年,是時候考慮C10M并發問題了

          高性能網絡編程(四):從C10K到C10M高性能網絡應用的理論探索

          簡述傳輸層協議TCP和UDP的區別

          為什么QQ用的是UDP協議而不是TCP協議?

          移動端即時通訊協議選擇:UDP還是TCP?

          技術往事:改變世界的TCP/IP協議(珍貴多圖、手機慎點)

          UDP中一個包的大小最大能多大?

          Java新一代網絡編程模型AIO原理及Linux系統AIO介紹

          NIO框架入門(一):服務端基于Netty4的UDP雙向通信Demo演示

          NIO框架入門(二):服務端基于MINA2的UDP雙向通信Demo演示

          NIO框架入門(三):iOS與MINA2、Netty4的跨平臺UDP雙向通信實戰

          NIO框架入門(四):Android與MINA2、Netty4的跨平臺UDP雙向通信實戰

          P2P技術詳解(一):NAT詳解——詳細原理、P2P簡介

          P2P技術詳解(二):P2P中的NAT穿越(打洞)方案詳解

          P2P技術詳解(三):P2P技術之STUN、TURN、ICE詳解

          通俗易懂:快速理解P2P技術中的NAT穿透原理

          >> 更多同類文章 ……

          (本文同步發布于:http://www.52im.net/thread-1729-1-1.html

          posted @ 2018-07-04 14:49 Jack Jiang 閱讀(235) | 評論 (0)編輯 收藏

               摘要: 注:本文原題《微信的操作系統之路》,來自2018年6月23日的創投理想國線下嘉賓陸樹燊的分享會總結(原分享四萬余字,本文刪減至六千字精華),發表于陸樹燊的公眾號“行者慎思”。1、引言這些年來,中國互聯網很少有像微信這樣影響巨大的產品。因此,今天我想基于微信發展過程中的關鍵決策,提供一些思考。我會從四個部分分析它:1)用戶在微信發展早期對它的定位:聊天工具;2)本周引發最多討...  閱讀全文

          posted @ 2018-07-02 15:28 Jack Jiang 閱讀(137) | 評論 (0)編輯 收藏

               摘要: 本文原作者:“水晶蝦餃”,原文由“玉剛說”寫作平臺提供寫作贊助,原文版權歸“玉剛說”微信公眾號所有,即時通訊網收錄時有改動。1、引言好多小白初次接觸即時通訊(比如:IM或者消息推送應用)時,總是不能理解Web短連接(就是最常見的HTTP通信了)跟長連接(主要指TCP、UDP協議實現的socket通信,當然HTML5里的Webs...  閱讀全文

          posted @ 2018-06-29 17:19 Jack Jiang 閱讀(1712) | 評論 (0)編輯 收藏

               摘要: 本文原作者阮一峰,作者博客:ruanyifeng.com。1、引言HTTP 協議是最重要的互聯網基礎協議之一,它從最初的僅為瀏覽網頁的目的進化到現在,已經是短連接通信的事實工業標準,最新版本 HTTP/2 更是讓它再次成為技術熱點。作為即時通訊開發者來說,深刻理解HTTP協議有助于在現今復雜移動網絡環境下的優化和最佳實踐的開展,本文將通俗易懂的地介紹 HTTP 協議的歷史演變和設計思路。學習交流:...  閱讀全文

          posted @ 2018-06-27 15:15 Jack Jiang 閱讀(186) | 評論 (0)編輯 收藏

               摘要: 本文由騰訊云技術團隊原創,感謝作者的分享。1、前言微信小程序提供了一套在微信上運行小程序的解決方案,有比較完整的框架、組件以及 API,在這個平臺上面的想象空間很大。騰訊云研究了一番之后,發現微信支持 WebSocket 還是很值得玩味的。這個特性意味著我們可以做一些實時同步或者協作的小程序。這篇文章分享了一個基于WebSocket長連接的微信小程序——簡單的剪刀石頭布小游...  閱讀全文

          posted @ 2018-06-25 15:46 Jack Jiang 閱讀(452) | 評論 (0)編輯 收藏

               摘要: 原作者:阮一峰(ruanyifeng.com),現重新整理發布,感謝原作者的無私分享。1、引言今天中午,我突然想搞清楚 Unicode 和 UTF-8 之間的關系,就開始查資料。這個問題比我想象的復雜,午飯后一直看到晚上9點,才算初步搞清楚。下面就是我的總結,主要用來整理自己的思路。我盡量寫得通俗易懂,希望能對其他朋友有用。畢竟,字符編碼是計算機技術的基石,對于程序員來說尤其重要,字符編碼的知識是...  閱讀全文

          posted @ 2018-06-21 16:32 Jack Jiang 閱讀(898) | 評論 (0)編輯 收藏

               摘要: 本文引用了劉欣的文章,感謝原作者的分享。1、引言Http協議在現今主流的IM系統中擁有無可替代的重要性(在IM系統中用HTTP發起的連接被大家簡稱為http短連接),但Http作為傳統互聯網信息交換技術,一些典型的概念比如:Session、Token,對于新手程序員來說很陌生。很多文章動輒長篇大論、高屋建瓴地從底層協議再到上層分布式應用式的講解,根本不適合傻白甜程序員,本文的寫作目的是以最白話地方...  閱讀全文

          posted @ 2018-06-19 11:27 Jack Jiang 閱讀(659) | 評論 (0)編輯 收藏

               摘要: 本文引用了自簡書作者“滌生_Woo”的文章,內容有刪減,感謝原作者的分享。1、前言HTTP(全稱超文本傳輸協議,英文全稱HyperText Transfer Protocol)是互聯網上應用最為廣泛的一種網絡協議。所有的WWW文件都必須遵守這個標準。設計HTTP最初的目的是為了提供一種發布和接收HTML頁面的方法。對于移動端即時通訊(尤其IM應用)來說,現今主流的數據通信總...  閱讀全文

          posted @ 2018-06-15 17:46 Jack Jiang 閱讀(195) | 評論 (0)編輯 收藏

               摘要: 1、前言在IM這種講究高并發、高消息吞吐的互聯網場景下,MQ消息中間件是個很重要的基礎設施,它在IM系統的服務端架構中擔當消息中轉、消息削峰、消息交換異步化等等角色,當然MQ消息中間件的作用遠不止于此,它的價值不僅僅存在于技術上,更重要的是改變了以往同步處理消息的思路(比如進行IM消息歷史存儲時,傳統的信息系統作法可能是收到一條消息就馬上同步存入數據庫,這種作法在小并發量的情況下可以很好的工作,但...  閱讀全文

          posted @ 2018-06-12 15:13 Jack Jiang 閱讀(1040) | 評論 (0)編輯 收藏

          僅列出標題
          共50頁: First 上一頁 42 43 44 45 46 47 48 49 50 下一頁 
          Jack Jiang的 Mail: jb2011@163.com, 聯系QQ: 413980957, 微信: hellojackjiang
          主站蜘蛛池模板: 怀化市| 天全县| 化隆| 宣汉县| 肇源县| 沙雅县| 龙里县| 林州市| 巴南区| 咸丰县| 漳平市| 玉溪市| 伊川县| 平安县| 宁都县| 三台县| 津南区| 天津市| 明水县| 蒙阴县| 张家港市| 大丰市| 瑞金市| 海盐县| 睢宁县| 忻州市| 庄河市| 尖扎县| 光山县| 博野县| 泽普县| 武定县| 唐河县| 宜兰县| 万载县| 遂溪县| 如皋市| 松原市| 沁源县| 福泉市| 陆川县|