2012-03-06 33 views
10

Có cách nào để mở một websocket trên một trang và sau đó tái sử dụng nó trên một trang khác (trong cùng một tab, sau khi người dùng nhấp vào một liên kết, ví dụ) thay vì phải mở một websocket mới sau mỗi lần tải trang? Bộ nhớ trình duyệt có thể giữ một ổ cắm mở không?Sử dụng lại các ổ cắm web giữa các trang?

Mục đích là để có thể giữ một websocket cho mỗi người dùng (hoặc tab) và nó sẽ là tuyệt vời để làm điều này mà không cần phải di chuyển giữa các trang một cách phi truyền thống, ví dụ tải nội dung vào một div bằng cách sử dụng Javascrpt mỗi lần người dùng tương tác với trang.

+1

Khi kết nối websocket được tạo, một số trạng thái tồn tại mà cả hai bên của kết nối phải theo dõi kết nối tồn tại. Tôi nghĩ rằng nếu bạn lưu trữ trạng thái phía máy khách của một kết nối trong bộ lưu trữ cục bộ (lưu ý rằng phía máy khách của hệ thống websocket phải được sửa đổi để cho phép hầu hết hoặc thậm chí tất cả các máy khách web không hỗ trợ điều này theo như tôi biết), bạn có thể mở lại kết nối sau này hoặc thậm chí trên một trang khác (miễn là máy chủ không giảm một nửa trạng thái của nó). Vì vậy, nó phải có thể nhưng làm thế nào? Tôi muốn xem một mẫu làm việc. –

+0

Tôi tưởng tượng rằng để "tái tạo" các websocket như vậy máy chủ sẽ phải hỗ trợ nó là tốt. Hoặc đặc biệt hơn là thư viện được sử dụng để thực hiện hỗ trợ websocket trên máy chủ. Tôi nghi ngờ hầu hết các triển khai trên máy chủ sẽ làm đảo lộn websocket khi nó phát hiện kết nối TCP cơ bản đã bị đóng - mặc dù các thay đổi cho máy khách mà bạn đề nghị _could_ giữ nó mở. –

+3

Yup, ** kết nối websocket không tồn tại trực tiếp kết nối tcp được tạo dưới dạng transport **, tốt, tôi nghĩ chúng thông minh hơn. –

Trả lời

7

Câu trả lời là no.

Ngay cả khi ổ cắm không được đóng kín một cách rõ ràng bằng cách gọi mySocket.close();, trình cắm sẽ được trình duyệt tải lại khi tải lại.

Tôi đã cố gắng lưu trữ đối tượng Socket Web trong bộ nhớ cục bộ và sử dụng nó để truy xuất lại dữ liệu. Đối tượng trả về là hợp lệ, nhưng kết nối không còn ở đó nữa. Bởi vì, khi trang tải lại, ổ cắm không được kết thúc.

nhắn ở phía máy chủ nói:

[Errno 10053] An established connection was aborted by the software in your host machine 

Có bạn đi ...

+0

Tôi đã tò mò điều gì sẽ xảy ra nếu bạn đặt một websocket (hoặc tham khảo thereto) vào lưu trữ cục bộ. Cảm ơn bạn đã dùng thử và giải quyết bí ẩn. –

2

Công nhân Web được chia sẻ sẽ cho phép bạn chia sẻ kết nối WebSocket cho nhiều tab được tải từ cùng một nguồn gốc/trang web.

Công nhân web được chia sẻ hiện chỉ được hỗ trợ trên Chrome, Safari, Opera.

+0

Xin lỗi, câu hỏi của tôi chưa đủ rõ ràng. Khi tôi nói các trang khác nhau tôi nên đã chỉ định trong cùng một tab. Tôi đã chỉnh sửa câu hỏi của tôi để hy vọng làm cho rõ ràng hơn. Cảm ơn bạn đã đi, mặc dù. –

+0

@Joshua: ah, sau đó bạn đang hỏi điều tương tự mà tôi đã hỏi một lúc trước đây: http://stackoverflow.com/questions/9336774/do-shared-web-workers-persist-across-a-single-page -reload-link-navigation/9337749 Không có câu trả lời dứt khoát cho câu hỏi đó, tôi dự định sẽ kiểm tra tại một số thời điểm để xem nó có hoạt động trong Chrome/Safari hay không. – kanaka

+0

Có, các câu hỏi tương tự khác với tôi đã hy vọng có thể có một cái gì đó khác biệt về websockets có nghĩa là tôi có thể nhận được một câu trả lời khác nhau. –

7

Một cách tiếp cận khác sẽ để giữ người dùng thay vì các ổ cắm trên các trang khác nhau. Bởi vì tôi có nghĩa là bạn lưu trữ ID của khách hàng trong cookie với javascript, mỗi khi người dùng cố gắng mở một ổ cắm mới từ bất kỳ trang nào của bạn, bạn gửi ID này đến máy chủ và sau đó máy chủ có cách để biết điều này kết nối mới là từ cùng một người dùng.

Tôi đã làm điều đó trong một dự án gần đây và hoạt động hoàn hảo :) Tùy thuộc vào những gì bạn định làm, bạn có thể giữ trạng thái của người dùng trên máy chủ bằng ID của mình hoặc lưu trữ nó trong cookie khác hoặc sự kiện sử dụng flash để lưu trữ nó trong một đối tượng được chia sẻ!

+0

Vâng, điều đó hoàn toàn có thể, và sẽ là một giải pháp hoàn toàn hợp lệ (và chúng tôi đã thảo luận) nhưng kiến ​​trúc cơ bản dựa trên websocket vẫn mở để đáp ứng một số yêu cầu chức năng. Tất nhiên các vấn đề có thể là do việc mở và đóng các ổ cắm có thể đã được giảm nhẹ nhưng cuối cùng nó đã được quyết định tốt hơn thay vì giữ ổ cắm mở và tự động tải nội dung dựa trên thuộc tính vị trí của URL thay thế. Không chắc chắn nó là cách tốt hơn nhưng c'est la vie. –

+0

@WiMantis mà trình quản lý kết nối cho websocket bạn đang sử dụng ở phía máy chủ? –

Các vấn đề liên quan