成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

數(shù)據(jù)幀及消息定界

bang590 / 709人閱讀

摘要:成幀解決接收端如何定位消息的首尾位置的問(wèn)題。無(wú)論信息是編碼成文本多字節(jié)二進(jìn)制數(shù)或是兩者結(jié)合,應(yīng)用程序協(xié)議必須制定消息的接收者如何確定何時(shí)消息已完整接收。發(fā)送者先要確定消息的長(zhǎng)度,將長(zhǎng)度信息寫(xiě)入一個(gè)整數(shù),作為消息的前綴。

framing

成幀(framing):解決接收端如何定位消息的首尾位置的問(wèn)題。

無(wú)論信息是編碼成文本、多字節(jié)二進(jìn)制數(shù)、或是兩者結(jié)合,應(yīng)用程序協(xié)議必須制定消息的接收者如何確定何時(shí)消息已完整接收。

如果是采用DatagramPacket發(fā)送,則沒(méi)有問(wèn)題,因?yàn)樗幸粋€(gè)確定的長(zhǎng)度告訴接收者,讓其知道消息的結(jié)束位置。

如果是通過(guò)TCP傳送,則比較復(fù)雜,因?yàn)門(mén)CP協(xié)議中沒(méi)有邊界的概念。

變長(zhǎng)消息

如果一個(gè)消息中的所有字段都有固定的長(zhǎng)度,同時(shí)每個(gè)消息又是由固定數(shù)量的字段組成的話,消息的長(zhǎng)度就能夠確定,接收者就可以簡(jiǎn)單地講消息長(zhǎng)度對(duì)應(yīng)的字節(jié)數(shù)讀到一個(gè)byte[]緩存區(qū)中。
如果消息的長(zhǎng)度是可變的,則我們無(wú)法事先知道需要讀取多少字節(jié)。

如果接收者試圖從套接字中讀取比消息本身更多的字節(jié),將可能發(fā)生以下兩種情況之一:
1)如果信道中沒(méi)有其他消息,接收者將阻塞等待,同時(shí)無(wú)法處理接收到的消息,如果發(fā)送者也在等待接收端的響應(yīng)信息,則會(huì)造成死鎖
2)如果信道中還有其他消息,則接收者會(huì)將后面消息的一部分甚至全部讀到第一條消息中去,這將產(chǎn)生一些協(xié)議錯(cuò)誤。

消息結(jié)束標(biāo)識(shí)

主要有兩個(gè)技術(shù)使接收者能夠準(zhǔn)確地找到消息的結(jié)束位置:

1)基于定界符(Delimiter-based)

消息的結(jié)束由一個(gè)唯一的標(biāo)記指出,即發(fā)送者在傳輸完數(shù)據(jù)后顯式添加的一個(gè)特殊字符序列。這個(gè)特殊標(biāo)記不能在傳輸?shù)臄?shù)據(jù)中出現(xiàn)。特殊情況是,可以用在TCP連接上傳輸?shù)淖詈笠粋€(gè)消息上,發(fā)送完這個(gè)消息后,發(fā)送者就簡(jiǎn)單地關(guān)閉發(fā)送端的TCP連接,接收者讀取完這條消息的最后一個(gè)字節(jié)后,將接收到熬一個(gè)流結(jié)束標(biāo)記,即read返回-1,該標(biāo)記指出已經(jīng)讀取到達(dá)了消息的末尾。
通常用在以文本方式編碼的消息中,定義一個(gè)特殊的字符或字符串來(lái)標(biāo)識(shí)消息的結(jié)束。

 public byte[] nextMsg() throws IOException {
        ByteArrayOutputStream messageBuffer = new ByteArrayOutputStream();
        int nextByte;
        // fetch bytes until find delimiter
        while ((nextByte = in.read()) != DELIMITER) {
            if (nextByte == -1) { // end of stream?
                if (messageBuffer.size() == 0) { // if no byte read
                    return null;
                } else { // if bytes followed by end of stream: framing error
                    throw new EOFException("Non-empty message without delimiter");
                }
            }
            messageBuffer.write(nextByte); // write byte to buffer
        }
        return messageBuffer.toByteArray();
    }
