# A basic chat program

**URL:** <https://www.ruby-forum.com/t/a-basic-chat-program/72400>\
**Category:** Ruby\
**Created:** [October 17, 2006, 12:24am UTC](https://www.ruby-forum.com/t/a-basic-chat-program/72400 "2006-10-17T00:24:54Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![teddio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b3f665/32.png) [@teddio](https://www.ruby-forum.com/u/teddio)\
**Post date:** [October 17, 2006, 12:24am UTC](https://www.ruby-forum.com/t/a-basic-chat-program/72400/1 "2006-10-17T00:24:54Z")

</div>

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  
{”\<command”, function\_name} so that when they type the command that’s  
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.

---

<div class="post-metadata">

**Author:** ![teddio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b3f665/32.png) [@teddio](https://www.ruby-forum.com/u/teddio)\
**Post date:** [October 17, 2006, 12:48am UTC](https://www.ruby-forum.com/t/a-basic-chat-program/72400/2 "2006-10-17T00:48:04Z")

</div>

On 10/17/06, Michael H. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> {“\<command”, function\_name} so that when they type the command that’s  
> 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.

---

<div class="post-metadata">

**Author:** ![teddio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b3f665/32.png) [@teddio](https://www.ruby-forum.com/u/teddio)\
**Post date:** [October 17, 2006, 2:56am UTC](https://www.ruby-forum.com/t/a-basic-chat-program/72400/3 "2006-10-17T02:56:42Z")

</div>

Michael,

Jon L. is developing a mud server which should have most of the  
functionality and architecture you’re looking for, it would be a good  
example to see how things are put together.

Unfortunately Lambert’s servers are offline and I don’t know when  
they’re coming back on; however there is an archive of the 07-07-2006  
2.10 release at this site:

[http://www.mudmagic.com/codes/server-snippet/2437](http://www.mudmagic.com/codes/server-snippet/2437)

best, George

---

<div class="post-metadata">

**Author:** ![teddio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b3f665/32.png) [@teddio](https://www.ruby-forum.com/u/teddio)\
**Post date:** [October 17, 2006, 3:08am UTC](https://www.ruby-forum.com/t/a-basic-chat-program/72400/4 "2006-10-17T03:08:45Z")

</div>

Jan S. wrote:

> > commands that can be typed pointing to the function name (like  
> > {“\<command”, function\_name} so that when they type the command that’s  
> > 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](http://ruby-doc.org/stdlib/libdoc/gserver/rdoc/index.html)  
[2][http://ruby-doc.org/stdlib/libdoc/observer/rdoc/index.html](http://ruby-doc.org/stdlib/libdoc/observer/rdoc/index.html)  
[3][http://yaml4r.sourceforge.net/doc/](http://yaml4r.sourceforge.net/doc/)

---

<div class="post-metadata">

**Author:** ![teddio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b3f665/32.png) [@teddio](https://www.ruby-forum.com/u/teddio)\
**Post date:** [October 17, 2006, 3:22am UTC](https://www.ruby-forum.com/t/a-basic-chat-program/72400/5 "2006-10-17T03:22:48Z")

</div>

On 10/17/06, Justin C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> require ‘gserver’  
> user = User.new(io)
> 
> [1][http://ruby-doc.org/stdlib/libdoc/gserver/rdoc/index.html](http://ruby-doc.org/stdlib/libdoc/gserver/rdoc/index.html)  
> [2][http://ruby-doc.org/stdlib/libdoc/observer/rdoc/index.html](http://ruby-doc.org/stdlib/libdoc/observer/rdoc/index.html)  
> [3][http://yaml4r.sourceforge.net/doc/](http://yaml4r.sourceforge.net/doc/)

You may also want to look into eventmachine, a really nice event  
driven framework for developing network applications.

[http://rubyforge.org/projects/eventmachine](http://rubyforge.org/projects/eventmachine)

---

<div class="post-metadata">

**Author:** ![teddio](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/b3f665/32.png) [@teddio](https://www.ruby-forum.com/u/teddio)\
**Post date:** [November 9, 2006, 10:34pm UTC](https://www.ruby-forum.com/t/a-basic-chat-program/72400/6 "2006-11-09T22:34:33Z")

</div>

On Oct 16, 2006, at 5:24 PM, Michael H. wrote:

> Okay I’m looking to make a basic chat program that I can connect to  
> via  
> telnet for learning purposes.

Page 533 of the Ruby Cookbook has a slim but functional chat server  
in about 30 lines of Ruby code.

James Edward G. II
