關於二進位制資訊的收發

2021-10-23 02:41:11 字數 4125 閱讀 9431

,那在「短連線」模式下就涉及到了一種「二進位制」資訊的收發。今天就來詳細學習一下有關二進位制資訊收發的內部原理。

在以前的cs網路工作模式下,我們學過乙個communication類,是將底層資訊的收發工作分離處理,做到職責單一,功能簡單的原則,收發的資訊只涉及到了有關字串資訊,包括了commond(計算機的命令),action(有關使用者的操作),以及parameter(相關引數)。現在我們所要說的「短連線」模式下,也可以繼續將資訊的傳遞工作單立出來,對於cs模式中提到的資訊的前兩項commond和action依舊採用字串傳遞方式,但是將parameter根據二進位制形式傳輸,這就是今天要說到的重點。

parameter本身有兩大類:字串和二進位制。

不管是哪一類進行傳輸,實際上傳輸時都是要按照二進位制的形式來完成。如果資訊是按照字串形式傳送,一般情況下,字串轉換成二進位制相對於二進位制轉成字串是比較簡單的,所以我們需要把字串資訊轉換成二進位制形式,如果資訊本身就是二進位制形式,則不需要轉換。這樣做的目的是,統一形式,簡化傳輸內容的型別。

在上面提到的成員基礎上,我們需要再增加兩個成員——type和len,type是指要傳輸內容的型別,有兩種情況str(字串)以及二進位制(bin),len代表的是二進位制資訊的位元組數長度。要明確資訊型別是一定的,那麼增加len成員的原因是,和字串資訊的收發採用readutf()和writeutf()不同,二進位制資訊的收發是通過read()和write()來完成的,而read()必須要知道位元組長度,這是傳遞二進位制資訊的必然條件

二進位制資訊在傳輸的時候遵循的是先聽後發,邊聽邊發,衝突停止,隨機延時,繼續傳送的原則

public

class

netmessage

enetcommend getcommand()

netmessage setcommand

(enetcommend command)

string getaction()

netmessage setaction

(string action)

intgettype()

netmessage settype

(int type)

byte

getbinpara()

netmessage setbinpara

(byte

binpara)

else

return

this;}

string getstrpara()

netmessage setstrpara

(string strpara)

intgetlen()

@override

public string tostring()

}if(binpara == null)

len = binpara.length;

res.

(command.

name()

).(".").

(action == null ?

"": action).(

".")

.(type).(

".")

.(len)

;return res.

tostring()

;}//下面給出了netmessage資訊的反向解析

//根據點號的分割將string型別的資訊還原成netmessage型別

netmessage

(string message)

}

從**角度來看,網路傳輸的三要素是socket,datainputstream,dataouputstream,為了方便起見,可以把這三部分內容寫到乙個專門的封裝起來,以後使用的時候可以直接通過這個類的物件來得到,如下所示:

public

class

netconnection

netconnection

(socket socket, datainputstream dis, dataoutputstream dos)

socket getsocket()

void

setsocket

(socket socket)

datainputstream getdis()

void

setdis

(datainputstream dis)

dataoutputstream getdos()

void

setdos

(dataoutputstream dos)

}

tcp資料報報文的內容是包括報文頭部和報文實體兩部分,實際上報文傳輸是一次性傳遞頭部和實體(二進位制資訊),再由交換機內部進行分割,但是現在我們為了方便理解,假設把報文頭部先進性傳送,頭部包含了四部分內容commond,action,tyoe和len,然後再傳送二進位制資訊。自然而然,接受的時候也是先接收資訊頭部,再繼續接收二進位制資訊,接收二進位制資訊同樣需要知道自己長度。從**角度解釋:

資訊的收發必然存在基本的兩部分(收和發),先說傳送訊息

訊息的傳送分為了兩部分,頭部資訊和實體資訊(二進位制資訊),訊息的傳送有可能會出現異常,一旦傳送訊息失敗,則顯示對端異常

void

send

(netmessage netmessage)

dataoutputstream dos = connection.

getdos()

;try

catch

(ioexception e)

}

下面是有關二進位制資訊傳送的**:

public

static

final

int buffer_size =

1<<

15;

private

void

sendbinpara

(dataoutputstream dos,

byte

para,

int length)

throws ioexception

}

再說接收訊息:類似於訊息的傳送,也是分為兩部分,先接收頭部資訊,再接受二進位制資訊;

netmessage receive()

datainputstream dis = connection.

getdis()

; netmessage netmessage = null;

trycatch

(ioexception e)

return netmessage;

}

下面是有關二進位制資訊接受的**,由於和傳送的**類似就不再詳細解釋了;

public

static

final

int buffer_size =

1<<

15;

private

byte

receivebinpara

(datainputstream dis,

int length)

throws ioexception

return para;

}

再來說這個具體的二進位制資訊的接收過程,為了方便描述,我們用圖示方式來進行;

上面**中提到的「buffer_size」需要說明一下;

tcp資料報的報文頭部有乙個表示長度的量是2b,即16bit,那麼乙個tcp資料報報文的最大長度是2^16b,即64kb,但是還要除去報文頭部的長度,所以報文實際的長度是小於64kb的,對於那些大於64kb的大報文會被交換機自動切割成小於64kb的小報文片段,這是由tcp協議自動完成的。在網路資料傳輸時,最好以32kb作為每一次傳輸的資料量(數值上是32*1024,又考慮到計算機對於乘法的運算速度很慢,所以我們最好是寫成位運算的形式,也就是1<<15)。

關於二進位制

二進位制是計算技術中廣泛採用的一種數制。二進位制數 據是用0和1兩個數碼來表示的數。它的基數為2,進製規則是 逢二進一 借位規則是 借一當二 由18世紀德國數理哲學大師萊布尼茲發現。當前的計算機 系統使用的基本上是二進位制系統。二進位制中的單位 1byte 位元組 8 bits 位 1kb 千位元組...

關於二進位制

最高位1表示負,0表示正,負數只需要把其正數的二進位制最高位寫1就行了 在計算機中,負數的二進位制是用正數的二進位制的補碼表示。8在計算機中表示為二進位制的1000,那麼 8怎麼表示呢?可以將乙個二進位制位 bit 專門規定為符號位,它等於0時就表示正數,等於1時就表示負數 比如,在8位機中,第一步...

二進位制資訊表示

就是普通 的乙個整數 可能為負數 這個整數占用4個位元組空間 如何儲存到char型別的字元型陣列裡面,再按照單個位元組讀取的形式,在電腦本地,將資料讀取出來。比較簡單粗暴的方法 1.迴圈讀取,每次把整數的最小8位存進去,然後右移8位。比較直接的方法就是 char chrarr 10 int intv...