ruby中的socket.io和eventmachine

时间:2011-02-04 10:59:28

标签: ruby sockets eventmachine socket.io

我正在尝试一个非常基本的服务器/客户端演示。我在客户端(浏览器中的用户)和服务器的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

3 个答案:

答案 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的支持,因此可以跨进程和机器推送数据。