2)顯示長(zhǎng)度(Explicit length)

在變長(zhǎng)字段或消息前附加一個(gè)固定大小的字段,用來(lái)指定字段或消息中包含了多少字節(jié)。發(fā)送者先要確定消息的長(zhǎng)度,將長(zhǎng)度信息寫(xiě)入一個(gè)整數(shù),作為消息的前綴。消息的長(zhǎng)度上限定義了用來(lái)編碼消息長(zhǎng)度所需要的字節(jié)數(shù),如果消息的長(zhǎng)度小于256字節(jié),則需要1個(gè)字節(jié),如果消息的長(zhǎng)度小于65536字節(jié),則需要2個(gè)字節(jié)。

public byte[] nextMsg() throws IOException {
        int length;
        try {
            length = in.readUnsignedShort(); // read 2 bytes
        } catch (EOFException e) { // no (or 1 byte) message
            return null;
        }
        // 0 <= length <= 65535
        byte[] msg = new byte[length];
        in.readFully(msg); // if exception, it"s a framing error.
        return msg;
    }

readFully方法將阻塞等待,直到給定的數(shù)組完全填滿(mǎn)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65916.html

相關(guān)文章

  • 基于 Netty 的可插拔業(yè)務(wù)通信協(xié)議的實(shí)現(xiàn)「1」協(xié)議描述及基本消息對(duì)象設(shè)計(jì)

    摘要:基本消息對(duì)象的設(shè)計(jì)消息對(duì)象的設(shè)計(jì)主要由兩部分組成特定數(shù)據(jù)幀對(duì)應(yīng)的特定消息對(duì)象。該類(lèi)包含上節(jié)數(shù)據(jù)幀主幀及子幀的所有公共信息,僅僅未包含子幀中的數(shù)據(jù)體信息,該需求由基本消息對(duì)象的子類(lèi)實(shí)現(xiàn)。 開(kāi)發(fā)工程中,有一個(gè)常見(jiàn)的需求:服務(wù)端程序和多個(gè)客戶(hù)端程序通過(guò) TCP 協(xié)議進(jìn)行通信,通信雙方需通信的消息種類(lèi)眾多,并且客戶(hù)端的數(shù)量可能有數(shù)萬(wàn)個(gè)。為此,雙方需要約定盡可能豐富、靈活的數(shù)據(jù)幀「數(shù)據(jù)包」協(xié)議,...

    Barry_Ng 評(píng)論0 收藏0
  • PHP基礎(chǔ)系列之正則表達(dá)式(一)

    摘要:正則表達(dá)式作為一個(gè)匹配的模板,是由定界符,原子普通字符,例如有特殊功能的字符稱(chēng)為元字符,例如等以及模式修正符等部分組成的文字模式。正則表達(dá)式中可以使用編碼。限定符限定符用來(lái)指定正則表達(dá)式的一個(gè)給定原子必須要出現(xiàn)多少次才能滿(mǎn)足匹配。 正則表達(dá)式的定義 正則表達(dá)式就是描述字符排列模式的一種自定義的語(yǔ)法規(guī)則。由于正則表達(dá)式本身具有一套非常完整的、可以編寫(xiě)模式的語(yǔ)法體系,提供了一種靈活且直觀的...

    Anchorer 評(píng)論0 收藏0
  • 《Java編程思想》筆記13.字符串

    摘要:的構(gòu)造器經(jīng)過(guò)重載可以接受多種輸出目的地,不過(guò)最常用的還是和。組號(hào)為表示整個(gè)表達(dá)式,組號(hào)表示被第一對(duì)括號(hào)括起的組,依此類(lèi)推。有多個(gè)重載的構(gòu)造器,可以接受和對(duì)象。 點(diǎn)擊進(jìn)入我的博客 字符串操作是計(jì)算機(jī)程序設(shè)計(jì)中最常見(jiàn)的行為 13.1 不可變String String底層是由char[]實(shí)現(xiàn)的,是不可變的。看起來(lái)會(huì)改變String的方法,實(shí)際上都是創(chuàng)建了一個(gè)新的String對(duì)象,任何指向它...

    since1986 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<