2012-06-04 46 views
55

WebSocket cung cấp một giao tiếp hai chiều như một cuộc đàm thoại của con người. Máy khách có thể gửi dữ liệu đến máy chủ và máy chủ có thể gửi dữ liệu cho khách hàng bất kỳ lúc nào. Nhưng còn câu hỏi thì sao? hành vi yêu cầu phản hồi? Máy khách có thể yêu cầu một cái gì đó đến máy chủ và chờ phản hồi. Có vẻ như Websocket không cung cấp bất cứ điều gì để liên kết dữ liệu khách hàng (yêu cầu) với dữ liệu máy chủ (phản hồi).WebSocket yêu cầu-phản hồi subprotocol

Đó có lẽ là công việc của subprotocol và tôi có một số ý tưởng về cách thực hiện (gửi id với yêu cầu và chờ phản hồi với cùng id cho đến khoảng thời gian chờ).

Để không làm lại bánh xe và để tiết kiệm thời gian, tôi đã xem qua Internet để tìm giải pháp hiện tại nhưng tôi không tìm thấy bất kỳ thứ gì có liên quan (có thể là từ khóa xấu).

Vì vậy, có ai biết về loại công việc này hay tôi thiếu gì đó không?

+0

WebSockets không thực sự có nghĩa là cho rằng cổ điển HTTP hành vi yêu cầu-phản ứng. Chúng là * dựa trên sự kiện *, như các sự kiện JavaScript: chúng không được yêu cầu. – rvighne

Trả lời

36

Giao thức nhắn tin ứng dụng WebSocket (WAMP) http://wamp.ws/ cung cấp các mẫu nhắn tin RPC (Remote Procedure Call) và PubSub (Publish & Subscribe) trên WebSocket thô cho mục đích đó.

WAMP là một biểu mẫu con WebSocket thích hợp, sử dụng WebSocket làm phương tiện vận tải và JSON làm định dạng tải trọng. RPC được thực hiện bằng cách sử dụng 3 thư và các thư đó chứa "ID cuộc gọi" để tương ứng với các phản hồi máy chủ RPC không đồng bộ với các cuộc gọi thủ tục do khách hàng thực hiện.

Tuyên bố từ chối trách nhiệm: Tôi là tác giả của WAMP và một số triển khai WAMP nguồn mở. Một sáng kiến ​​mở của nó, với những người khác đã bắt đầu để có được trên thuyền. Cuối cùng, cần có một WAMP RFC xác định đúng giao thức .. nhưng nó vẫn còn trong giai đoạn đầu.

+0

Chính xác những gì tôi đang tìm kiếm. Tôi đang làm việc trên Java cả hai bên và bạn dường như không có Java triển khai vì vậy tôi sẽ được hạnh phúc để tham gia :) – Ghetolay

+0

Tuyệt vời! Tham gia với chúng tôi! Btw: chúng tôi có triển khai chỉ dành cho máy khách Java dành riêng cho Android: https://github.com/tavendo/AutobahnAndroid Vài tài nguyên WAMP: http://wamp.ws/spec, https://github.com/tavendo/wamp, danh sách gửi thư được đề cập trong phần sau và (chủ yếu vì lý do lịch sử), danh sách gửi thư cho Autobahn: http://groups.google.com/group/autobahnws. – oberstet

+0

@oberstet Tôi có một câu hỏi liên quan và tương tự về mặt websocket và máy chủ Apache liên tục gửi thông tin lặp lại cho khách hàng thay vì chỉ một lần. Có tại http://stackoverflow.com/questions/25071639/configure-apache-server-and-websockets-to-prevent-repeated-pulling-of-same-data bất kỳ đề xuất nào không? – Sauron

1

Tôi đang chạy chương trình yêu cầu phản hồi đơn giản bằng cách sử dụng ổ cắm web. Xem "Websocket Server Demonstration". Bạn có thể tải xuống mã nguồn trang web.

2

hãy xem SwaggerSocket, đây là giao thức REST trên WebSockets được hỗ trợ với tất cả máy chủ Web Java chính.

11

Tôi sẽ sử dụng JSON-RPC 2.0.

http://www.jsonrpc.org/specification

Mỗi thư sẽ là đối tượng JSON. Giao thức nêu rõ nếu đó là một cuộc gọi muốn có một phản hồi (liên kết với id), hoặc một thông báo.

Ứng dụng nhận biết JSON-RPC có thể dễ dàng kiểm tra xem đối tượng tin nhắn có chứa phương thức, biểu thị cuộc gọi hay không, biểu thị phản hồi.

Tôi về để xây dựng một lib javascript để xử lý rpc json qua WebSocket, với ajax như dự phòng ...

+0

Phần khách hàng ở đây: https://github.com/Textalk/jquery.jsonrpcclient.js – fiddur

+0

Kế hoạch của tôi là thêm một máy chủ JSON-RPC trong js, vì vậy chương trình phụ trợ có thể gửi yêu cầu đến trình duyệt trong cùng một đường. – fiddur

+1

+1 JSON-RPC thực sự rất suiting cho WebSocket, và đặc biệt PubSub (mặc dù các câu lệnh trái trên trang WAMP). Vấn đề giả vờ lớn nhất với WebSocket và JSON-RPC là thiếu phản hồi, do đó, được cho là loại trừ việc sử dụng JSON-RPC và yêu cầu sử dụng chế độ "thông báo" trong JSON-RPC qua WebSocket. Tuy nhiên, gắn bó với các cuộc gọi JSON-RPC có chứa phần tử 'id' (gắn cờ chế độ không thông báo) thực sự cho phép các phản hồi không đồng bộ hai hướng đi theo ID đó (chỉ cần chuyển ID để gọi lại trên b/e) và bạn có thể tiếp tục sử dụng chế độ thông báo cho các yêu cầu ít phản hồi hơn. – ddotsenko

1

Hãy xem msg-rpc, nó cung cấp hai chiều hỗ trợ rpc qua giao diện thông điệp đơn giản, bao gồm WebSocket.

Không chỉ rpc đơn giản, có thể bao gồm hành vi "yêu cầu máy khách/phản hồi máy chủ", nó cũng hỗ trợ hành vi "yêu cầu máy chủ/ứng dụng máy khách", thông qua Dịch vụ Rpc.

Để bắt đầu, có các ví dụ về sockj và socket.io.

0

(gửi một id với yêu cầu và chờ đợi một phản ứng với cùng id cho đến khi một khoảng thời gian timeout)

Tôi tạo ra một lib mà không chính xác điều đó, được gọi là WebSocketR2 (nơi R2 có nghĩa là đáp ứng yêu cầu): https://github.com/Modern-Edge-Software/WebSocketR2

Nó cũng xử lý kết nối lại với máy chủ nếu một kết nối bị mất, mà có thể là hữu ích nếu bạn đang làm cổng web thông qua một cân bằng tải.

Kết quả cuối cùng là bạn có thể thực hiện callbacks trên socket web gửi chức năng như thế này:

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

ws.send(request, function(response){ 
    console.log(response) 
}); 
Các vấn đề liên quan