Created
August 31, 2012 14:23
-
-
Save addisaden/3553434 to your computer and use it in GitHub Desktop.
A Simple Server-Client Chat with dRuby.
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 characters
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 | |
} |
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 characters
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