Thursday, March 05, 2009

Simple Chat

Ruby黄本ベースで簡易チャットプログラムを作った
ポイントは
  • threadで複数のクライアントからのメッセージを並列化
  • rclient側もthreadを使い、ソケットに対する出力と入力を分離
  • クライアントを管理するSocksクラスを用意し、クライアントからのmsgをブロードキャストする
  • serv.acceptでクライアントからの入力を待ち受け、入力があったときはブロック引数にそのソケットを渡す

rserv.rb

   1  require "socket"

   2  class Socks

   3    Socks = []

   4    def self.<<(arg)

   5      Socks << arg

   6    end

   7    

   8    def self.puts(msg)

   9      Socks.each { |sock| sock.puts msg }

  10    end

  11    def self.list

  12      Socks.each { |sock| puts sock }

  13    end

  14  end

  15  

  16  TCPServer.open('localhost', 10001) do |serv|

  17    print "waiting clients...\n"

  18    loop do

  19      Thread.start(serv.accept) do |sock|

  20        Socks << sock

  21        puts "#{sock} connected!"

  22        sock.puts "Welcome to RServer!"

  23        while msg = sock.gets

  24          Socks.puts "#{sock} > #{msg}"

  25          puts "#{msg.chomp}:#{sock}"

  26        end

  27      end

  28    end

  29  end


rclient.rb

   1  require "socket"

   2  TCPSocket.open('localhost', 10001) do |sock|

   3    Thread.start do

   4      loop do

   5        if sock.eof?

   6          print "server down!"

   7          sock.close

   8          exit

   9        else

  10          print sock.gets

  11        end

  12      end

  13    end

  14    while msg = gets

  15      sock.print msg

  16    end

  17  end


No comments: