Login
Immutable PageDiscussionInfoAttachments
iz/MMA2012 Summer Hackathon/WEBrick::GenericServerの動作

MMA

WEBrick::GenericServerの動作

リファレンスには使い方ほとんど乗ってないので使い方の説明。 ただし僕もリファレンス読んで多少使ってソースの関係有そうなところ見た程度なので大した内容はかけないし正確じゃないかもしれない。あしからず。

1. とりあえずWEBrick::GenericServerを継承したクラスを作る。走らせるのはこのクラスのインスタンス。

2. WEBrick::GenericServerを継承して作ったクラスにrunメソッドを定義する。runメソッドはTCPSocketを引数にとる。

こんな感じ。

   1 class Server < WEBrick::GenericServer
   2 
   3   def run(sock)
   4     // ほげほげ
   5   end
   6 
   7 end

あとはServer.newして返ってきたインスタンスのstartインスタンスメソッド呼ぶだけ。 WEBrick::GenericServerのイニシャライザはHashを引数にとる。これの:Port要素にポート番号を指定しないと動かないので注意。

実際に接続した時のWEBrick::GenericServerのサブクラスは以下のように動作する

クライアントA(仮)が接続 ー> Threadを作成 ー> 作成したThreadでrunが呼ばれる。runに与える引数はAと通信するTCPSocket

頑張ればチャットサーバーとして使えなくもないサーバー

使うにはtelnetで6667番ポートに接続する。ちなみに6667番ポートはIRCがよく使うポート。

   1 require 'webrick/server'
   2 
   3 class Server < WEBrick::GenericServer
   4 
   5   def initialize(config={:Port => 6667})
   6     @clients = []
   7     super(config)
   8     Signal.trap(:INT) do
   9       exit!
  10     end
  11   end
  12 
  13   def run(socket)
  14     @clients << socket
  15     socket.print('What is your name?: ')
  16     nick = socket.gets.chomp
  17     loop do 
  18       s = socket.gets
  19       puts("#{nick}: #{s}")
  20       @clients.each do |client|
  21         client.puts("#{nick}: #{s}")
  22       end
  23     end
  24   end
  25 
  26 end
  27 
  28 Server.new.start

iz/MMA2012 Summer Hackathon/WEBrick::GenericServerの動作 (last edited 2012-08-23 19:42:03 by iz)