2017-12-13 5 views
2

Ich versuche, eventmachine und haben einen einfachen Server:Schlaf mit eventmachine

require 'eventmachine'                          

module Handler                            
    def receive_data(data)                         
    send_data "#{Time.now}: Received data: #{data}"                   
    sleep 3                             
    send_data "#{Time.now}: Message after 3 seconds\r\n"                 
    end                              
end                               

EventMachine.run do                           
    EventMachine.start_server('0.0.0.0', 1234, Handler)                  
end 

Wenn ich den Server und eine Verbindung zu ihm über Telnet betreibe ich habe folgendes:

[email protected]:/# telnet localhost 1234 
Trying 127.0.0.1... 
Connected to localhost. 
Escape character is '^]'. 
hello world 
2017-12-13 05:35:26 +0000: Received data: hello world 
2017-12-13 05:35:29 +0000: Message after 3 seconds 

Es scheint in Ordnung aber es verhält sich auf unerwartete Weise. Wenn ich hello world an den Server sende, erwarte ich, dass ich Received data: hello world Nachricht praktisch gleichzeitig zurückbekomme und nach 3 Sekunden erwarte ich Message after 3 seconds Nachricht. Aber jetzt, nachdem ich zuerst einen Befehl an den Server gesendet habe, bekomme ich nichts zurück und nach 3 Sekunden bekomme ich zwei Nachrichten zusammen.

Wie kann ich gewünschte Weise erreichen?

+0

Können Sie 'puts' anstelle von' send_data' anrufen? –

+0

Natürlich kann ich, aber es wird nur die Zeile auf der Serverseite drucken. Aber ich möchte diese Nachricht sofort auf der Client-Seite bekommen und nach 3 Sekunden bekomme ich auch die zweite Nachricht auf dem Client. – user3309314

Antwort

1

Verwenden Sie keinen Schlaf, verwenden Sie einen Timer.

require 'eventmachine' 

module Handler 
    def receive_data(data) 
    send_data "#{Time.now}: Received data: #{data}" 
    EventMachine::Timer.new(3) do 
     send_data "#{Time.now}: Message after 3 seconds\r\n" 
    end 
    end 
end 

EventMachine.run do 
    EventMachine.start_server('127.0.0.1', 1234, Handler) 
end 
+0

Danke. Es ist was ich wollte – user3309314