From: Justin Collins Date: 2006-10-17T10:07:27+09:00 Subject: Re: A basic chat program Jan Svitok wrote: > On 10/17/06, Michael Hall wrote: >> Okay I'm looking to make a basic chat program that I can connect to via >> telnet for learning purposes. >> >> I want a user to connect then login in or be able to create a new user, >> new users would be saved as files. then when they're in the program they >> can talk on different channels by typing "channel1 " or >> "channel2 " etc. Also I'd like to put the code in different >> files i.e. connection/login/user create code in one file, the >> channel/talk functions in another and in a third file a list of the >> commands that can be typed pointing to the function name (like >> {"> listed there it will find the correct function and run it) I need help >> on how to go about this, psuedo code, code examples etc. > > Have a look at Socket::TCPServer in stdlib. That would be the base for > your server. > You may also want to look at GServer[1] in the standard library, which is probably simpler to use. Putting this together with the Observer[2] class, it makes it fairly simple, as long as you are okay with handling threads and such. I'd recommend using YAML[3] for storing your users and their settings/passwords/etc. For the basic idea, you might start off with something like this (simply echoes input to everyone): require 'gserver' require 'observer' class MyServer < GServer include Observable def initialize(port = 5555, *args) super(port, *args) end def serve(io) user = User.new(io) self.add_observer(user) user.add_observer(self) user.run end def update(message) changed notify_observers(message) end end class User include Observable def initialize(io) @io = io end def update(message) @io.puts message end def run loop do input = @io.gets changed notify_observers(input) end end end MyServer.new.start.join Just run that, and connect a couple of telnet sessions to port 5555. Type in a message and it should be echoed to everyone. Hooray! Note that MyServer and User are both observing each other, so that the server can echo a message from any user to all the others (including the original sender). This simplifies having to worry about threads and queues and such. I hope that will give you some ideas. -Justin [1]http://ruby-doc.org/stdlib/libdoc/gserver/rdoc/index.html [2]http://ruby-doc.org/stdlib/libdoc/observer/rdoc/index.html [3]http://yaml4r.sourceforge.net/doc/