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