我正在尝试在 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,但事实并非如此!怎么可能?我不确定我做的一切是否正确(我的感觉告诉我玩家不应该直接链接到房间),但它简化了示例。