1

我正在尝试在 Ruby 上实现一个带有多个房间的套接字服务器,例如,人们可以在其中互相发送聊天消息。

代码很简单: 主文件:

require 'room'  
require 'socket'
room = Room.new

### handle connections
Thread::abort_on_exception=true
server = TCPServer.open(2000)   # Socket to listen on port 2000
puts 'Open socket at 2000 port'
loop {                          # Servers run forever
  room.handle_player server.accept
}

房间.rb

require 'player'
class Room
  @players = []

  attr_accessor :players

  def initialize

  end

  def handle_player(connection)
    puts ' New client connected!'
    Thread.start(connection, self) do |client, room|
      player = Player.new connection, room
      @players.push player
    end
  end

  def broadcast(message)
    puts "Players is #{@players.class}" #NilClass !
  end
end

播放器.rb

class Player
  def initialize(connection, room)
    @room = room
    while line = connection.gets
      puts 'got line ' + line
      room.broadcast line
    end
  end
end

问题是,当我从玩家那里调用 Room#broadcast 时,它告诉我 @players 为 nil,但事实并非如此!怎么可能?我不确定我做的一切是否正确(我的感觉告诉我玩家不应该直接链接到房间),但它简化了示例。

4

2 回答 2

1

这与线程无关。

您应该将该初始化@players = []放入initialize.Room

您拥有它的方式,您不会初始化对象的实例变量,而是初始化类的实例变量Room

于 2013-07-12T15:13:08.187 回答
1

您设置@players为 aRoom的类实例变量。

而不是这个,你应该把它放在你的initialize方法中:

def initialize
  @players = []
end
于 2013-07-12T15:13:59.707 回答