国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

用Java的New IO開發網絡協議

2019-11-18 15:45:59
字體:
來源:轉載
供稿:網友

  最近用java的New IO開發了一套簡單的網絡協議,在這里我把開發中的一些心得整理一下,總結出一套簡單的可以重用的網絡協議開發框架,希望能夠給初學者一點幫助。

  網絡協議基本的通訊單位是一個一個的消息包。在用socket傳輸這些包的時,首先要解決的一個問題是如何解決包與包之間的邊界問題。socket傳輸的是流,一個send中發出的消息,在對方不一定在一個recv中收到,可能要多次recv,或者一個recv收到多個send中放出的包。所以必須由應用層協議自己來解決包的定界問題。通常有兩種方法,一種是每個包以一個非凡的字符或者字符串來結束,如http協議就是以兩個'/n'作為一個消息的結束標記;另一種方法就是,所有的消息都有一個固定長度的消息頭,在消息頭中指出這條消息的長度。我們的協議是采用第二種方法,這也是大部分協議采用的方法。本文提出的框架也是解決這種協議方式的。

  Java的New IO是在J2SE1.4引入的,主要引入了Buffer這樣的概念,發送接受數據都是在Buffer上進行,而對于初學者,Buffer的操作是比較復雜的,輕易出錯。所以在這個框架中盡可能的把對于Buffer的操作封裝起來。

  框架主要有MessageHeader, Message, MessageFactory三個接口,兩個類MessageChannel, BufferUtil,以及一個異常類MessageFormatException構成。下面說明這幾個接口和類的功能。

  1. MessageHeader接口

  在這樣一套網絡協議中,總是有一個固定長度的消息頭,不同的協議有不同的消息頭,但是幾乎所有的消息頭都定義了本消息的長度和本消息的類型。類型用于識別不同的消息包。類型相同的包,格式都是一樣的,可以用同一個Java的class來表達。類型不同的包,格式可能相同也可能不同,依靠于協議。接口定義如下:

public interface MessageHeader {
/**
* 返回消息類型
*/
int getMessageType();

/**
* 返回消息長度
*/
int getMessageLength();

/**
* 從Buffer中提取消息頭
*/
void buildFromBuffer(ByteBuffer buffer);

/**
* 把消息頭放到Buffer中
*/
void appendToBuffer(ByteBuffer buffer);

}
  2. Message接口

  Message代表一個消息包。每個消息包有一個消息頭。其定義如下:

public interface Message {
/**
* 設置消息頭,在MessageChannel.receive中調用
*/
void setHeader(MessageHeader header);

/**
* 返回消息頭
*/
MessageHeader getHeader();

/**
* 從Buffer中取出消息體
*/
void buildBodyFromBuffer(ByteBuffer buffer);

/**
* 把消息體放到Buffer中
*/
void appendBodyToBuffer(ByteBuffer buffer);
}

  3. MessageFactory接口

  這個接口封裝了所有真正的用于表達消息的類的創建,在MessageChannel的receive中調用。這里用了抽象工廠模式。其定義如下:

public interface MessageFactory {
/**
* 返回消息頭的字節數
*/
int getMessageHeaderLength();

/**
* 創建一個消息頭對象
*/
MessageHeader createMessageHeader();

/**
* 創建一個消息對象
* @param type 消息類型,從消息頭中取得
*/
Message createMessage(int type);
}
  4. MessageChannel類

  主要功能都在這個類中,用于發送和接收消息,并封裝了所有對于Buffer的操作。

class MessageChannel {
/**
* 構造方法,要求指明發送緩沖區和接收緩沖區的大小
*/
public MessageChannel(int receiveBufferSize,
int sendBufferSize,
SocketChannel sc,
MessageFactory mf);
/**
* 接收一條消息,當消息不完整、收到的消息長度太大(超過接收緩沖區大小)或者不能通過MessageFactory創建的消息類型時時拋出MessageFormatException。
*/
public Message receive() throws IOException, MessageFormatException;

/**
* 發送一條消息
*/
public void send(Message message) throws IOException;

}
  5. BufferUtil類

  這是一個Utility類,主要功能是從ByteBuffer中取得或者放入一個字符串String,不同的協議有不同的字符串處理方法。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 肃北| 友谊县| 湖北省| 安阳县| 德昌县| 宁乡县| 勃利县| 吉安市| 左贡县| 安吉县| 克拉玛依市| 巴东县| 惠水县| 贵溪市| 阜城县| 台前县| 敦煌市| 吴川市| 丹凤县| 长丰县| 隆林| 乌兰察布市| 天镇县| 玉田县| 镇宁| 沂南县| 怀来县| 团风县| 翁牛特旗| 浪卡子县| 祁阳县| 洛南县| 淮滨县| 太白县| 垣曲县| 临泉县| 新建县| 廊坊市| 高密市| 汽车| 林州市|