Skip to content

Instantly share code, notes, and snippets.

@lexmihaylov
Created October 2, 2015 11:47
Show Gist options
  • Save lexmihaylov/899e4a089cfe147b1d92 to your computer and use it in GitHub Desktop.
Save lexmihaylov/899e4a089cfe147b1d92 to your computer and use it in GitHub Desktop.
Multithreaded chat server developed in ruby
require 'socket'
require_relative 'client'
class ChatServer
def initialize(port, host)
@host = host || 'localhost'
@port = port
@server = nil
@clients = []
end
public
def listen
start
loop do
socket = @server.accept
client = Client.new
@clients.push(client)
current_client_id = @clients.size - 1
socket.puts('Wellcome. Nickname expected:')
# process the message sent by the client
thread = process_request(socket, current_client_id)
client.socket = socket
client.thread = thread
end
end
def remove_client(id)
@clients.delete_at(id)
end
def shutdown
@clients.each do |client|
begin
client.socket.puts("** Connection closed by server **")
client.socket.close
client.thread.exit
rescue
## socket closed
end
end
end
def process_request(socket, id)
return Thread.new do
name = socket.gets.strip
broadcast_messages('#', name + ' connected')
loop do
message = socket.gets
if message.nil?
remove_client(id)
broadcast_messages('#', name + ' disconnected')
socket.close
Thread.current.exit
return
end
broadcast_messages(name, message)
end
end
end
def broadcast_messages(name, message)
@clients.each do |client|
# puts "#{name}:> #{message}"
client.socket.puts(name +':> ' + message)
end
end
def start
@server = TCPServer.new(@host, @port)
end
end
class Client
attr_accessor :socket, :thread
def initialize(socket = nil, thread = nil)
@socket = socket
@thread = thread
end
end
require_relative "libs/chat_server"
server = ChatServer.new(1538, '0.0.0.0')
trap("INT") do
puts 'Server shutting down ...'
server.shutdown
puts 'Server Terminated'
exit;
end
server.listen
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment