2010-09-03 13 views
8

Tôi đã sử dụng gimite/web-socket-js để triển khai WebSocket trước đây chỉ đơn giản là Chrome và các bản xây dựng phát triển của Safari. Tôi muốn di chuyển ra khỏi máy chủ Ruby và lên Node.js. Đột nhiên nó không có tác dụng gì ngoài Chrome.Sử dụng ổ cắm Flash với Node.js

Tôi nghi ngờ rằng điều này phải làm với tệp Flash Socket Policy mà tôi cần triển khai. Tôi muốn thực hiện điều này như là một quá trình Node.js bên ngoài để không lầy lội với ứng dụng gốc. Tôi đang sử dụng node-websocket-server để triển khai giao thức WebSocket với Node.js, và một lần nữa tôi cũng muốn không phải là gây rối với điều đó.

Dường như là điều đơn giản nhất để làm là nên chạy flashsocket.js, nhưng chạy mà mang lại cho tôi những lỗi sau:

sys:334 
    ctor.prototype = Object.create(superCtor.prototype, { 
          ^
TypeError: Object prototype may only be an Object or null 
    at Function.create (native) 
    at Object.inherits (sys:334:29) 
    at Object.<anonymous> (/Users/me/Projects/testing/websocket/node-websocket-server/flashsocket.js:10:16) 
    at Module._compile (node.js:472:23) 
    at Module._loadScriptSync (node.js:479:10) 
    at Module.loadSync (node.js:349:12) 
    at Object.runMain (node.js:532:24) 
    at node.js:762:10 

Ở đây chúng ta chạy vào các lỗi khó hiểu đáng yêu Node.js được yêu thương cho.

Câu hỏi của tôi là có một máy chủ chính sách socket flash toàn cầu độc lập Tôi có thể chạy khỏi Node.js hoặc ứng dụng khác? Sự hiểu biết của tôi là tôi chỉ cần có nó cư trú trên cổng 843. Hoặc là có một thư viện WebSocket cho Node.js sẽ xử lý chính sách Flash như máy chủ Ruby không?

Trả lời

6

Với một chút sự giúp đỡ từ các mailing list Node.js tôi đã đưa ra như sau:

var net = require("net"), 
    domains = ["localhost:8081"]; 

net.createServer(
    function(socket) 
    { 
     socket.write("<?xml version=\"1.0\"?>\n"); 
     socket.write("<!DOCTYPE cross-domain-policy SYSTEM \"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd\">\n"); 
     socket.write("<cross-domain-policy>\n"); 

     domains.forEach(
      function(domain) 
      { 
       var parts = domain.split(':'); 
       socket.write("<allow-access-from domain=\""+parts[0]+"\"to-ports=\""+(parts[1]||'80')+"\"/>\n"); 
      } 
     ); 

     socket.write("</cross-domain-policy>\n"); 
     socket.end(); 
    } 
).listen(843); 

Tôi cũng đã viết một (tóm tắt) hướng dẫn cho WebSockets applications using Flash Sockets.

+0

Hiện tại, bạn có thể tìm thấy gia sư tại đây (http://www.joshuakehn.com/2010/9/22/WebSocket-Tutorial-with-Nodejs.html) – Phylliida

1

Tốt hơn là ghi đè trình lắng nghe của Trình phát (trình nghe của socket). Nếu máy chủ của bạn sẽ đâm khi bạn có một số lỗi như:

ECONNRESET, Connection reset by peer

mẫu thực hiện để ngăn chặn nó:

socket.setEncoding("utf8"); 
socket.addListener("end", function() {socket.end();}); 
socket.addListener("error", function (exception) {socket.end();}); 
socket.addListener("timeout", function() {socket.end();}); 
socket.addListener("close", function (had_error) {socket.end();}); 

Xem tài liệu tại địa chỉ: http://nodejs.org/api.html (ít "net.Stream")

8

Yêu cầu chính sách Flash cũng có thể được trả lời nội dòng trên cùng một cổng với dịch vụ WebSockets mà bạn đang cung cấp. Xem this change vào mô-đun node.IO node.js. Nó cho biết thêm một kết nối nghe máy chủ trả lời các yêu cầu máy chủ chính sách trên cùng một cổng. Bằng cách đó bạn không phải chạy một cái gì đó trên cổng 843 (thường yêu cầu quyền root).

Cách khác, bạn cũng có thể chạy một (2 dòng) máy chủ yêu cầu chính sách rất đơn giản sử dụng socat (giả sử bạn đang ở trên một hệ thống * nix): http://github.com/kanaka/noVNC/blob/master/docs/flash_policy.txt

Cập nhật (đáp ứng với @Josh K):

Đó là sự hiểu lầm phổ biến rằng cổng 843 là vị trí chính cho yêu cầu chính sách flash và các yêu cầu cùng cổng đó là thời gian chờ và chúng chậm hơn do hết thời gian chờ. Điều này có thể dựa trên số thường được trích dẫn http://www.lightsphere.com/dev/articles/flash_socket_policy.html và cũng vì tài liệu của Adobe khó theo dõi (và đọc). Đây là tài liệu Adobe về chính sách bảo mật của chúng: http://www.adobe.com/devnet/flashplayer/articles/fplayer9_security.html

Trong cổng thực tế 843 phục vụ một phần mục đích khác nhau từ cùng một cổng phản hồi.Cổng 843 dành cho chính sách meta (chính sách trang web). Nó được ưu tiên hơn các chính sách cùng cổng. Quản trị viên có thể sử dụng nó để xác định chính sách flash cho toàn bộ hệ thống và có thể sử dụng nó để từ chối người dùng không có đặc quyền cho phép kết nối ổ cắm flash trong. Đây là lý do tại sao nó nằm trên cổng 843 (nằm trong phạm vi đặc quyền) để chỉ quản trị viên hệ thống mới có thể khởi chạy dịch vụ trên cổng đó.

Thời gian chờ 3 giây chỉ áp dụng trong trường hợp kết nối đến cổng 843 bị ngắt âm thầm. Nó không áp dụng cho trường hợp có một số dịch vụ khác đang chạy trên cổng 843 hoặc kết nối bị từ chối (nghĩa là thiết lập lại TCP). Tôi sử dụng cùng một cổng tất cả các thời gian và không có sự chậm trễ nhận thấy với chỉ chạy một máy chủ chính sách cổng tương tự.

Với máy chủ WebSocket, một lợi thế bổ sung cho cùng một phản hồi chính sách cổng là bạn có thể dễ dàng phối hợp cấu hình chính sách gốc giữa chính sách flash và bắt tay WebSockets.

+0

Có, chúng có thể được trả lời nội tuyến nhưng đó là ** không được thông báo ** vì Flash sẽ kiểm tra cổng 843 trước. Nó không nhận được phản hồi sau 3 giây, nó sẽ thử cổng thực tế. Tốt hơn là nên có FPS sạch chạy trên 843 và ứng dụng của bạn trên cổng riêng của nó. –

+0

Thông tin thú vị về chính sách flash, +1. –

+0

Lưu ý rằng Socket.IO sẽ chỉ kích hoạt máy chủ chính sách khi vận chuyển flashsocket được bật. – Nick