Skip to content

Instantly share code, notes, and snippets.

@addisaden
Created August 31, 2012 14:23
Show Gist options
  • Save addisaden/3553434 to your computer and use it in GitHub Desktop.
Save addisaden/3553434 to your computer and use it in GitHub Desktop.
A Simple Server-Client Chat with dRuby.
require "drb/drb"
print "Bitte geben Sie die IP des Servers ein: "
ip = gets.strip
print "Bitte geben Sie den Port des Servers ein: "
port = gets.strip.to_i
port = 3000 if port == 0
server = DRbObject.new_with_uri("druby://#{ ip }:#{ port }")
key = nil
username = ""
while key == nil do
print "Bitte geben Sie einen Usernamen ein: "
username = gets.strip
key = server.register(username)
puts "Username schon vorhanden." if key == nil
end
Thread.new(server,key) { |s,k|
loop {
msgs = s.hear(k)
msgs.each { |m|
puts "#{ m[0].hour }:#{ m[0].min }:#{ m[0].sec } | #{ m[1] }: \"#{ m[2] }\""
}
sleep 1
}
}
loop {
mymsg = ""
mymsg = gets.strip
unless server.say(key, mymsg) then
puts "Error: Nachricht konnte nicht gesendet werden."
end
}
require "drb/drb"
require "digest"
class Chatroom
def initialize(port=3000)
@users = {}
@msg = {}
@server = DRb.start_service("druby://localhost:#{ port.to_i }", self)
puts "Chatrooroom started at #{ @server.uri }"
@server.thread.join()
end
def register(username)
# replace whitespaces with _
username = username.gsub(/\s+/, "_")
# check if username is free
return nil if @users.values.include? username
# generate key
key = newKey()
# add user to @users and @msg
@users[key] = username
@msg[key] = []
# return the key
return key
end
def say(key, msg)
return false unless @users.keys.include? key
message = [Time.now, @users[key], "#{ msg }"]
@msg.each { |k,v|
if k != key then
@msg[k] << message
end
}
return true
end
def hear(key)
return nil unless @users.keys.include? key
msgs = @msg[key]
@msg[key] = []
return msgs
end
private
def newKey
return Digest::MD5.hexdigest Time.now.to_f.to_s
end
end
port = ARGV[0].to_i
Chatroom.new(port)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment