[#6862] Re: http_get.rb — 青山 和光 <PXN11625@...>
In-Reply-To: [ruby-list:6844] Re: http_get.rb
藤本です、こんにちは。
まつもと ゆきひろです
藤本です、こんにちは。
まつもと ゆきひろです
[#6889] lib/date.rb — Tadayoshi Funaba <tadf@...>
ふなばです。
まつもと ゆきひろです
[#6906] ruby's Icon ? — 藤本尚邦 / FUJIMOTO Hisakuni <hisa@...>
藤本です、こんにちは。
まつもと ゆきひろです
藤本です、こんにちは。
小澤さくです。
藤本です、こんにちは。
藤本です、こんばんは。
まつもと ゆきひろです
にしなです。
[#6918] manual 1.18b index — WATANABE Tetsuya <tetsu@...>
ruby-man-1.1b8 で、name タグがついているものを拾い集めて
まつもと ゆきひろです
小澤さくです。
まつもと ゆきひろです
小澤さくです。
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
前田です。
まつもと ゆきひろです
前田です。
[#6929] Expect lib for ruby — nosuzuki@... (Norio Suzuki)
はじめまして。Perl から ruby or python に乗り換えようと考えている鈴木
[#6954] Re: ruby's Icon ? — nosuzuki@... (Norio Suzuki)
こんばんは。鈴木教郎です。
まつもと ゆきひろです
小澤さくです。
Thu, Mar 05, 1998 at 02:52:26PM +0900 において
まつもと ゆきひろです
原です。
[#6978] win32 版 ruby の getc について — ARIMA Yasuhiro <fit0298@...>
はじめまして。有馬と申します。
[#6983] ext POSIX.setsid — WATANABE Tetsuya <tetsu@...>
拡張ライブラリの作り方はこんな感じでいいでしょうか?
[#7004] gtk 0.99.4 and gtk module — Noritsugu Nakamura <nnakamur@...>
[#7008] builtin class inherit — TEI meiki <tei@...>
鄭です。
前田です。
まつもと ゆきひろです
鄭です。
まつもと ゆきひろです
[#7022] スレッドの終了待ち — densuke@...2.so-net.or.jp
佐藤@東邦大です。
[#7023] infinity — Tadayoshi Funaba <tadf@...>
ふなばです。
前田です。
けいじゅ@日本ラショナルソフトウェアです.
In message <199803091741.CAA05774.keiju@cupmail0.rational.com>
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
けいじゅ@日本ラショナルソフトウェアです.
In message <199803100359.MAA08628.keiju@cupmail0.rational.com>
けいじゅ@日本ラショナルソフトウェアです.
[#7083] about rbc — Kazuhisa YANAGAWA <katze@...>
rbc について二つ質問があります.
けいじゅ@日本ラショナルソフトウェアです.
けいじゅ@日本ラショナルソフトウェアです.
[#7107] calender-html.rb (Re: call for scripts) — Shin-ichiro HARA <sinara@...>
原です。
原です。
原です。
ごとけんです
原です。
原です。
[#7111] How to simulate Perl's DATA file handle — OZAWA Sakuro <crouton@...>
小澤さくです.
[#7126] do end or {} — Eiji-usagi-MATSUmoto <ematsu@...>
うさぎです
[#7145] gsub — WATANABE Tetsuya <tetsu@...>
gsub について
[#7147] each_char — TEI meiki <tei@...>
鄭です。
[#7153] please apply me — SHUDOH Kazuyuki <shudoh@...>
首藤といいます。
まつもと ゆきひろです
[#7192] I hope join. — Takashi Shimizu <simtak@...>
清水と申します。
[#7208] for in bsh — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
まつもと ゆきひろです
小澤さくです。
まつもと ゆきひろです
前田です。
けいじゅ@日本ラショナルソフトウェアです.
[#7222] jcode.rb — NAGAI Hidetoshi <nagai@...>
はじめまして.永井@知能.九工大と申します.
[#7232] final.rb error? — tateishi@...
立石です。
まつもと ゆきひろです
立石です。
In message <19980326102918.3974.qmail@localhost>
まつもと ゆきひろです
In message <199803270403.NAA00909@picachu.netlab.co.jp>
[#7244] [Q] test file1 -nt file2 — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
[#7257] TkScale.new(parent){to -0.1} — gotoken@... (GOTO Kentaro)
ごとけんです
[#7259] Socket#shutdown — keiju@... (Keiju ISHITSUKA)
けいじゅ@日本ラショナルソフトウェアです.
まつもと ゆきひろです
けいじゅ@日本ラショナルソフトウェアです.
[ruby-list:7121] simple_chat_server.rb
さらにシンプルにしました。
listen ウィンドウ用の Queue の使用をやめる事により、接続待ちのメインス
レッド以外のスレッドはすぐに消えて行くようになったので、効率もアップし
ました。
#!/usr/local/bin/ruby
#
# simple_chat_server.rb
# Wakou Aoyama <pxn11625@niftyserve.or.jp>
require 'socket'
require 'thread'
require 'kconv'
require 'cgi-lib'
CR = "\015"
LF = "\012"
EOL = CR + LF
def add_http_header(content, option = '') # ===== add HTTP header
'HTTP/1.0 200 OK' + EOL +
('Pragma: no-cache' + EOL if 'no-cache' == option) +
('Content-length: ' + content.length + EOL if not 'no-length' == option) +
'Content-type: text/html' + EOL + EOL +
content
end
def send_for_all_members(message) # ===== send message
$members.each_value do |listener| # delivery for each listener
begin
listener['listen_window'] << message # delivery the message
rescue # if listener was logouted
handle = listener['handle']
$members.delete(listener['no'])
send_for_all_members( '(' + handle + " is logout.)<BR>\n" )
end
end
end
def talk_window(sock, my) # ===== talk window (post message)
query = CGI.new(sock)
if /\/HA (.+)/i =~ query.inputs['input'] # change handle
send_for_all_members(
'(change handle. "' + my['handle'] + '" --> "' +
Kconv.toeuc($1) + "\")<BR>\n" )
my['handle'] = Kconv.toeuc($1)
elsif query.inputs.include?('input') and '' != query.inputs['input']
send_for_all_members(my['handle'] + ' > ' +
Kconv.toeuc( (query.inputs['input'] or '') ) + "<BR>\n" )
end
sock << add_http_header(
%|<BODY BGCOLOR="white">
<FORM METHOD="post" ACTION="/talk#{my['no']}.html" NAME="input">
<B>#{my['handle']} > </B>
<INPUT TYPE="text" NAME="input" SIZE="60">
<INPUT TYPE="submit" VALUE="send">
</FORM>|.gsub(/^ /, ''))
sock.shutdown(2)
end
def listen_window(sock, my) # ===== listen window
my['listen_window'] = sock
sock << add_http_header(
%|<BODY BGCOLOR="white">
<H1>Welcome!<BR>simple chat server.</H1>
<P><B>Powerd by
<A HREF="http://www.netlab.co.jp/ruby/jp/">
Ruby</A>.</B></P>
<P>change handle. input like this.<BR>
<TT>/HA handle</TT></P>|.gsub(/^ /, ''), 'no-length')
send_for_all_members( '(' + my['handle'] + " is login.)<BR>\n" )
end
def new_access(sock, my) # ===== new access
sock << add_http_header(
%|<TITLE>CHAT</TITLE>
<FRAMESET ROWS="*, 60">
<FRAME SRC="/listen#{my['no']}.html">
<FRAME SRC="/talk#{my['no']}.html">
</FRAMESET>|.gsub(/^ /, ''), 'no-cache')
sock.shutdown(2)
end
def session(sock)
head = ''
head += sock.read(1) while /#{EOL}#{EOL}|#{LF}#{LF}|#{CR}#{CR}/n !~ head
case head # analyze http header
when /^GET\s+([^?\s]+)\??([^\s]*)/
ENV['REQUEST_METHOD'] = 'GET'
file_name = $1
ENV['QUERY_STRING'] = ($2 or '').to_s
when /^POST\s+([^\s]+)/
ENV['REQUEST_METHOD'] = 'POST'
file_name = $1
ENV['CONTENT_LENGTH'] = head.scan(/^Content-length:\s*(\d+)/i)[0].to_s
end
case file_name
when %r|^/$| # ===== new access
$serial_no += 1
$members[$serial_no] = { 'no' => $serial_no,
'handle' => 'No.' + $serial_no.to_s}
new_access(sock, $members[$serial_no])
when %r|^/talk(\d+).html$| # ===== talk window (post message)
talk_window(sock, $members[$1.to_i])
when %r|^/listen(\d+).html$| # ===== listen window
listen_window(sock, $members[$1.to_i])
else # ===== file not found
sock << add_http_header('<H1>file not found</H1>')
sock.shutdown(2)
end
end
PORT = ARGV.shift || 8080
$serial_no = 0
$members = {}
port = TCPserver.open(PORT)
trap('PIPE', 'IGNORE')
STDERR.print (Time.now, "\tserver is on #{port.addr[1]}\n")
while TRUE
sock = port.accept # stand by for accept
Thread.start do # divide the work
session(sock)
end
end
青山 和光 Wakou Aoyama <pxn11625@niftyserve.or.jp>