せかいや

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

【Ruby】ソケットプログラミング 多重化サーバー

 

selectメソッドにより、動きのあるクライアントを取得することが出来る。
■サーバー

require 'socket'

server = TCPServer.open("localhost",80)
sockets = [server]
loop do
  ready = select(sockets)
  readable = ready[0]
  readable.each do |socket|
    if socket == server
      client = server.accept
      sockets << client
      client.puts Socket.gethostname
      p client.peeraddr
    else
      input = socket.gets
    end
    if !input
      sockets.delete(socket)
      socket.close
      next
    end
    socket.puts(input.reverse)
  end
end

 
■クライアント

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.puts(local)
  socket.flush
  response = socket.readpartial(4096)
  puts response
  p socket
end