Skip to content

Instantly share code, notes, and snippets.

@luozhonghai
Forked from pfleidi/fiberchat.rb
Last active August 29, 2015 14:26
Show Gist options
  • Select an option

  • Save luozhonghai/f71f9386d984484d5655 to your computer and use it in GitHub Desktop.

Select an option

Save luozhonghai/f71f9386d984484d5655 to your computer and use it in GitHub Desktop.

Revisions

  1. @pfleidi pfleidi revised this gist Feb 20, 2011. 1 changed file with 8 additions and 8 deletions.
    16 changes: 8 additions & 8 deletions fiberchat.rb
    Original 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|
    @reading.push(socket)
    loop {
    if message.nil?
    chat = socket.gets
    @@ -52,19 +53,18 @@ def run_acceptor
    readable, writable = IO.select(@reading, @writing)

    readable.each do |socket|
    client = nil
    if socket == @server_socket
    client = add_client
    add_client
    else
    client = @clients[socket]
    message = client.resume
    puts "client #{socket} sent: #{message}"
    broadcast(message)
    end
    message = client.resume
    puts "client #{socket} sent: #{message}"
    broadcast(message)
    end
    end
    end
    end
    end

    server = ChatServer.new
    server.start
    server.start
  2. @pfleidi pfleidi created this gist Feb 19, 2011.
    70 changes: 70 additions & 0 deletions fiberchat.rb
    Original 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