我正在尝试一个非常基本的服务器/客户端演示。我在客户端(浏览器中的用户)和服务器的eventmachine Echo示例中使用socket.io。理想情况下,socket.io应向服务器发送请求,服务器将打印接收的数据。不幸的是,事情并没有像我期望的那样发挥作用。
来源贴在这里:
socket = new io.Socket('localhost',{
port: 8080
});
socket.connect();
$(function(){
var textBox = $('.chat');
textBox.parent().submit(function(){
if(textBox.val() != "") {
//send message to chat server
socket.send(textBox.val());
textBox.val('');
return false;
}
});
socket.on('message', function(data){
console.log(data);
$('#text').append(data);
});
});
这是ruby代码:
require 'rubygems'
require 'eventmachine'
require 'evma_httpserver'
class Echo < EM::Connection
def receive_data(data)
send_data(data)
end
end
EM.run do
EM.start_server '0.0.0.0', 8080, Echo
end
答案 0 :(得分:9)
您的客户端代码正在尝试使用websockets协议连接到服务器。但是,您的服务器代码不接受websockets连接 - 它只执行HTTP。
一种选择是使用事件机器websockets插件:
https://github.com/igrigorik/em-websocket
EventMachine.run {
EventMachine::WebSocket.start(:host => "0.0.0.0", :port => 8080) do |ws|
ws.onopen {
puts "WebSocket connection open"
# publish message to the client
ws.send "Hello Client"
}
ws.onclose { puts "Connection closed" }
ws.onmessage { |msg|
puts "Recieved message: #{msg}"
ws.send "Pong: #{msg}"
}
end
}
答案 1 :(得分:3)
我会考虑使用Cramp。它是一个支持websockets的异步框架,构建在EventMachine之上。我已经玩过这些样本,我不得不承认API看起来很优雅和干净。
答案 2 :(得分:0)
我会调查Plezi。
您的服务器端回显代码可能如下所示:
require 'plezi'
class EchoCtrl
def index
redirect_to 'http://www.websocket.org/echo.html'
end
def on_message data
# to broadcast the data add:
# broadcast :_send_message, data
_send_message data
end
def _send_message data
response << data
end
end
listen
# you can add, a socket.io route for JSON with socket.io
route '/socket.io', EchoCtrl
route '/', EchoCtrl
只需在IRB中键入它,一旦使用exit
命令退出IRB,echo服务器就会开始运行。
使用和支持Websockets,HTTP Streaming和RESTful HTTP请求,Plezi非常有趣,因此很容易依赖于长时间提取和提供静态内容以及实时更新。
Plezi还内置了对Redis的支持,因此可以跨进程和机器推送数据。