2011-02-04 9 views
7

Próbuję bardzo podstawowej wersji demo serwera/klienta. Używam socket.io na kliencie (użytkownik w przeglądarce) i przykładzie Echo eventmachine dla serwera. Idealnie socket.io powinien wysłać zapytanie do serwera, a serwer wydrukuje otrzymane dane. Niestety, coś nie działa tak, jak tego oczekuję.socket.io i eventmachine w rubinach

źródłowy jest wklejany tutaj:

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

i tu jest kod 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 

Odpowiedz

9

Państwo kod klient próbuje połączyć się z serwerem przy użyciu protokołu WebSockets. Jednak twój kod serwera nie akceptuje połączeń websockets - robi tylko HTTP.

Jedną z opcji jest użycie wtyczki WebSockets maszynowe zdarzenia:

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

będę przyglądać się przy użyciu Cramp. Jest to asynchroniczny framework z obsługą websockets, zbudowany na bazie EventMachine. Grałem z próbkami i muszę przyznać, że API wygląda elegancko i czysto.

0

Zajrzę do Plezi.

Twój kod po stronie serwera echo może wyglądać mniej więcej tak:

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 

wystarczy wpisać go w IRB i serwer echo zaczną być wyświetlane po wyjściu IRB pomocą polecenia exit.

Plezi jest naprawdę zabawny w obsłudze i obsłudze Websockets, HTTP Streaming i RESTful HTTP requestów, więc łatwo można cofnąć się po długich ciągnięciach i podawać statyczną zawartość oraz aktualizacje w czasie rzeczywistym.

Plezi również ma wbudowane wsparcie dla Redis, więc możliwe jest przesyłanie danych pomiędzy procesami i maszynami.