vscode通訊協議

2021-10-10 10:10:04 字數 1637 閱讀 3706

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由主機控制...