# Socket Progamming - Beginner questions

**URL:** <https://www.ruby-forum.com/t/socket-progamming-beginner-questions/152466>\
**Category:** Ruby\
**Created:** [November 4, 2008, 10:50am UTC](https://www.ruby-forum.com/t/socket-progamming-beginner-questions/152466 "2008-11-04T10:50:50Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![grish](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e9c0ed/32.png) [@grish](https://www.ruby-forum.com/u/grish)\
**Post date:** [November 4, 2008, 10:50am UTC](https://www.ruby-forum.com/t/socket-progamming-beginner-questions/152466/1 "2008-11-04T10:50:50Z")

</div>

Hi,

I’m trying to learn Ruby and Socket programming. So far I managed to  
find some tutorials about Ruby and Socket programming and have made  
really simple applications like a Time server sending the time to a  
client. Now I wanted to try something a little more advanced. I want to  
make a client that will connect to server and receive messages and at  
the same time send messages to the server when certain events happen  
like when there’s a file in a certain directory or a record in the  
database.

So far from the tutorials I’ve studied, the clients all just wait for a  
response from the server. From what I understand once I do a gets I’ll  
just be waiting for a reponse and will put the rest of the state waiting  
on that response. Is it possible to do both reading and writing on the  
socket at the same time?

I also did some digging on threads. I had the idea of making 2 threads  
one to receive messages from the server and one to check the  
directory/database then send a message. Again I don’t see though how I  
can do that based on what I done in the tutorials. It seems like my  
threads will just hang when I try to read from the server. Is this the  
proper approach? Are there other methods aside from using threads? I saw  
topic on a multiplexing server but all the examples were just waiting  
again on a read from the client.

I know these are pretty broad questions and topics but hoping someone  
can help clarify these issues and point me at the right direction.

Thanks!

---

<div class="post-metadata">

**Author:** ![grish](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e9c0ed/32.png) [@grish](https://www.ruby-forum.com/u/grish)\
**Post date:** [November 8, 2008, 2:33am UTC](https://www.ruby-forum.com/t/socket-progamming-beginner-questions/152466/2 "2008-11-08T02:33:53Z")

</div>

Threads can work, but most networking code I’ve written uses  
Kernel#select. It’s an incredibly powerful, yet somewhat hard to  
master, method that allows you to read and write on many sockets  
(actually IO objects) at the same time. It sounds like you want two  
read objects, one for the server and one for the database, and that  
you want to write to the network socket (yes, can you can read and  
write to the same socket - just use “puts” as well as “gets”, or  
whatever equivalent methods you like) in the part of the code that  
handles what happens when the database socket is ready to be read.

[http://www.rubycentral.com/book/ref\_m\_kernel.html#Kernel.select](http://www.rubycentral.com/book/ref_m_kernel.html#Kernel.select)

HTH,

Adam

---

<div class="post-metadata">

**Author:** ![grish](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e9c0ed/32.png) [@grish](https://www.ruby-forum.com/u/grish)\
**Post date:** [November 8, 2008, 6:34am UTC](https://www.ruby-forum.com/t/socket-progamming-beginner-questions/152466/3 "2008-11-08T06:34:45Z")

</div>

check out eventmachine 🙂  
-=R

---

<div class="post-metadata">

**Author:** ![grish](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e9c0ed/32.png) [@grish](https://www.ruby-forum.com/u/grish)\
**Post date:** [November 10, 2008, 3:47am UTC](https://www.ruby-forum.com/t/socket-progamming-beginner-questions/152466/4 "2008-11-10T03:47:53Z")

</div>

Adam B. wrote:

> Threads can work, but most networking code I’ve written uses  
> Kernel#select. It’s an incredibly powerful, yet somewhat hard to  
> master, method that allows you to read and write on many sockets  
> (actually IO objects) at the same time. It sounds like you want two  
> read objects, one for the server and one for the database, and that  
> you want to write to the network socket (yes, can you can read and  
> write to the same socket - just use “puts” as well as “gets”, or  
> whatever equivalent methods you like) in the part of the code that  
> handles what happens when the database socket is ready to be read.
> 
> [http://www.rubycentral.com/book/ref\_m\_kernel.html#Kernel.select](http://www.rubycentral.com/book/ref_m_kernel.html#Kernel.select)
> 
> HTH,
> 
> Adam

Thanks Adam!

I looked for examples using select and I mostly found chat servers. I  
tried it out and it does look like an effective and powerful approach. I  
still though don’t understand how to trigger a read from another socket  
if I want to monitor a directory or a database. I wish though I could  
find better examples in the internet. How would you set up a socket to  
monitor a directory or database or is my understanding of the matter  
off?

I checked out EventMachine as well which looks great just that since I  
want to learn I want to try out making something from scratch.

---

<div class="post-metadata">

**Author:** ![grish](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e9c0ed/32.png) [@grish](https://www.ruby-forum.com/u/grish)\
**Post date:** [November 13, 2008, 4:54am UTC](https://www.ruby-forum.com/t/socket-progamming-beginner-questions/152466/5 "2008-11-13T04:54:50Z")

</div>

Thanks Jeff! I’ll check out the code and study them. Hopefully a novice  
like me can pick it up quickly.

---

<div class="post-metadata">

**Author:** ![grish](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/e9c0ed/32.png) [@grish](https://www.ruby-forum.com/u/grish)\
**Post date:** [November 10, 2008, 9:37pm UTC](https://www.ruby-forum.com/t/socket-progamming-beginner-questions/152466/6 "2008-11-10T21:37:30Z")

</div>

> How would you set up a socket to  
> monitor a directory or database or is my understanding of the matter  
> off?

Sockets are just a conduit for data. You can use their blocking  
capability (via select, etc) to control some portion of the interaction  
between the client and server (or whatever relationship you deem  
appropriate between the end points).

Regardless, you still require an active process/thread to ‘put’ the data  
into one end of the socket and another to active process/thread to ‘get’  
it at the other end.

It’s much easier if you maintain the separation of client/network/server  
activities in your mind and in the code.

Another consideration is that this a glorious intersection of things  
(both threads and sockets) that are similar across multiple platforms  
but only similar. Each platform has it’s own features (quirks).

The source code for webrick and the net library in lib provide plenty of  
examples of how threads and sockets interact (or not) in an internet  
application.

It’s one of the beauties of Ruby. You get the code.
