2012-10-16 6 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

Logic은 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 체크 아웃이 - 멋진 채팅방이 예