せかいや

いまいるここを、おもしろく http://sekai-in-the-box.appspot.com/

【Ruby】ソケットプログラミング リクエストを複数回渡すクライアントの実装

 
ソケットプログラミング第二弾。

今回はクライアント・サーバーが複数回やり取りをするコード。

ポイント

サーバー側でクライアントを切断すると、
以降はそのクライアントインスタンスのputsメソッドは使用できなくなる。

うーん。
ソケットプログラミングは手探り状態やー・・

 
■クライアント

require 'socket'
host, port = ARGV

socket = TCPSocket.open(host, port)
local, peer = socket.addr, socket.peeraddr
STDOUT.print peer,"\n"
STDOUT.puts "using localport #{local}"

begin
  sleep(0.5)
  msg = socket.read_nonblock(4096)
  STDOUT.puts msg
rescue SystemCallError
end

loop do
  STDOUT.print '>'
  STDOUT.flush
  local = STDIN.gets
  break if local.chomp == "exit"
  
  #こうやってsocketを都度生成していれば2回目以降も実施できる
  #ここをコメントアウトするとエラー
  socket = TCPSocket.open(host, port)

  socket.puts(local)
  socket.flush
  response = socket.readpartial(4096)
  puts response
  p socket
end

 
 
■サーバー

require 'socket'
server = TCPServer.open("localhost", 80)
loop {
  client = server.accept
  client.puts("hello")
  client.close
}

■実行結果

["AF_INET", 80, "127.0.0.1", "127.0.0.1"]
using localport ["AF_INET", 63073, "127.0.0.1", "127.0.0.1"]
hello
>cc
hello
#<TCPSocket:fd 4>
>ee
hello
#<TCPSocket:fd 5>
>

 
次は、サーバーの多重化を考えるよ。
⇒こちら