2011-02-04 25 views
7

Estoy probando una demostración de servidor/cliente muy básica. Estoy utilizando socket.io en el cliente (un usuario en un navegador) y eventmachine ejemplo de eco para el servidor. Idealmente, socket.io debería enviar una solicitud al servidor y el servidor imprimirá los datos recibidos. Lamentablemente, algo no está funcionando como esperaba.socket.io y eventmachine en ruby ​​

Fuente se pega aquí:

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); 
     }); 
    }); 

y aquí está el código 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 

Respuesta

9

código de cliente Usted está intentando conectarse a un servidor utilizando el protocolo websockets. Sin embargo, su código de servidor no acepta conexiones de websockets, solo está haciendo HTTP.

Una opción es utilizar la máquina websockets caso plugin:

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

me gustaría ver en el uso Cramp. Es un marco asíncrono con soporte websockets, construido sobre EventMachine. He jugado con las muestras y tengo que admitir que la API se ve elegante y limpia.

0

Me gustaría ver en Plezi.

Su lado del servidor de código de eco podría ser algo como esto:

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 

simplemente escriba en el IRB y el servidor de eco comenzará a correr una vez que salga del IRB utilizando el comando exit.

Plezi es realmente divertido para trabajar con Websockets, HTTP Streaming y solicitudes HTTP RESTful, por lo que es fácil recurrir a aplicaciones de larga duración y servir contenido estático, así como actualizaciones en tiempo real.

Plezi también ha incorporado soporte para Redis, por lo que es posible enviar datos a través de procesos y máquinas.

Cuestiones relacionadas