WEBrick::GenericServerの動作
リファレンスには使い方ほとんど乗ってないので使い方の説明。 ただし僕もリファレンス読んで多少使ってソースの関係有そうなところ見た程度なので大した内容はかけないし正確じゃないかもしれない。あしからず。
1. とりあえずWEBrick::GenericServerを継承したクラスを作る。走らせるのはこのクラスのインスタンス。
2. WEBrick::GenericServerを継承して作ったクラスにrunメソッドを定義する。runメソッドはTCPSocketを引数にとる。
こんな感じ。
class Server < WEBrick::GenericServer
- def run(sock)
- // ほげほげ
end
あとはServer.newして返ってきたインスタンスのstartインスタンスメソッド呼ぶだけ。 WEBrick::GenericServerのイニシャライザはHashを引数にとる。これの:Port要素にポート番号を指定しないと動かないので注意。
実際に接続した時のWEBrick::GenericServerのサブクラスは以下のように動作する
クライアントA(仮)が接続 ー> Threadを作成 ー> 作成したThreadでrunが呼ばれる。runに与える引数はAと通信するTCPSocket
頑張ればチャットサーバーとして使えなくもないサーバー
使うにはtelnetで6667番ポートに接続する。ちなみに6667番ポートはIRCがよく使うポート。
require 'webrick/server'
class Server < WEBrick::GenericServer
def initialize(config={:Port => 6667})
- @clients = [] super(config) Signal.trap(:INT) do
- exit!
@clients << socket socket.print('What is your name?: ') nick = socket.gets.chomp loop do
- s = socket.gets puts("#{nick}: #{s}") @clients.each do |client|
- client.puts("#{nick}: #{s}")
- s = socket.gets puts("#{nick}: #{s}") @clients.each do |client|
- @clients = [] super(config) Signal.trap(:INT) do
end
Server.new.start