2013-05-15 32 views
7

Vấn đề tôi gặp phải là tôi không biết cách có thể biết dữ liệu mà tôi gửi lại máy khách được nén ở định dạng gzip. Nhìn vào đầu ra của máy chủ của tôi từ dòng lệnh tôi thấy:Gửi dữ liệu phản hồi socket.io tới máy khách từ máy chủ node.js ở định dạng gzip

debug - websocket writing 3:::{"result":1368673052397} 
debug - websocket writing 3:::{"result":1368673053399} 
... 

Với tôi, máy chủ này có vẻ như đang viết phản hồi dưới dạng ascii thay vì nén trước khi gửi.

Dưới đây là ví dụ tôi đã viết để tạo ra các kết quả này. Từ những gì tôi đã đọc miễn là tôi đặt 'trình duyệt của khách hàng gzip' các câu trả lời của tôi nên được gửi gzipped. Nếu họ không làm thế nào để tôi làm điều này và nếu tôi làm thế nào tôi có thể nói từ thông tin gỡ lỗi của máy chủ rằng họ đang trong thực tế phản ứng nén.

Khi tôi khởi động máy chủ tôi sử dụng lệnh sau đây trong BASH:

$ NODE_ENV = nút sản xuất app.js

var express = require('express'), 
    http = require('http'); 

var app  = express(), 
    server = http.createServer(app), 
    io  = require('socket.io').listen(server); 

io.configure('production', function() { 
    io.enable('browser client minification'); 
    io.enable('browser client etag'); 
    io.enable('browser client gzip'); 
    io.set('log level', 3); 
}); 

app.use(express.logger('dev')); 

app.get('/', function(req, res) { 
    res.send(
    "<script src='/socket.io/socket.io.js'></script>\n"+ 
    "<script src='http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js'></script>\n"+ 
    "<script>\n"+ 
    "var socket=io.connect('http://127.0.0.1:3000');\n"+ 
    "socket.on('message', function(data) {\n"+ 
    " $(\"h2\").text(data);\n"+ 
    "});\n"+ 
    "</script>\n"+ 
    "<h1>"+process.env.NODE_ENV+"</h1>\n"+ 
    "<h2></h2>\n" 
    ); 
}); 

server.listen('3000'); 

io.sockets.on('connection', function(webSocket) { 
    function whileLoop() { 
     setTimeout(function() { 
       var epoch = (new Date).getTime(); 
       var jsonData = "{\"result\":"+epoch+"}"; 
       webSocket.send(jsonData); 
      whileLoop(); 
     }, 1000); 
    } 
    whileLoop(); 
}); 
+0

bạn chỉ có thể deflate các json và sử dụng một lib như zip.js hoặc jszip để thổi phồng các chuỗi trên khách hàng- kết thúc. – dandavis

+0

@dandavis Tôi đã tải xuống jszip và tôi đã nhận được phần làm lệch trên phía máy chủ bằng cách sử dụng zlib và tôi có thể gửi dữ liệu đã nén đến mã hóa base64 của máy khách nhưng tôi không thể tìm ra cách tăng tốc phản hồi được mã hóa base64 đó khách hàng. Bạn có thể gửi cho tôi mã cập nhật mà tôi cần trong index.html để xử lý điều này giả sử tôi đang sử dụng thư viện jszip không? –

+0

nếu bạn đang gửi một cái gì đó trên máy chủ như base64 (deflate (JSON.stringify (str))), sau đó sử dụng JSON.parse (inflate (atob (dữ liệu))) trên máy khách ... – dandavis

Trả lời

2

Sau khi đọc một số nhận xét, tôi quyết định xem thư viện của bên thứ ba để xử lý giải nén ở phía máy khách dẫn tôi đến JSXCompressor.

http://jsxgraph.uni-bayreuth.de/wp/jsxcompressor/

JSXCompressor sẽ lấy mã hóa base64 dữ liệu đã giải nén từ máy chủ và xử lý các giải nén và giải mã. Chỉ cần tải xuống thư viện và đặt nó vào thư mục thích hợp.

Ở phía máy chủ, tôi đang sử dụng zlib để xử lý phần gzipping.

var express = require('express'), 
    http = require('http') 
    zlib = require('zlib'); 

var app  = express(), 
    server = http.createServer(app), 
    io  = require('socket.io').listen(server); 

app.use(express.logger('dev')); 
app.use(express.static(__dirname + '/public')); 

app.get('/', function(req, res) { 
    res.send(
    "<script src='/socket.io/socket.io.js'></script>\n"+ 
    "<script src='/java/jsxcompressor.min.js'></script>\n"+ 
    "<script src='http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js'></script>\n"+ 
    "<script>\n"+ 
    "var socket=io.connect('http://127.0.0.1:3000');\n"+ 
    "socket.on('message', function(data) {\n"+ 
    " var jsonData = JXG.decompress(data);"+ 
    " $(\"h1\").text(jsonData);\n"+ 
    "});\n"+ 
    "</script>\n"+ 
    "<h1></h1>\n" 
    ); 
}); 

server.listen('3000'); 

io.sockets.on('connection', function(webSocket) { 
    function whileLoop() { 
     setTimeout(function() { 
       var epoch = (new Date).getTime(); 
       var jsonData = "{\"result\":"+epoch+"}"; 
       zlib.gzip(jsonData, function(err, buffer) { 
        webSocket.send(buffer.toString('base64')); 
       }); 
      whileLoop(); 
     }, 1000); 
    } 
    whileLoop(); 
}); 
5

Tùy chọn browser client gzip phép nén gzip cho socket.io kịch bản được phục vụ từ /socket.io/socket.io.js. Nó không ảnh hưởng đến kết nối WebSocket thực tế.

Giao thức WebSocket chính nó chỉ hỗ trợ gần đây để nén dữ liệu được gửi qua ổ cắm. Soket.io does not yet support compression, cũng không làm other node WebSocket servers.

Thành thật mà nói, với lượng dữ liệu nhỏ bạn đang gửi trong ví dụ của mình, nén sẽ thực sự phản tác dụng vì có khả năng tăng lượng dữ liệu được gửi qua dây.

+1

Trong ví dụ này, có không cần thiết. Tuy nhiên, đây chỉ là một ví dụ.Trong ứng dụng thực tế của tôi, tôi gửi lại chuỗi dài hơn và nén là cần thiết do hạn chế về băng thông. –

+0

@ Bradradmith: Thật không may, bây giờ bạn đang SOL vì socket.io không hỗ trợ nén WebSocket. Để giải quyết vấn đề này, bạn có thể gửi thông báo "dữ liệu có sẵn" trên socket và sau đó thực hiện một yêu cầu XHR truyền thống để nhận dữ liệu JSON thực tế, có thể được gzipped. – josh3736

+0

Hoặc sử dụng lib nén máy khách/máy chủ tương thích để (de) tự nén dữ liệu. – robertklep

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