1

EventMachine でチャット サーバーを作成しようとしています。スレッドセーフな方法で、ある EventMachine 接続から別の EventMachine 接続にメッセージを渡すにはどうすればよいですか?

メッセージング プロトコル (Stomp) がサポートされているようですが、その使用方法がわかりません。どんな助けでも大歓迎です。

EventMachine で Stomp - http://eventmachine.rubyforge.org/EventMachine/Protocols/Stomp.html

4

2 に答える 2

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もチェックしてください- 素敵なチャットルームの例があります

于 2013-11-13T10:03:21.150 に答える
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

アップデート

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
于 2012-10-16T07:26:17.117 に答える