2012-06-04 116 views
55

WebSocket提供了一個像人類談話一樣的雙向通信。 客戶端可以發送數據到服務器,服務器可以隨時向客戶端發送數據。 但這個問題呢?請求 - 響應行爲? 客戶端可以向服務器請求一些東西並等待響應。 似乎Websocket不提供任何東西來將客戶端數據(請求)鏈接到服務器數據(響應)。WebSocket請求 - 響應子協議

這可能是子協議的工作,我對如何做到這一點有一些想法(發送一個id與請求,並等待一個具有相同id的響應,直到超時期)。

爲了不重拍輪子並節省一些時間,我在網上查找了一個現有的解決方案,但是我還沒有找到任何相關的東西(可能是壞的關鍵字)。

那麼有沒有人知道這種工作,或者我錯過了什麼?

+0

的WebSockets是不是真的意味着那經典的HTTP請求 - 響應行爲。它們是基於事件的*,就像JavaScript事件一樣:它們來自未經請求的。 – rvighne

回答

36

WebSocket應用程序消息傳遞協議(WAMP)http://wamp.ws/爲此提供原始WebSocket頂部的RPC(遠程過程調用)和PubSub(發佈&訂閱)消息傳遞模式。

WAMP是一個合適的WebSocket子協議,使用WebSocket作爲傳輸和JSON作爲有效載荷格式。 RPC是使用3條消息實現的,這些消息包含一個「Call ID」,用於將異步RPC服務器響應與客戶端啓動的過程調用相關聯。

聲明:我是WAMP和一些(開源)WAMP實現的作者。這是一個開放的舉措,其他人已經開始上船了。最終,應該有一個WAMP RFC正確定義協議......但它仍處於早期階段。

+0

正是我在找的東西。我在Java的兩邊工作,你似乎沒有Java實現,所以我很樂意加入:) – Ghetolay

+0

太棒了!加入我們!順便說一句:我們有一個Android特定於Java客戶端的實現:https://github.com/tavendo/AutobahnAndroid WAMP資源:http://wamp.ws/spec,https://github.com/tavendo/wamp,後者提及的郵件列表,以及(主要是出於歷史原因),Autobahn郵件列表:http://groups.google.com/group/autobahnws。 – oberstet

+0

@oberstet我有一個websocket和Apache服務器不斷向客戶端發送重複信息而不是一次的相關問題。位於http://stackoverflow.com/questions/25071639/configure-apache-server-and-websockets-to-prevent-repeated-pulling-of-same-data任何建議? – Sauron

2

查看SwaggerSocket,它是所有主要Java WebServer都支持的REST over WebSockets協議。

11

我會使用JSON-RPC 2.0。

http://www.jsonrpc.org/specification

每個消息將是一個JSON對象。該協議聲明它是否是需要響應(與ID耦合)或通知的呼叫。

支持JSON-RPC的應用程序可以輕鬆檢查消息對象是否包含表示調用或不表示響應的方法。

我要建造一個javascript LIB處理過的WebSocket JSON RPC,使用Ajax作爲後備...

+0

客戶端部分位於:https://github.com/Textalk/jquery.jsonrpcclient.js – fiddur

+0

我的計劃是在js中添加一個JSON-RPC服務器,以便後端可以向瀏覽器發送請求辦法。 – fiddur

+1

+1 JSON-RPC實際上非常適合WebSocket,特別是PubSub(儘管在WAMP的網站上有相反的說法)。 WebSocket與JSON-RPC最大的假裝問題是缺少響應,因此,應該排除使用JSON-RPC,並要求在WebSocket上使用JSON-RPC中的「通知」模式。但是,堅持使用包含'id'(標記非通知模式)元素的JSON-RPC調用實際上允許雙向異步響應來到該ID之下(只需要將ID傳遞給B/e上的回調),並且您可以繼續使用通知模式進行無響應請求。 – ddotsenko

1

看看msg-rpc,它提供了簡單的消息接口雙向 RPC支持,包括網頁套接字。

不僅是簡單的rpc,它可以覆蓋「客戶端請求/服務器響應」行爲,還支持通過Rpc服務進行的「服務器請求/客戶端響應」行爲。

要開始,有sockjs和socket.io示例。

0

(發送ID與請求和等待與同一ID的效應初探直到超時時段)

我創建一個lib但這正是是,稱爲WebSocketR2(其中R 2是指請求響應):https://github.com/Modern-Edge-Software/WebSocketR2

如果連接丟失,它還處理重新連接到服務器,如果您通過負載平衡器執行Web套接字,這可能會有幫助。

最終的結果是可以實現在web套接字回調發送功能是這樣的:

var request = { 
    action: "login", 
    params: { 
     username: "test", 
     password: "password" 
    } 
}; 

ws.send(request, function(response){ 
    console.log(response) 
}); 
相關問題