socket網絡編程-中級篇

    1.瞭解netty的初步
    2. Example
    3. Netty核心技術(TCP拆包和粘包問題)
    4. Netty核心技術(編解碼技術)
    5. Netty的UDP實現
    6. Netty的websocket實現
    *********************************************************************************************************************
    1.1 netty爲什麼選擇netty
    問題:
    現如今我們使用通用的應用程序或者類庫來實現系統之間地互相訪問,比如我們經常使用一個HTTP客戶端來從web服務器上獲取信息,或者通過web service來執行一個遠程的調用。
    然而,有時候一個通用的協議和他的實現並沒有覆蓋一些場景。比如我們無法使用一個通用的HTTP服務器來處理大文件、電子郵件、近實時消息比如財務信息和多人遊戲數據。我們需要一個合適的協議來處理一些特殊的場景。例如你可以實現一個優化的Ajax的聊天應用、媒體流傳輸或者是大文件傳輸的HTTP服務器,你甚至可以自己設計和實現一個新的協議來準確地實現你的需求。
    另外不可避免的事情是你不得不處理這些私有協議來確保和原有系統的互通。
    簡單
    1.2 netty簡介
    netty是基於Java NIO的網絡應用框架
    netty是一個NIO client-server(客戶端服務器)服務器框架,使用netty可以快速開發網絡應用。例如服務器和客戶端協議。netty提供了一種新的方式來開發網絡應用。這種方式使得它很容易和很強的擴展性。netty內部實現很複雜。但是它提供了簡單易用的API對業務進行解耦。Netty是完全基於NIO實現的,所以整個netty都是異步的。網絡應用程序通常需要有較高的擴展性,無論是netty還是其他基於java NIO的框架,都會提供可擴展性的解決方案。netty中一個關鍵組成部分是它的異步特性。
    架構組成:

    特性:

    1.2 hello world
    Netty 實現通信的步驟:
    1 創建兩個NIO線程組,一個專門用於網絡事件處理(接受客戶端連接),另一個則進行網絡通信讀寫
    2 創建一個ServerBootstrap對象,配置Netty的一系列參數,例如接受傳出數據的緩存大小等等。
    3 創建一個實際處理數據的類ChannelInitializer,進行初始化的準備工作,比如設置接受傳出數據的字符集、格式、已經實際處理數據的接口。
    4 綁定端口,執行同步阻塞方法等待服務器端啓動即可。
    1.3 Netty核心技術(TCP拆包和粘包問題)
    熟悉TCP編程的可能都知道,無論是服務器還是客戶端,當我們讀取或者發送數據的時候,都需要考慮TCP底層的粘包/拆包機制。
    TCP是一個“流”的協議,所謂流就是沒有界限的遺傳數據。大家可以想象下如果河裏的就好比數據,他們連成一片,沒有分界線,TCP並不瞭解上層業務數據的具體含義,它會根據TCP緩衝區的實際情況進行包的劃分,也就是說,在業務上,我們一個完整的包會被TCP分成多個包進行發送、也可能把多個小包合併封裝成一個大的數據包發送出去,這就是所謂的TCP拆包和粘包問題.
    TCP拆包和粘包產生的原因:
    1.應用程序wirte寫入的字節大小大於套接口緩衝區的大小
    2.進行MSS大小的TCP分段
    3 以太網幀的payload大於MTU進行IP分片
    如何解決:
    case1: 消息定長,例如每個報文的大小固定爲200個字符,如果不夠,空位補空格。
    對應類:FixedLengthFrameDecoder
    修改客戶端代碼:

    case2: 在包尾增加特殊字符進分割,例如加回車等。
    對應類:DelimiterBaseFrameDecoder
    以$_結尾
    修改客戶端代碼:

    case3: 將消息分爲消息頭和消息體,在消息頭中包含表示消息總長度的字段,然後進行業務邏輯的處理。 
    網上查
    1.4 netty編解碼技術
    編解碼技術,說白了就是java的序列化技術,序列化的目的就兩個:一是進行網絡傳輸,而是對象持久化。
    雖然我們可以使用java的對象序列化,netty去傳輸,但是java序列化的硬傷太多。比如java序列化無法跨語言、序列化後碼流太大、序列化性能太低等。
    主流序列化框架:
      ● JBoss的Marshailing包
      ● google的Protobuf
      ● 基於Protobuf的Kyro
      ● MessagePack框架
    exmaple:JBoss Marshailing
    JBoss Marshailing是一個java對象序列化包,對JDK默認的序列化框架進行了優化,但又保持跟java.io.Serializeable接口的兼容,同時增加一些可謂的參數和附加特性。
    與netty結合非常簡單。
    操作系統兼容的斜槓:File.separatorChar
    1.5 udp
    略,一個客戶端發起,整個網段都能收到數據報。
    TCP(Transmission Control Protocol 傳輸控制協議)是一種面向連接的、可靠的、基於字節流的傳輸層通信協議.
    UDP 是User Datagram Protocol的簡稱, 中文名是用戶數據報協議,是OSI(Open System Interconnection,開放式系統互聯) 參考模型中一種無連接的傳輸層協議.,提供面向事物的簡單不可靠信息傳送服務。
    UDP協議全稱是用戶數據協議,在網絡中它與TCP一樣處理數據包,是一種無連接的協議。OSI模型中第四層-傳輸層。處於IP協議的上一層。UDP有不提供數據包分組,組裝和 不能對數據進行包進行排序的缺點,也就是說,當報文發送之後,是無法得知是否安全完整到達的。
    場景:
    udp用來支持那些需要在計算機之間傳輸數據的網絡應用,包括網絡視頻會議系統....
    1.6 websocket
    websocket將網絡套接字引入到了客戶端和服務端,衆所周知,我們之前實現聊天功能,可能需要古老的Socket技術。或者用DWR(Direct Web Remoting))框架、反向ajax技術,再有可能用Comet服務器推送技術,今天我們的H5的websocket可以輕鬆的實現聊天功能,netty封裝了其協議。
    ws特點:
      ● 單一的TCP連接,雙向可通信。
      ● 對代理器、防火牆和路由器透明
      ● 無頭部信息、Cookie和認證
      ● 無安全開哨
      ● 通過ping/pongz幀保持鏈路激活
      ● 服務器可主動傳遞消息給客戶端,不再需要客戶端輪詢
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章