2011-11-08 25 views
17

Tôi đã đọc về WebSockets nhưng chúng dường như không phải là "ổ cắm" tinh khiết, vì có giao thức lớp ứng dụng trên chúng. "ws:"Làm thế nào để thiết lập kết nối TCP Socket từ trình duyệt web (phía máy khách)?

Có cách nào để thực hiện kết nối ổ cắm thuần túy từ trình duyệt web, để kích hoạt các trang web không?

Dưới đây là đâm ngẫu nhiên của tôi trong bóng tối

  • Applet ổ cắm được cung cấp bởi Java (cần java cài đặt)
  • ổ cắm flash được cung cấp bởi Flash (cần đèn flash được cài đặt)

Nhưng về HTML5 , Tại sao chúng được gọi là WebSockets nếu chúng không phải là Sockets?

Giao thức websocket có đơn giản như vậy để thực hiện rằng đó là "gần như" ổ cắm không?

Trả lời

41

Tôi đã đọc về WebSockets nhưng chúng dường như không phải là "ổ cắm" thuần túy, vì có giao thức lớp ứng dụng trên chúng.

Giao thức websocket rất đơn giản để thực hiện [it is] "gần như" -sockets?

Cho phép kết nối ổ cắm thông thường trực tiếp từ trình duyệt sẽ không bao giờ xảy ra vì nó sẽ mở ra rủi ro lớn. WebSockets là về gần với ổ cắm nguyên từ trình duyệt như bạn sẽ nhận được. Các bắt tay WebSockets ban đầu tương tự như một cái bắt tay HTTP (cho phép các máy chủ web để proxy/cầu nó) và thêm bảo mật loại CORS. Ngoài ra, WebSockets là một giao tiếp dựa trên thông điệp (chứ không phải là truyền trực tuyến dưới dạng TCP thô) và điều này được thực hiện bằng cách sử dụng tiêu đề hai byte trên mỗi khung thư.

Thậm chí flash không thể tạo kết nối TCP thô. Ổ cắm flash cũng thêm bảo mật CORS, nhưng thay vì bắt tay trong băng, kết nối ổ cắm flash tạo kết nối đến cổng 843 trên máy chủ đích để yêu cầu tệp chính sách bảo mật.

Có cách nào để thực hiện kết nối ổ cắm thuần túy từ trình duyệt web, để kích hoạt các trang web không?

Có, bạn có thể sử dụng cầu nối/proxy websockify của mình cho phép trình duyệt đã bật WebSockets kết nối trực tiếp với ổ cắm TCP qua websockify.

Nhưng về HTML5, Tại sao chúng được gọi là WebSockets nếu chúng không phải là Ổ cắm?

WebSockets là phương tiện được xây dựng trên ổ cắm TCP. Sau khi bắt tay có chi phí rất thấp (thường chỉ là một tiêu đề hai byte).

+0

Câu trả lời hay nhất +1 và cảm ơn lỗi đánh máy. Thu hẹp tìm kiếm của tôi: Sẽ đủ cho tôi nếu tôi có thể kết nối với Máy chủ ở phía máy khách, nghĩa là máy chủ được cài đặt ở máy khách, localhost từ quan điểm của trình duyệt, có lẽ vấn đề bảo mật (đơn giản) nên đơn giản hơn, bất kỳ lời khuyên nào về điều này? thanks –

+0

Kết nối với localhost không thực sự thay đổi tình trạng an ninh. Hãy tưởng tượng một trang web độc hại (hoặc quảng cáo độc hại trên một trang web thân thiện) có thể kết nối với tất cả các cổng địa phương của bạn. Về cơ bản nó bỏ qua tất cả bảo vệ tường lửa. Bạn vẫn có thể chạy websockify cục bộ cho bất kỳ cổng nào bạn muốn proxy. – kanaka

+1

Có w3c bản nháp cho [api socket nguyên] (http://www.w3.org/TR/raw-sockets/) [cân nhắc về bảo mật và quyền riêng tư] (http://www.w3.org/TR/raw-sockets/# security-and-privacy-cân nhắc) là yếu và số ít. Đó là tất cả những gì tôi phải nói. – user2350838

0

Nếu bạn yêu cầu một số dữ liệu được đẩy từ máy chủ, nó được gọi là COMET hoặc Reverse Ajax.

Ổ cắm web vẫn không phổ biến vì có các sự cố tường lửa vốn có và hỗ trợ tối thiểu từ các trình duyệt phổ biến.

Bạn có thể có một cái nhìn tại http://www.ape-project.org/ vì đây là một trong những triển khai phổ biến nhất (nhưng có nguồn gốc từ unix/linux chỉ cho bây giờ. Đối với cửa sổ họ đề nghị sử dụng một hộp ảo hoặc vmware dựa thực hiện)

2

Bạn có thể chỉ gửi dữ liệu giữa máy khách và máy chủ với WebSockets. Đơn giản chỉ cần nói, sự khác biệt duy nhất mà WebSockets giới thiệu là khách hàng:

  • thêm một số byte header, giống như các kiểu dữ liệu và độ dài
  • thêm mặt nạ và mã hóa dữ liệu sử dụng chúng

Máy chủ cũng phải thêm byte tiêu đề, nhưng không cần phải mã hóa dữ liệu.

Nếu bạn triển khai giao thức chính xác (phía máy chủ, nghĩa là, vì trình duyệt đã có triển khai), bạn có thể sử dụng dễ dàng để gửi văn bản và dữ liệu nhị phân. (Mặc dù hỗ trợ trình duyệt bị thu hẹp, đặc biệt đối với trường hợp sau.)

+1

Sẽ là tuyệt vời để biết, làm thế nào những * header byte * trông giống như, bất kỳ tài liệu tham khảo? cảm ơn –

+1

@void: Có đặc điểm kỹ thuật tại http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17#section-5.1. Trước đây, tôi đã đăng một số mã giả về giải mã dữ liệu từ máy khách đến máy chủ tại http://stackoverflow.com/q/7045885 – pimvdb

4

Tôi không thể cải thiện câu trả lời của Kanaka cho câu hỏi phụ của bạn và tôi biết câu hỏi này là một năm tuổi. Nhưng đối với câu hỏi chính, Is there any way of doing a pure socket connection from a web browser, to enliven webpages? Có một dự án được gọi là Java/JavaScript Socket Bridge có thể là những gì bạn (hoặc bất kỳ ai truy cập trang này từ tìm kiếm của Google) đang tìm kiếm. Ưu điểm của phương thức này so với những gì người khác đã đề cập là nó không yêu cầu dịch vụ phía máy khách hoặc dịch vụ phía máy chủ được chạy. Vì vậy, ví dụ, nếu bạn muốn thực hiện một máy khách IRC hoàn toàn bằng JavaScript nhưng máy chủ web của bạn không cho phép bạn có đủ quyền để kết nối proxy, thì ứng dụng Java này sẽ là cách để đi. Mối quan tâm duy nhất là đảm bảo máy khách đã cài đặt và cho phép Java.

1

Lợi ích của WebSocket là nó dựa trên HTTP. Bạn có thể sử dụng nó trong môi trường có http proxy được sử dụng. Do đó Websocket có khả năng tương thích cơ sở hạ tầng cao hơn như tcp đơn giản.

Ngoài http/WebSocket được cung cấp cho bạn một số tính năng mà bạn nếu không sẽ phải chỉ định trên của riêng bạn:

  • Redirect
  • NAT keepalive
  • Multiplexing qua URI
  • Đóng khung
Các vấn đề liên quan