支持多協(xié)議還有其他的方法,比如通過(guò)協(xié)議自身的特點(diǎn)區(qū)分當(dāng)前是哪種協(xié)議,然后分別調(diào)用相應(yīng)協(xié)議的解碼方法,這樣可以做到只開一個(gè)端口就可以支持多種協(xié)議的效果
這種不通過(guò)端口,通過(guò)協(xié)議本身特點(diǎn)區(qū)分協(xié)議,只能區(qū)分簡(jiǎn)單的協(xié)議(比如text,json的)吧?如果是hex格式的就沒(méi)有辦法根據(jù)協(xié)議來(lái)區(qū)分吧。
之前表述有點(diǎn)問(wèn)題,hex是數(shù)據(jù)格式。如果協(xié)議本身就是將數(shù)據(jù)進(jìn)行pack后再傳輸,因?yàn)閜ack的數(shù)據(jù)格式支持的種類比較多,通過(guò)接收的數(shù)據(jù)流是無(wú)法區(qū)分使用的pack格式的。
舉例:
A廠商設(shè)備使用pack(H, data)對(duì)協(xié)議數(shù)據(jù)進(jìn)行組包, H表示使用十六進(jìn)制高端字節(jié)序組包
B廠商設(shè)備使用pack(h, data)對(duì)協(xié)議數(shù)據(jù)進(jìn)行組包, h表示使用十六進(jìn)制低端字節(jié)序組包
C廠商設(shè)備使用pack(C, data)對(duì)協(xié)議數(shù)據(jù)進(jìn)行組包, C表示使用無(wú)符號(hào)字節(jié)組包
那么通過(guò)數(shù)據(jù)流只能知道是組包的,但是無(wú)法區(qū)分使用的組包方式,即無(wú)法區(qū)分協(xié)議。
這種情況下,就只能通過(guò)端口來(lái)區(qū)分協(xié)議,對(duì)吧?但是通過(guò)端口的方式區(qū)分協(xié)議,如果后續(xù)增加了協(xié)議,那么就需要重啟gateway,這樣之前協(xié)議監(jiān)聽(tīng)端口上的鏈接就都會(huì)釋放然后等待終端重新連接。
有沒(méi)有什么更好的辦法來(lái)處理這種多協(xié)議?謝謝!
協(xié)議區(qū)分一般是要在協(xié)議頭放一個(gè)字節(jié)來(lái)區(qū)分的,根據(jù)這個(gè)字節(jié)的值判斷是哪個(gè)廠商的協(xié)議。
另外每個(gè)廠商的協(xié)議不一樣,這個(gè)是不科學(xué)的,應(yīng)該所有廠商的協(xié)議都一樣,只是協(xié)議體中數(shù)據(jù)格式不一樣。
如果你的協(xié)議里面沒(méi)有區(qū)分協(xié)議的字段,建議用多端口支持多協(xié)議。
Gateway支持獨(dú)立部署的,可以單獨(dú)增加Gateway服務(wù),不用重啟服務(wù)器,簡(jiǎn)單的說(shuō)就是新建一個(gè)start_gatewayxxx.php,配置好,然后php start_gatewayxxx.php start -d就好了,這樣就啟動(dòng)了一個(gè)新的Gateway服務(wù)支持新的協(xié)議,業(yè)務(wù)代碼不用任何更改。
見(jiàn)手冊(cè):http://wtbis.cn/gatewaydoc/advanced/multi-protocols.html
甚至可以把Gateway服務(wù)單獨(dú)部署在其它服務(wù)器上支持多協(xié)議。
見(jiàn)手冊(cè):http://wtbis.cn/gatewaydoc/gateway-worker-development/gateway-worker-separation.html