,那在「短連線」模式下就涉及到了一種「二進位制」資訊的收發。今天就來詳細學習一下有關二進位制資訊收發的內部原理。
在以前的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...