1. 程式人生 > >java: java mina ——基於TCP/IP、UDP/IP協議棧的通訊框架

java: java mina ——基於TCP/IP、UDP/IP協議棧的通訊框架

這裡我們依據傳入的字符集型別對message 物件進行編碼,編碼的方式就是按照簡訊協議拼裝字串到IoBuffer 緩衝區,然後呼叫ProtocolEncoderOutput 的write()方法輸出位元組流。這裡要注意生成簡訊內容長度時的紅色程式碼,我們使用String 類與Byte[]型別之間的轉換方法獲得轉為位元組流後的位元組數。
解碼器的編寫有以下幾個步驟:
A. 將 encode()方法中的message 物件強制轉換為指定的物件型別;
B. 建立IoBuffer 緩衝區物件,並設定為自動擴充套件;
C. 將轉換後的message 物件中的各個部分按照指定的應用層協議進行組裝,並put()到IoBuffer 緩衝區;
D. 當你組裝資料完畢之後,呼叫flip()方法,為輸出做好準備,切記在write()方法之前,要呼叫IoBuffer 的flip()方法,否則緩衝區的position 的後面是沒有資料可以用來輸出的,你必須呼叫flip()方法將position 移至0,limit 移至剛才的position。這個flip()方法的含義請參看java.nio.ByteBuffer。
E. 最後呼叫ProtocolEncoderOutput 的write()方法輸出IoBuffer 緩衝區例項。
第三步,解碼器:

在Mina 中編寫解碼器,可以實現ProtocolDecoder 介面,其中有decode()、finishDecode()、dispose()三個方法。這裡的finishDecode()方法可以用於處理在IoSession 關閉時剩餘的未讀取資料,一般這個方法並不會被使用到,除非協議中未定義任何標識資料什麼時候截止的約定,譬如:Http 響應的Content-Length 未設定,那麼在你認為讀取完資料後,關閉TCP連線(IoSession 的關閉)後,就可以呼叫這個方法處理剩餘的資料,當然你也可以忽略調剩餘的資料。同樣的,一般情況下,我們只需要繼承介面卡ProtocolDecoderAdapter,關注decode()方法即可。但前面說過解碼器相對編碼器來說,最麻煩的是資料傳送過來的規模,以聊天室為例,一個TCP 連線建立之後,那麼隔一段時間就會有聊天內容傳送過來,也就是decode()方法會被往復呼叫,這樣處理起來就會非常麻煩。那麼Mina 中幸好提供了CumulativeProtocolDecoder類,從名字上可以看出累積性的協議解碼器,也就是說只要有資料傳送過來,這個類就會去讀取資料,然後累積到內部的IoBuffer 緩衝區,但是具體的拆包(把累積到緩衝區的資料解碼為JAVA 物件)交由子類的doDecode()方法完成,實際上CumulativeProtocolDecoder就是在decode()反覆的呼叫暴漏給子類實現的doDecode()方法。
具體執行過程如下所示:
A. 你的doDecode()方法返回true 時,CumulativeProtocolDecoder 的decode()方法會首先判斷你是否在doDecode()方法中從內部的IoBuffer 緩衝區讀取了資料,如果沒有,則會丟擲非法的狀態異常,也就是你的doDecode()方法返回true 就表示你已經消費了本次資料(相當於聊天室中一個完整的訊息已經讀取完畢),進一步說,也就是此時你必須已經消費過內部的IoBuffer 緩衝區的資料(哪怕是消費了一個位元組的資料)。如果驗證過通過,那麼CumulativeProtocolDecoder 會檢查緩衝區內是否還有資料未讀取,如果有就繼續呼叫doDecode()方法,沒有就停止對doDecode()方法的呼叫,直到有新的資料被緩衝。

相關推薦

java: java mina ——基於TCP/IPUDP/IP協議通訊框架

這裡我們依據傳入的字符集型別對message 物件進行編碼,編碼的方式就是按照簡訊協議拼裝字串到IoBuffer 緩衝區,然後呼叫ProtocolEncoderOutput 的write()方法輸出位元組流。這裡要注意生成簡訊內容長度時的紅色程式碼,我們使用String 類與Byte[]型別之間的轉換方法獲得

-1-7 java 網路程式設計基本知識點 計算機網路 TCP/IP協議 通訊必備 tcp udp

Socket和ServerSocket 建立客戶端和伺服器端 建立連線後,通過Socket中的IO流進行資料的傳輸 關閉socket 同樣,客戶端與伺服器端是兩個獨立的應用程式。

IPTCP報文UDP數據段格式的匯總

ip包、tcp報文、udp數據段格式的匯總一、IP包格式IP數據包是一種可變長分組,它由首部和數據負載兩部分組成。首部長度一般為20-60字節(Byte),其中後40字節是可選的,長度不固定,前20字節格式為固定。數據負載部分的長度一般可變,整個IP數據包的最大長度為65535B。1、版本號(Version)

HttpTCP/IPUDP 協議

所謂協議就是大家一起遵守的規範格式,不應單獨的去理解一章節的知識點,如把一章一章串成知識流和故事,人習慣和依賴以故事的形式記憶,有人能記住π小數位的幾百位 是因為他把0到9具體化成10個人 串成他們故事流來記的。 網路流由下往上分為: 物理層  資料鏈路層  

OSITCPIPUDP 這些都是啥??

一個大大的問號首先丟擲,計算機之間是如何進行通訊的? 計算機網路是通過傳輸介質、通訊設施和網路通訊協議,把分散在不同地點的計算機裝置互連起來,實現資源共享和資料傳輸的系統。 網路協議就是資料按照一定的規則進行傳輸,為了統一網路傳輸的標準,國際標準化組織定義了 OSI 模型(開放系統互連參考模型)。

