vscode渲染程序與外掛程式是執行在不同的程序中的,為了能訪問外掛程式的功能,兩者之間必須建立通訊通道。
vscode使用的是socket進行程序間的通訊,因為是在本地程序間通訊,而且tcp/ip協議棧更複雜,為了提高效率,使用了檔案協議的socket。windows上採用命名管道,類unix系統上採用unix 域。
由於socket是面向位元組流的,需要定義應用層協議,來使雙方識別通訊報文。
一般通訊協議會規定以下兩種結構:
報文的開始與結束標識,如果報文body出現了相同的標識是需要做轉義的。
定義開始與結束標識,主要是為了容錯。出現畸形報文後,通過開始與結束標識,後續可以繼續識別正常的報文。
報文結構,即一幀報文各個位元組代表的意義,一般報文分為報文頭,與報文體。
報文頭定義處理協議時需要的引數,比如報文體的長度,協議版本。以ip協議為例,ip協議的報文頭中包含源、宿端位址,因為處理ip報文的時候需要這兩個引數,用於報文的**。
報文體就是有效資料。如果上面還有協議則為上層協議處理後的資料,如果上層沒有協議則直接為程式中傳送的資料。
定義好報文結構後,協議處理程式,就可以將一幀報文的位元組資料,轉成應用能夠識別的資料。
vscode設計的通訊協議,只定義了報文結構,未使用開始與結束標識。
報文開始與結束標識一般出現在比較底層的協議層中,主要是為了容錯,防止畸形報文,打亂了後面所有的報文的解析。vscode直接基於socket進行通訊,而且是單機內通訊,不需要做這種多餘的防護。
//接受訊息
_socket.on(
'data'
,(data: buffer)
=>
else}if
(!state.readhead)
this
._onmessage.
fire
(message)
;const rest = all.
slice
(state.bodylen)
; totallength = rest.length;
chunks =
[rest]
; state.bodyisjson =
false
; state.bodylen =-1
; state.readhead =
true;}
else}}
});}
//傳送資料
public
send
(message: any)
:void
const data = buffer.
from
(message)
; header.
writeint32be
(data.length,1)
;//傳送訊息
this
._writesoon
(header, data)
;}
通訊協議 UDP通訊
通訊協議 通訊協議是udp tcp通訊的基礎,沒有通訊協議的 通訊 是沒有任何意義上的,通訊協議不是底層函式或者高深的原理,而是程式設計師之間的一種文字約定。資料在網路上是以位元組的形式傳送的 底層是01碼 我們在讀取到資料之後,該以怎樣的方式對它進行解碼呢?這就是我們在通訊之前需要制定的通訊協議。...
串列埠通訊 通訊協議
我們的串列埠程式,除了通用的,進行串列埠監聽收發的簡單工具,大多都和下位機有關,這就需要關心我們的通訊協議如何快取,分析,以及通知介面。所謂通訊協議是指通訊雙方的一種約定。約定包括對資料格式 同步方式 傳送速度 傳送步驟 檢糾錯方式以及控制字元定義等問題做出統一規定,通訊雙方必須共同遵守。因此,也叫...
通訊協議 IIC通訊
iic匯流排是由資料線sda和時鐘線scl構成的序列匯流排,可傳送和接收資料。在匯流排上一般有幾個主機 也可以多個 和多個從機。從機一般不主動傳送資料,主機傳送資料,資料報中包含有從機位址,主機通過從機位址對從機進行操作。1.空閒狀態 時鐘線和資料線都為高電平 稱為釋放匯流排 時鐘線scl由主機控制...