2012-04-30 33 views
7

Tôi có ứng dụng đường ray Tôi đang chạy trên máy chủ mỏng để sử dụng vòng lặp chạy EventMachine. Vấn đề là tôi muốn có thể bao gồm em-websocket để xử lý thông tin đến từ một ws và dừng lại và bắt đầu websocket mà không dừng vòng lặp chạy EM. Đây là cách tôi bắt đầu websocket.Ẩn an toàn web-shopsocket trong đường ray trên mỏng

EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws| 
    ws.onopen { } 
    ws.onclose { } 
    ws.onmessage { |msg| } 
end 

Sự cố ở mã bắt đầu/dừng. Từ tài liệu em-WebSocket của

#Start WebSocket 
def self.start(options, &blk) 
    EM.epoll 
    EM.run do 

    trap("TERM") { stop } 
    trap("INT") { stop } 

    EventMachine::start_server(options[:host], options[:port], 
     EventMachine::WebSocket::Connection, options) do |c| 
     blk.call(c) 
    end 
    end 
end 


#Stop WebSocket 
def self.stop 
    puts "Terminating WebSocket Server" 
    EventMachine.stop 
end 

Vấn đề là mã em-WebSocket nội bộ không theo dõi chữ ký đến từ EM: start_server để có thể gọi EventMachine :: stop_server (chữ ký) để tắt nó. Có cách nào tôi có thể ghi đè lên các chức năng này mà không sửa đổi em-websocket vì vậy tôi có thể an toàn bắt đầu/dừng các websockets? Tôi muốn nếu nó thực hiện giống như máy chủ Eventmachine nổi bật hơn.

Trả lời

3

Dường như với tôi bạn không cần phải sử dụng EM :: Websocket.start(). Thay vào đó hãy viết mã bắt đầu/dừng của riêng bạn, sau đó bạn có thể tự quản lý chữ ký.

# start a ws server and return the signature 
# caller is responsible for +trap+ing to stop it later using said signature. 
def start_ws_server(options, &blk) 
    return EventMachine::start_server(options[:host], options[:port], 
    EventMachine::WebSocket::Connection, options) do |c| 
    blk.call(c) 
    end 
end 

# stop a previously started ws server 
def stop_ws_server(signature) 
    EventMachine::stop_server signature 
end 

Vì vậy, bây giờ bạn có thể bắt đầu và ghi lại chữ ký và ngừng sử dụng chữ ký sau đó. Không có mã bẫy trong phương thức bắt đầu tại thời điểm đó chữ ký không xác định. Vì bạn đang chụp sig bên ngoài phương pháp bạn có thể bẫy bên ngoài quá và sử dụng sig được lưu trữ ở đó.

+0

Đây là những gì tôi đã kết thúc. – MobileOverlord

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