Java語言,基於TCP編寫一個簡單的Client/Server 網路應用程式。

要求實現客戶向伺服器傳輸任意一個字串,伺服器將收到的字串變換成大寫後傳回客戶。//客戶端: package tcpClient; import java.io.BufferedReader; import java.io.DataOutputStream; impo

java網路程式設計基於TCP的多客戶端連線伺服器

package com.test.net; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.S

JAVA網路程式設計 ——基於TCP的Socket程式設計(1)——實現伺服器端與客戶端的實時對話

第一篇文章,我先介紹以及記錄一下我所學的知識點。(總結了一下視訊老師講的東西)一,HTTP與Socket1.HTTP:超文字傳輸協議特點:客戶端傳送的請求需要伺服器端每次來響應,在請求結束之後主動釋放連線,從建立連線到關閉連線稱為“一次連線”,所以HTTP是“短連線”。2.S

TCP/IPUDPHTTPSocket 各協議之間的聯絡與區別

網路由下往上分為: 對應 物理層 資料鏈路層 網路層( IP協議) 傳輸層(TCP協議) 會話層 應用層和表示層(HTTP協議) socket則是對TCP/IP協議的封裝和應用(程式設計師層面上)。也可以說,TPC/IP協議是傳輸層協議,主要解決資

協議TCP/IPUDPHTTPsocket)內與外簡述

網路由下往上分為: 對應 物理層 資料鏈路層 網路層( IP協議) 傳輸層(TCP協議) 會話層 應用層和表示層(HTTP協議) socket則是對TCP/IP協議的封裝和應用(程式設計師層面上)。也可以說,TPC/IP協議是傳輸層協議,主要解決資料 如何在網路中傳輸,

網路協議TCP/IPUDP/IP 滑動視窗

TCP TCP/IP(Transmission Control Protocol/Internet Protocol)是一種可靠的網路資料傳輸控制協議。定義了主機如何連入因特網以及資料如何在他們之間傳

JAVA執行緒與執行緒程序與程序間通訊

I.執行緒與執行緒間通訊 一、基本概念以及執行緒與程序之間的區別聯絡: 關於程序和執行緒,首先從定義上理解就有所不同 1、程序是什麼? 是具有一定獨立功能的程式、它是系統進行資源分配和排程的一個獨立單位,重點在系統排程和單獨的單位,也就是說程序是可以獨 立執行的一段程式。

linux下埠掃描的實現(TCP connectTCP SYNTCP FINUDP四種方式)

一、TCP 常用的埠掃描方式有以下三種: 1.connect掃描 我們知道,常見的TCP的socket實現過程為 更本質的連線和結束的過程是如下這個樣子的: 從上面兩個圖我們可以看出來目標主機的一個埠如果是監聽狀態(LISTENING或者LINSTEN),那

【網路協議TCP分段與UDP/IP分片 (MTU最大傳輸單元,MSS最大分段大小)

 我們在學習TCP/IP協議時都知道,TCP報文段如果很長的話,會在傳送時發生分段,在接受時進行重組,同樣IP資料報在長度超過一定值時也會發生分片,在接收端再將分片重組。     我們先來看兩個與TCP報文段分段和IP資料報分片密切相關的概念。     MTU(最大傳

TCP分段與UDP/IP分片 (MTU最大傳輸單元,MSS最大分段大小)

Twisted 基於python開發的跨平臺的網路庫,可以說只要是伺服器涉及到的,都可以用。包含http、ftp、mail、ssh、xmpp、irc也包含了底層的通訊庫,包括twisted.basic中的基於位元組或則基於行的通訊。twisted最大的閃光點在於全面,而

《Linux核心TCP/IP 實現》:協議原始碼分析圖

一.linux核心網路棧程式碼的準備知識 1. linux核心ipv4網路部分分層結構: BSD socket層: 這一部分處理BSD socket相關操作,每個socket在核心中以struct socket結構體現。這一部分的檔案主要有: /net/

企業級高速高匿爬蟲代理IP千萬IP出口池

百變IP快速接入教程百變IP提供多種接入方式和介面;方式一:使用百變IP-Proxy,統一入口,支援擴音取呼叫,設定白名單後即可使用,支援每次請求隨機一個IP出口,或者多次請求使用同一個IP作為出口。通道A:proxy.baibianip.com:8000 每次隨機一個出口I

基於執行緒池和NIO技術構建高效的多協議Android通訊框架

基於執行緒池和NIO技術構建高效的多協議Android通訊框架 作者孫東風 2011-1-20轉載請註明出處 引言 在多數涉及網路通訊的手機應用中,由於GPRS網路的速度在目前的情況下還不算理想,所以,如何能夠高效的請求得到網路資料就成為大多數應用所面臨的瓶頸問題。同時,

-1-7 java 網絡編程基本知識點 計算機網絡 TCP/IP協議 通信必備 tcp udp

kit 外部 block 識別 ESS net 常見 主機 通訊 計算機網絡 是指將地理位置不同的具有獨立功能的多臺計算機及其外部設備,通過通信線路連接起來, 在網絡操作系統,網絡管理軟件及網絡通信協議的管理和協調下,實現資源共享和信息傳遞的計算機系統。 網絡編程

java基礎增強:網絡編程TcpUdp案例

nbsp dwr 輸入 生命 auto 方法 pub ethos gen 一入編程深似海,從此妹子是路人。 1、Udp的客戶端,服務端-----DatagramSocket 通過Udp協議編寫一個群聊室,具體實現代碼如下: package day.by.day.udp.c