我正在尝试使用多个房间在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
}
room.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
player.rb
class Player
def initialize(connection, room)
@room = room
while line = connection.gets
puts 'got line ' + line
room.broadcast line
end
end
end
问题在于,当我从播放器调用Room#广播时 - 它告诉我@players是零,但事实并非如此!怎么会这样? 我不确定我做的一切都是正确的(我的感觉告诉我玩家不应该直接链接到房间),但它简化了示例。
答案 0 :(得分:1)
这与线程无关。
您应该将初始化@players = []
放入initialize
的{{1}}。
您拥有它的方式,不要初始化对象的实例变量,而是初始化类Room
的实例变量。
答案 1 :(得分:1)
您将@players
设置为Room
的类实例变量。
而不是这个,你应该把它放在你的initialize
方法中:
def initialize
@players = []
end