2012-07-25 44 views
19

Sau khi bắt tay thành công WebSocket, chúng ta có thể sử dụng nén gzip không?Websocket có hỗ trợ nén gzip không?

Dưới đây là các bài kiểm tra của tôi:

  1. tôi sử dụng autobahn lib để xây dựng một máy chủ, sau đó respon cho khách hàng như:
    HTTP/1.1 101 Switching Protocols content-encoding: gzip Connection: Upgrade Server: AutobahnPython/?.?.? Upgrade: WebSocket Sec-WebSocket-Accept: RIR8KmljoV8Cv9mdiLY7GM2nYMc=
  2. sau đó máy chủ của tôi sử dụng gzip nén
  3. và trình duyệt chrome có kết quả, nhưng nó nói với tôi rằng "không thể giải mã khung văn bản dưới dạng UTF-8"
+0

AutobahnPython (hiện tại) không hỗ trợ phần mở rộng nén trên mỗi khung hình. Trong mọi trường hợp, tín hiệu hỗ trợ được thực hiện thông qua tiêu đề HTTP cụ thể của WebSocket, không phải là "mã hóa nội dung". – oberstet

+0

Cảm ơn bạn đã nhắc nhở. Bất kỳ cách nào, có một cách đơn giản để hỗ trợ nén gzip như phương pháp http trong khi sử dụng websocket? – littlesun

+0

Không. Để sử dụng nén trên WebSocket, phần mở rộng cần phải được triển khai, yêu cầu mã quan trọng "sâu xuống dưới mui xe". – oberstet

Trả lời

4

Có một compression extension ing worked on bởi nhóm làm việc IETF Websocket (HyBi). Tôi sẽ đề nghị theo danh sách gửi thư của họ để biết thông tin cập nhật. Tôi cũng khuyên bạn nên kiểm tra this question.


Cập nhật 2017: Phần mở rộng hiện nay đã sẵn sàng cho một số thời gian, xem tại đây: nén https://tools.ietf.org/html/rfc7692

+0

Bạn có thể cho tôi biết cách sử dụng không? Tôi đã tìm kiếm trong RFC 6455, nhưng tôi không biết làm thế nào để sử dụng ... – littlesun

+0

Cảm ơn Dreen, điều đó thật tuyệt. Tôi sẽ nghiên cứu phần mở rộng nén. Có ai khác đang học về nó không? – littlesun

+0

@ littlesun: Theo tôi biết, tiện ích mở rộng này chưa khả dụng vì nó vẫn đang được thực hiện (nguyên nhân chính của việc này là chúng chỉ thay đổi nó từ thiết bị "trên mỗi khung hình" thành "cho mỗi tin nhắn") . Bản thân Javascript không thực sự hỗ trợ bất kỳ hình thức nén/giải nén nào. Tôi e rằng giải pháp duy nhất hiện nay là chờ đợi những người dùng IETF hoàn thành thông số kỹ thuật và cho các nhà cung cấp trình duyệt để thực hiện nó ... Nó không nên dài, IMHO nó có thể sẽ xảy ra trong một vài tháng tới. – Dreen

6

WebSocket được kích hoạt trong một số trình duyệt mặc định (tại thời điểm viết ví dụ trong Chrome, nhưng không trong Firefox). Khách hàng phải bao gồm tiêu đề 'Sec-WebSocket-Extensions: permessage-deflate' cho điều này. Nếu máy chủ phản hồi với cùng một phần mở rộng, giao tiếp WebSocket được nén trên cơ sở khung. Theo tôi biết, không có API trình duyệt để bật/tắt tiện ích mở rộng.

Bài viết hay về chủ đề là: https://www.igvita.com/2013/11/27/configuring-and-optimizing-websocket-compression/

0

Có thể. Chrome 19+ supports it.

"https://github.com/crossbario/autobahn-python/blob/master/examples/twisted/websocket/echo_compressed/server_advanced.py" 

from twisted.internet import reactor 
from twisted.web.server import Site 
from twisted.web.static import File 

from autobahn.twisted.websocket import WebSocketServerFactory, \ 
    listenWS 

from autobahn.websocket.compress import * 

def accept(offers): 
    for offer in offers: 
     return PerMessageDeflateOfferAccept(offer) 

debug = True 
factory = WebSocketServerFactory(u"ws://127.0.0.1:9000", debug=debug, debugCodePaths=debug) 
factory.setProtocolOptions(perMessageCompressionAccept=accept) 

listenWS(factory) 

webdir = File(".") 
web = Site(webdir) 
reactor.listenTCP(8080, web) 

reactor.run() 

Thông tin thêm: how PerMessageDeflateOffer is used in Autobahn examples.

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