-
-
Save luozhonghai/f71f9386d984484d5655 to your computer and use it in GitHub Desktop.
Revisions
-
pfleidi revised this gist
Feb 20, 2011 . 1 changed file with 8 additions and 8 deletions.There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -20,8 +20,9 @@ def start def add_client socket = @server_socket.accept_nonblock @reading.push(socket) @clients[socket] = Fiber.new do |message| loop { if message.nil? chat = socket.gets @@ -52,19 +53,18 @@ def run_acceptor readable, writable = IO.select(@reading, @writing) readable.each do |socket| if socket == @server_socket add_client else client = @clients[socket] message = client.resume puts "client #{socket} sent: #{message}" broadcast(message) end end end end end server = ChatServer.new server.start -
pfleidi created this gist
Feb 19, 2011 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,70 @@ require 'rubygems' require 'socket' include Socket::Constants class ChatServer def initialize @reading = Array.new @writing = Array.new @clients = Hash.new end def start @server_socket = TCPServer.new('localhost', 4242) @reading.push(@server_socket) run_acceptor end private def add_client socket = @server_socket.accept_nonblock @clients[socket] = Fiber.new do |message| @reading.push(socket) loop { if message.nil? chat = socket.gets socket.flush message = Fiber.yield(chat.strip) else socket.puts("chat: #{message.strip}") socket.flush message = Fiber.yield end } end puts "client #{socket} connected" return @clients[socket] end def broadcast(message) @clients.each_pair do |key, value| puts "invoking client #{key}" value.resume(message) end end def run_acceptor puts "accepting on shared socket (localhost:4242)" loop do puts "current clients: #{@clients.length}" readable, writable = IO.select(@reading, @writing) readable.each do |socket| client = nil if socket == @server_socket client = add_client else client = @clients[socket] end message = client.resume puts "client #{socket} sent: #{message}" broadcast(message) end end end end server = ChatServer.new server.start