【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