2

这是我第一次使用 websockets,我无法让我的服务器正常工作。下面是我从这个 github 页面em-websocket复制的简单服务器。它现在基本上没有变化,所以它看起来像这样:

require 'em-websocket'

EM.run {
  EM::WebSocket.run(:host => "0.0.0.0", :port => 8080) do |ws|
    ws.onopen { |handshake|
    puts "WebSocket connection open"

    # Access properties on the EM::WebSocket::Handshake object, e.g.
    # path, query_string, origin, headers

    # Publish message to the client
    ws.send "Hello Client, you connected to #{handshake.path}"
  }

  ws.onclose { puts "Connection closed" }

  ws.onmessage { |msg|
    puts "Recieved message: #{msg}"
    ws.send("Pong: #{msg}")
  }
end
}

html然后我从这个简单的 echo test复制了,只需将 url 从更改ws://echo.websocket.orgws://localhost:3000/websocket.rb(.rb 文件位于app我的 Rails 项目的目录中)。

当我从该页面运行测试时,我得到以下结果:

CONNECTED

SENT: WebSocket rocks

RESPONSE: [["client_connected",{"id":null,"channel":null,"data":{"connection_id":70297110490160},"success":null,"result":null,"server_token":null}]]

DISCONNECTED

由于此测试中的数据是硬编码的,因此我预计SENTRESPONSE消息是相同的。但是,我收到了令人困惑的消息,该消息以数据开头,client_connected但只包含null数据。

谁能告诉我发生了什么?我是否连接到我的“服务器”(websockets.rb文件),如果是,我是否只需要对代码进行一些调整,例如创建一个reply方法?同样,这是我第一次尝试使用这项技术,所以如果我在这篇文章中遗漏了任何内容,我深表歉意。

为了更好地衡量,这是在echo测试中运行的代码。

<script language="javascript" type="text/javascript">  
var wsUri = "ws://localhost:3000/websocket.rb"; 
var output;  
function init() { 
    output = document.getElementById("output"); 
    testWebSocket(); 
}  
function testWebSocket() { 
    websocket = new WebSocket(wsUri); 
    websocket.onopen = function(evt) { 
        onOpen(evt) 
}; 
websocket.onclose = function(evt) { 
    onClose(evt) 
}; 
websocket.onmessage = function(evt) { 
    onMessage(evt) 
}; 
websocket.onerror = function(evt) { 
    onError(evt) }; 
}  
function onOpen(evt) { 
    writeToScreen("CONNECTED"); 
    doSend("WebSocket rocks"); 
}  
function onClose(evt) { 
    writeToScreen("DISCONNECTED"); 
}  
function onMessage(evt) { 
    writeToScreen('<span style="color: blue;">RESPONSE: ' + evt.data+'</span>'); 
    websocket.close(); 
}  
function onError(evt) { 
    writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data); 
}  
function doSend(message) { 
    writeToScreen("SENT: " + message);  websocket.send(message); 
}  
function writeToScreen(message) { 
    var pre = document.createElement("p"); 
    pre.style.wordWrap = "break-word"; 
    pre.innerHTML = message; output.appendChild(pre); 
}  
window.addEventListener("load", init, false);  
</script>
<h2>WebSocket Test</h2>  
<div id="output"></div>  
</html>
4

0 回答 0