这是我第一次使用 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.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>