# Hanging in a client server threaded program

**URL:** <https://www.ruby-forum.com/t/hanging-in-a-client-server-threaded-program/225941>\
**Category:** Ruby\
**Created:** [February 13, 2007, 9:37am UTC](https://www.ruby-forum.com/t/hanging-in-a-client-server-threaded-program/225941 "2007-02-13T09:37:47Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![dorelal](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/3da27b/32.png) [@dorelal](https://www.ruby-forum.com/u/dorelal)\
**Post date:** [February 13, 2007, 9:37am UTC](https://www.ruby-forum.com/t/hanging-in-a-client-server-threaded-program/225941/1 "2007-02-13T09:37:47Z")

</div>

I was having a buffered IO problem which I solved using IO.ready?, but  
now I’m hanging. What’s interesting is that I wrote a little test  
program to demonstrate the problem, and it doesn’t cause the server to  
hang, but the larger program does. The object that communicates with  
the server is exactly the same in both programs, except for some  
trivialites that I had to change in order to make the program work  
standalone. I use threads in the test program because the main program  
uses them and if that is the problem I was hoping it would show up. The  
server is hanging right after the “socket recieved” output in the  
accept\_new\_connection method.

################## Test Reciever ###############  
class Reciever  
def initialize  
@target = Target.new

@target.socket = TCPSocket.new(‘127.0.0.1’, 7824)  
puts “Socket Opened”  
@target.socket.write(“name”)  
end

def run  
while 1  
if @target.socket.ready?  
print “message recieved\n”  
if @target.socket.eof?  
@target.socket.close  
raise :ServerClosedConnection  
else  
puts “Entered else”  
message = @target.socket.read  
@target.parse\_and\_execute(message)  
end  
end  
end  
end  
end

class Target  
attr\_accessor :socket

def initialize  
@socket  
end

def parse\_and\_execute(message)  
puts message  
end  
end  
thr = Array.new  
thr \<\< Thread.new do  
Reciever.new.run  
end  
thr \<\< Thread.new do  
sleep()  
end  
thr.each {|thread| thread.join}

################## Actual Reciever, This one causes the server to hang  
#######  
class Reciever  
def initialize(target)  
ip\_address = nil

target.socket = TCPSocket.new(ip\_address, $port)  
puts “Socket Opened”  
name = target.me.name  
puts "Name is " + target.me.name.to\_s  
target.socket.write(“Raj”)  
puts “Name sent”  
end

def run(target)  
while 1  
if target.socket.ready?  
print “message recieved\n”  
if target.socket.eof?  
target.socket.close  
raise :ServerClosedConnection  
else  
message = target.socket.read  
target.parse\_and\_execute(message)  
end  
end  
end  
end  
end

################## Server ###################  
class Interlink  
attr\_accessor :descriptors

def initialize(server)  
@descriptors = Array.new  
@server = server  
@serverSocket = server.socket = TCPServer.new(‘localhost’, $port)  
@serverSocket.setsockopt(Socket::SOL\_SOCKET, Socket::SO\_REUSEADDR, 1)  
@descriptors \<\< @serverSocket  
end

def run  
while 1  
res = select(@descriptors, nil, nil, nil)  
unless res.nil?  
res[0].each do |sock|  
if sock == @serverSocket  
accept\_new\_connection  
else  
if sock.eof?  
puts “Socket #{sock} disconnected.”  
sock.close  
else  
#broadcast(sock.gets, sock)  
end  
end  
end  
end  
end  
end

def accept\_new\_connection  
newsock = @serverSocket.accept  
print “Socket accepted\n”  
name = newsock.recv(20) #####THE SERVER IS HANGING HERE#######  
print “name recieved\n”  
print “name is #{name}\n”  
@server.add\_player(name, newsock)  
print “player added\n”  
@descriptors \<\< newsock  
newsock.write(“test target data”)  
#newsock.write(“info You connected to the STCCG GameServer.\n”)  
#broadcast(“info #{name} joined the game.\n”, newsock)  
end

def broadcast(str, omit\_sock)  
@descriptors.each do |socket|  
if socket != @serverSocket and socket != omit\_sock  
socket.write(str)  
end  
end  
end  
end
