たとえば、人々がチャットメッセージを互いに送信できるマルチプルルームを備えた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#broadcast を呼び出すと、@players が nil であると通知されますが、そうではありません! それはどうしてですか?すべてを正しく行っているかどうかはわかりませんが (私の感覚では、プレイヤーが部屋に直接リンクするべきではないと感じています)、例を単純化しています。