2012-10-16 56 views
1

我正在尝试使用EventMachine编写聊天服务器。如何以线程安全的方式将消息从一个EventMachine连接传递给另一个?在EventMachine连接之间传递消息

我看到一个消息协议(Stomp)被支持,但我无法弄清楚如何使用它。任何帮助表示赞赏。

践踏在EventMachine的 - http://eventmachine.rubyforge.org/EventMachine/Protocols/Stomp.html

+1

1. EM Stomp协议实现是一个客户端,而不是服务器。 2. EM不必对Thread做任何事情(除非在某些特殊情况下使用'defer') –

回答

0

尝试与在存储器消息调度开始了。

require 'thread' 

class Room 
    def initialize 
    @users = [] 
    end 

    def join(user) 
    @users << user 
    end 

    def leave(user) 
    @user.delete(user) 
    end 

    def broadcast(message) 
    @users.each do |user| 
     user.enqueue(message) 
    end 
    end 
end 

class User 

    def initialize 
    @mutex = Mutex.new 
    @queued_messages = [] 
    end 

    def enqueue(message) 
    @mutex.synchronize do 
     @queued_message << message 
    end 
    end 

    def get_new_messages 
    @mutex.synchronize do 
     output = @queued_messages 
     @queued_messages = [] 
    end 
    return output 
    end 

end 

UPDATE

ROOM = Room.new 

class Connection 
    def user_logged_in 
    # @user = ... 
    ROOM.join(@user) 
    end 

    def received_message(message) 
    ROOM.broadcast(message) 
    end 

    def receive_send_more_messages_request(req) 
    messages = @user.get_new_messages 
    # write messages 
    end 

    def connection_closed 
    ROOM.leave(@user) 
    end 
end 
+0

逻辑发生在EventMachine :: Connection对象内部,所以我怎么让它们唤醒并检查一个消息? – sparkymat

1

http://eventmachine.rubyforge.org/EventMachine/Channel.html

你可以尝试在这些方针的东西:

require 'eventmachine' 

class Chat < EventMachine::Connection 
    def initialize channel 
    @channel = channel 
    end 

    def post_init 
    send_data 'Hello' 
    @sid = @channel.subscribe do |msg| 
     send_data msg 
    end 
    end 

    def receive_data(msg) 
    @channel.push msg 
    end 

    def unbind 
    @channel.unsubscribe @sid 
    end 
end 

EM.run do 
    @channel = EventMachine::Channel.new 
    EventMachine.start_server '127.0.0.1', 8081, Chat, @channel 
end 

编辑:还检查了https://github.com/eventmachine/eventmachine/tree/master/examples/guides/getting_started - 有一个很好的聊天室例子

相关问题