socket.io и eventmachine в рубине - PullRequest
       46

socket.io и eventmachine в рубине

7 голосов
/ 04 февраля 2011

Я пробую очень простую демонстрацию сервера / клиента.Я использую socket.io на клиенте (пользователь в браузере) и пример Echo Eventmachine для сервера.В идеале 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);
        });
    });

и вот код рубина:

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 ]

9 голосов
/ 19 апреля 2011

Ваш клиентский код пытается подключиться к серверу, используя протокол 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
}
3 голосов
/ 23 марта 2012

Я бы посмотрел на использование Cramp .Это асинхронная среда с поддержкой веб-сокетов, построенная на основе EventMachine.Я поиграл с образцами и должен признать, что API выглядит элегантно и чисто.

0 голосов
/ 07 декабря 2014

Я бы посмотрел на 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 и эхо-серверезапустится после того, как вы выйдете из IRB с помощью команды exit.

Plezi - это действительно весело работать и поддерживать Websockets, HTTP Streaming и RESTful HTTP-запросы, поэтому легко вернуться к длительной работе и обслуживаниюстатический контент, а также обновления в режиме реального времени.

Plezi также имеет встроенную поддержку Redis, что позволяет передавать данные по процессам и машинам.

...