2012-12-20 33 views
0

是否可以使用帶有websockets的web服務器作爲另一個服務器的包裝從「真實服務器」傳遞消息到web客戶端並返回?用websocket包裝套接字

我好奇這個,因爲我有一個用Ada編寫的遊戲服務器,它有一個與操作系統綁定的客戶端。我想將這個客戶端交換到一個基於Javascript的web客戶端,這樣遊戲就可以在普通瀏覽器中播放。可以做什麼?

+0

這取決於網絡服務器 – Philipp

+1

谷歌「html5遠程桌面」 – Barmar

+0

啊,然後它似乎工作很好。我可能會在ruby中使用ruby/sinatra網絡服務器,因爲它的靈活性和即將用於Web界面的其他部分也是如此。 –

回答

0

我在ruby中使用下面的代碼來封裝我的套接字。該代碼改編自em-websocket-proxy。在我的項目中可能有一些細節,但通常切換remote_host和remote_port並連接到localhost:3000應該通過websocket爲您的服務器建立一個新的連接。

require 'rubygems' 
require 'em-websocket' 
require 'sinatra/base' 
require 'thin' 
require 'haml' 
require 'socket' 


class App < Sinatra::Base 
    get '/' do 
     haml :index 
    end 
end 

class ServerConnection < EventMachine::Connection 

    def initialize(input, output) 
    super 
    @input = input 
    @output = output 
    @input_sid = @input.subscribe { |msg| send_data msg+ "\n" } 
    end 

    def receive_data(msg) 
    @output.push(msg) 
    end 

    def unbind 
    @input.unsubscribe(@input_sid) 
    end 

end 

# Configuration of server 
options = {:remote_host => 'your-server', :remote_port => 4000} 

EventMachine.run do 

    EventMachine::WebSocket.start(:host => '0.0.0.0', :port => 8080) do |ws| 
    ws.onopen { 
     output = EM::Channel.new 
     input = EM::Channel.new 

     output_sid = output.subscribe { |msg| ws.send msg; } 

     EventMachine::connect options[:remote_host], options[:remote_port], ServerConnection, input, output 

     ws.onmessage { |msg| input.push(msg)} 

     ws.onclose { 
     output.unsubscribe(output_sid) 
     } 
    } 
    end 

    App.run!({:port => 3000}) 

end 

享受!並詢問你是否有問題。

1

與某些人認爲的相反,Websockets並不是純粹的套接字。原始數據被封裝並被尚未廣泛支持的websocket協議掩蓋。這意味着一個不是爲它設計的應用程序,你不能直接通過網絡套接字與它通信。

當你有一個應用程序使用基於普通套接字的協議,並且你想用它與websockets進行通信時,有兩種選擇。

您可以使用websocket網關來完成websocket流量的解包/打包,並將其作爲純套接字流量轉發給應用程序。這樣做的好處是不需要修改應用程序,但它的缺點是它也會掩蓋客戶端的真實IP地址,這對某些應用程序可能會或可能不會成爲問題。

或者你直接在你的應用程序中實現websocket。這可以通過服務器監聽兩個不同的端口來完成,一個用於正常連接,一個用於websocket連接。通過websocket-port接收或發送的任何數據在發送/接收之前都會通過您的websocket實現發送,否則通過相同的例程進行處理。

3

這就是websockify的用途。它旨在連接WebSocket客戶端和常規TCP服務器。它是作爲noVNC的一部分創建的,該程序是可連接到普通VNC服務器的HTML5 VNC應用程序。但是,websockify是通用的,現在有許多其他項目正在使用它。

免責聲明:我創建了websockify和noVNC。

1

Kaazing HTML5 Gateway是將基於TCP的協議引入Web客戶端的好方法。 Kaazing網關基本上將您的協議運行在TCP之上,並將其轉換爲WebSocket,以便您可以訪問客戶端中的協議。您仍然需要爲後端使用的協議編寫JavaScript協議庫。但是,如果您可以在TCP上使用協議,那麼使用JavaScript就不難實現。

2

您可以輕鬆地通過使用AWS做到這一點:

http://libre.adacore.com/tools/aws/

有對AWS的WebSockets支持,你可以利用它進行正常插座支持優秀插座(AWS.Net)封裝。

相關問題