我試圖闡明一個項目的想法,其中可以在python中開發客戶端GUI,並且GUI可以由後端驅動可能是任何其他語言,通過RPC。 更具體地說,現在我在客戶端使用PyQt,並將Go作爲最初的後端。跨語言客戶端/服務器的雙向RPC選項
這裏是我的目標:
- PyQt的客戶
- 角色:視圖,控制器
- 單向調用(SIGNAL/SLOT),如:
button.clicked -> RPC.handleSignal
- 請求/回覆RPC,如:
rowCount = model.rowCount -> RPC.call.model.rowCount
- 不可知論後端(在這種情況下轉到)
- 角色:控制器,型號
- 單向調用(發射信號)時,如:
model.dataChanged -> RPC.emitSignal
我因爲用戶可以在GUI客戶端定義信號/插槽連接,或者後端可以定義它自己的信號假設有關客戶端視圖的知識,通過RPC進行nal/slot連接。這完全取決於用戶想要如何設置控制器。
我現在正在看Thrift,vs比較輕的基本rpc沒有IDL。但主要是我的問題是,嘗試使用Thrift作爲兩個.thrift文件(客戶端/服務器< ---->客戶端/服務器(兩個連接))以實現雙向功能?我在Thrift看到的好處是IDL,因此我可以專門構建我的界面,而後端代碼可以實現他們想要的部分。
有沒有人有對此解決方案的建議?兩個Thrift接口?一個Thrift接口,提供服務讓客戶端建立第二個簡單的套接字來接收來自服務器的單向呼叫?還是節儉有點甚至矯枉過正?雖然後端 - > GUI界面實際上只是一個單一的服務功能,GUI - >後端可能會擴展一些(modelHandlers,slotHandlers,一般服務器狀態查詢)。
(編輯)更多的思考
部分的我在想,該模式可以與任何RPC框架來完成,它會是這樣?
- 後臺服務器進程啓動;監聽端口
- 客戶端GUI啓動;連接到服務器RPC;聽新港口;通過RPC調用發送端口到服務器
- 服務器接收來自客戶端端口,並結合到它的第二個RPC連接
- 客戶端和服務器有2個連接,用於雙向RPC
Go protobuf現在不支持rpc,所以我將不得不爲我的rpc包做我自己的編碼器解碼器。所以你通常建議選擇兩個連接和一個節儉或protobuf層?我認爲有一個單一的連接的唯一方法是做一個直接的套接字連接和多個。雙向rpc呼叫。 Websocket似乎在這個混合中完全沒有意義。除非我這麼抽象地想讓pyqt ui與基於http的服務器通信。但在那種情況下,這些服務器中的任何一個都可以做原始tcp – jdi
我從來沒有聽說過我的評論有任何更多的細節,但它已經這麼久了,我認爲這是我將得到的最好答案:-) – jdi