是否可以使用帶有websockets的web服務器作爲另一個服務器的包裝從「真實服務器」傳遞消息到web客戶端並返回?用websocket包裝套接字
我好奇這個,因爲我有一個用Ada編寫的遊戲服務器,它有一個與操作系統綁定的客戶端。我想將這個客戶端交換到一個基於Javascript的web客戶端,這樣遊戲就可以在普通瀏覽器中播放。可以做什麼?
是否可以使用帶有websockets的web服務器作爲另一個服務器的包裝從「真實服務器」傳遞消息到web客戶端並返回?用websocket包裝套接字
我好奇這個,因爲我有一個用Ada編寫的遊戲服務器,它有一個與操作系統綁定的客戶端。我想將這個客戶端交換到一個基於Javascript的web客戶端,這樣遊戲就可以在普通瀏覽器中播放。可以做什麼?
我在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
享受!並詢問你是否有問題。
與某些人認爲的相反,Websockets並不是純粹的套接字。原始數據被封裝並被尚未廣泛支持的websocket協議掩蓋。這意味着一個不是爲它設計的應用程序,你不能直接通過網絡套接字與它通信。
當你有一個應用程序使用基於普通套接字的協議,並且你想用它與websockets進行通信時,有兩種選擇。
您可以使用websocket網關來完成websocket流量的解包/打包,並將其作爲純套接字流量轉發給應用程序。這樣做的好處是不需要修改應用程序,但它的缺點是它也會掩蓋客戶端的真實IP地址,這對某些應用程序可能會或可能不會成爲問題。
或者你直接在你的應用程序中實現websocket。這可以通過服務器監聽兩個不同的端口來完成,一個用於正常連接,一個用於websocket連接。通過websocket-port接收或發送的任何數據在發送/接收之前都會通過您的websocket實現發送,否則通過相同的例程進行處理。
這就是websockify的用途。它旨在連接WebSocket客戶端和常規TCP服務器。它是作爲noVNC的一部分創建的,該程序是可連接到普通VNC服務器的HTML5 VNC應用程序。但是,websockify是通用的,現在有許多其他項目正在使用它。
免責聲明:我創建了websockify和noVNC。
Kaazing HTML5 Gateway是將基於TCP的協議引入Web客戶端的好方法。 Kaazing網關基本上將您的協議運行在TCP之上,並將其轉換爲WebSocket,以便您可以訪問客戶端中的協議。您仍然需要爲後端使用的協議編寫JavaScript協議庫。但是,如果您可以在TCP上使用協議,那麼使用JavaScript就不難實現。
您可以輕鬆地通過使用AWS做到這一點:
http://libre.adacore.com/tools/aws/
有對AWS的WebSockets支持,你可以利用它進行正常插座支持優秀插座(AWS.Net)封裝。
這取決於網絡服務器 – Philipp
谷歌「html5遠程桌面」 – Barmar
啊,然後它似乎工作很好。我可能會在ruby中使用ruby/sinatra網絡服務器,因爲它的靈活性和即將用於Web界面的其他部分也是如此。 –