【go語言】跨語言進行TCP網絡數(shù)據(jù)傳輸

1.背景

在一個微服務盛行,http2.0即將普及佑笋,各種序列化工具(Apache Thrift、google protocol buffers澳化、Apache avro以及新一代 google flatbuffers)成熟無比的背景下持寄,還要自己定義TCP的數(shù)據(jù)包二進制協(xié)議源梭?真讓人有點不爽。

不過當運行的cliet跑在芯片上面稍味,做嵌入式開發(fā)的同學又更關注代碼以及庫的大小废麻,那就是另一回事了。為了配合模庐,不得不又重新?lián)炱鹬暗闹R烛愧,再弄一遍,因此go語言與c++之前進行TCP網絡數(shù)據(jù)傳輸?shù)奈恼戮陀纱苏Q生掂碱。

這里測試的協(xié)議如下:

|uint8 | uint8 | uint16 | uint8 | uint32 | float64 | float32 | uint8[10] | string

前面3個字段分別表示:| head(固定識別頭) | ?type(當前數(shù)據(jù)包類型) | data length(后續(xù)數(shù)據(jù)長度) |?

然后就是對應的測試數(shù)據(jù)類型怜姿。

2.go語言之間通信

如果是單純的go語言之間通信,可以采用go自身的數(shù)據(jù)編解碼包:encoding/gob; 由于這里演示的是跨語言疼燥,所以我們都按照二進制的數(shù)據(jù)格式來進行描述吧沧卢。查看go語言的編解碼包,可以看到一下list:

ascii85Package ascii85 implements the ascii85 data encoding as used in the btoa tool and Adobe's PostScript and PDF document formats.

asn1Package asn1 implements parsing of DER-encoded ASN.1 data structures, as defined in ITU-T Rec X.690.

base32Package base32 implements base32 encoding as specified by RFC 4648.

base64Package base64 implements base64 encoding as specified by RFC 4648.

binaryPackage binary implements simple translation between numbers and byte sequences and encoding and decoding of varints.

csvPackage csv reads and writes comma-separated values (CSV) files.

gobPackage gob manages streams of gobs - binary values exchanged between an Encoder (transmitter) and a Decoder (receiver).

hexPackage hex implements hexadecimal encoding and decoding.

jsonPackage json implements encoding and decoding of JSON as defined in RFC 4627.

pemPackage pem implements the PEM data encoding, which originated in Privacy Enhanced Mail.

xmlPackage xml implements a simple XML 1.0 parser that understands XML name spaces.

這里需要用到的是encoding/binary這個package醉者。

2.1 client.go代碼

initData函數(shù)根據(jù)協(xié)議的順序但狭,把對應的數(shù)據(jù)寫入Buffer中,生成網絡字節(jié) []byte數(shù)組撬即,然后建立tcp連接立磁,發(fā)送給server,最后接收server返回的數(shù)據(jù)搞莺。

client.go

2.2 server.go代碼

同理息罗,server端也根據(jù)定義的協(xié)議順序來讀取數(shù)據(jù)。

server read data from client

首先讀取head才沧,然后是type迈喉,接著讀取2個BYTE的len,然后根據(jù)len讀取剩下的數(shù)據(jù)温圆。至于解包挨摸,go語言可以有兩種方式,一種是一個字段一個字段的讀人昵浮得运; 另外一種是定義一個結構體膝蜈,通過binary.read 函數(shù)自動讀取。但是這里需要注意的是熔掺,第二種方式饱搏,不能讀取動態(tài)大小的數(shù)據(jù),例如string置逻;所以這里額外進行讀取推沸。


不同的讀取方式

2.3 測試結果

分別運行client 和 server,得到如下測試結果券坞。

3.go語言與C++通信

go語言直接OK了鬓催,我們來看一下c++和go語言之間的通信。

c++這里就沒有自己寫了恨锚,找了一個example宇驾,對client進行修改,改為我們自已的協(xié)議猴伶。


c++ client發(fā)送數(shù)據(jù)包

OK课舍,啟動go語言 server 和 c++的cliet,進行測試蜗顽,測試結果如下:


c++ client 和 go server 的測試結果

至此布卡,整個測試就完成了。


第一次使用簡書寫東西雇盖,順便吐個槽忿等,沒有貼代碼的地方啊。崔挖。贸街。啊。狸相。啊薛匪。

完整代碼,參見這里脓鹃。


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末逸尖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瘸右,更是在濱河造成了極大的恐慌娇跟,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件太颤,死亡現(xiàn)場離奇詭異苞俘,居然都是意外死亡,警方通過查閱死者的電腦和手機龄章,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門吃谣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乞封,“玉大人,你說我怎么就攤上這事岗憋∷嗤恚” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵仔戈,是天一觀的道長陷揪。 經常有香客問我,道長杂穷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任卦绣,我火速辦了婚禮耐量,結果婚禮上,老公的妹妹穿的比我還像新娘滤港。我一直安慰自己廊蜒,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布溅漾。 她就那樣靜靜地躺著山叮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪添履。 梳的紋絲不亂的頭發(fā)上屁倔,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音暮胧,去河邊找鬼锐借。 笑死,一個胖子當著我的面吹牛往衷,可吹牛的內容都是我干的钞翔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼席舍,長吁一口氣:“原來是場噩夢啊……” “哼布轿!你這毒婦竟也來了?” 一聲冷哼從身側響起来颤,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤汰扭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后脚曾,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體东且,經...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年本讥,在試婚紗的時候發(fā)現(xiàn)自己被綠了珊泳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鲁冯。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖色查,靈堂內的尸體忽然破棺而出薯演,到底是詐尸還是另有隱情,我是刑警寧澤秧了,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布跨扮,位于F島的核電站,受9級特大地震影響验毡,放射性物質發(fā)生泄漏衡创。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一晶通、第九天 我趴在偏房一處隱蔽的房頂上張望璃氢。 院中可真熱鬧,春花似錦狮辽、人聲如沸一也。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽椰苟。三九已至,卻和暖如春树叽,著一層夾襖步出監(jiān)牢的瞬間舆蝴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工菱皆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留须误,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓仇轻,卻偏偏與公主長得像京痢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子篷店,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理祭椰,服務發(fā)現(xiàn),斷路器疲陕,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • Astronomygonova - A wrapper for libnova -- Celestial Mech...
    JumboWu閱讀 8,654評論 0 41
  • 1. Java基礎部分 基礎部分的順序:基本語法方淤,類相關的語法,內部類的語法蹄殃,繼承相關的語法携茂,異常的語法,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • 我發(fā)現(xiàn)了一個最好用的秘密武器:禱告诅岩。祈禱并不是宗教性的讳苦,你并不需要有任何的宗教信仰带膜,或是針對特定的神靈祈禱。祈禱鸳谜,...
    這位同學愛十一閱讀 275評論 0 1
  • 房管局辦事,門庭若市蝗肪,前來過戶登記的人聒噪不停袜爪,辦事近兩個小時,腦袋像炸了一樣薛闪,很理解為何辦事人員態(tài)度不好饿敲。 為我...
    溪南客閱讀 551評論 3 4