这是我第一次使用websockets而我无法让我的服务器工作。以下是我从this github page复制的简单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
}
然后我从this simple echo test复制了html
,只是将网址从ws://echo.websocket.org
更改为ws://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
由于此测试中的数据是硬编码的,因此我预计SENT
和RESPONSE
消息是相同的。但是,我收到以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>