TCPサーバは リクエストを受け付ける側。
生成段階がやや複雑になる(右右図)。
サーバオブジェクトはソケットの一種だが待受状態の特殊な形態。
そこにクライアントからの接続が確立され、ソケットが生成される(これが通信のサーバ側端点となる)。
open -> (TCPServerオブジェクト) ->accept -> (TCPSocketオブジェクト)
open時に hostの指定は不要(自分のアドレスで待つから)。
あとはクライアントの時と同じ使い方(右図)
(ソースはここにもある)
require 'socket'
port=ARGV.shift || 9999
TCPServer.open(port) do |so|
s=so.accept
while(s.gets) do
puts $_
end
end
so=TCPServer.open(port)
s=so.accept
# ... 途中の処理は省略
s.close # 最後にcloseしておくのが望ましいが
# ちょっと試してみる段階なら気にしなくてもいいだろう
簡単なクライアント(送信だけの一方通行)を作って動かす(ソース(client0.rb))。
require 'socket'
dest=ARGV.shift || 'localhost:9999' # destination (目的地)
host, port = dest.split ':'
port||=9999
TCPSocket.open(host,port) do |s|
while gets do s.puts $_ end # 一箇所訂正しました
end
変更のある主要部(accept以降)のみ示す。
while s.gets do
puts $_ # 画面に表示
s.puts $_ # クライアントにそのまま返送
end
これに接続するためにはクライアントも双方向の動作をする必要がある。
送信のみの時のデータの流れ ↓
双方向にした時
Thread.new do
while gets do s.puts($_) end
end
while s.gets do puts($_) end