How to realize that a TCPSocket doesn't give any more lines asanswer?

G

Guest

Hi,
I'm writing a little tcp-client which connects to a tcp-server, sends a command and recieves an answer. If I do something like that:

#!/usr/bin/env ruby

$VERBOSE=true

require 'socket'
....
begin
socket = TCPSocket.new($ip,$port)
rescue
puts "error: #{$!}"
exit 1
end

socket.print command

answer=socket.gets

socket.close


It works if the server sends just one line. But I don't know how many lines the server answers. So I tried something like that:

answers=[]
while answer=socket.gets
answers<<answer
end

But this results in the while-loop never ending. Even if just one line is the answer the while loop does simply never end :( Any idea how to do this?
 
J

Joel VanderWerf

Hi,
I'm writing a little tcp-client which connects to a tcp-server, sends a command and recieves an answer. If I do something like that:

#!/usr/bin/env ruby

$VERBOSE=true

require 'socket'
...
begin
socket = TCPSocket.new($ip,$port)
rescue
puts "error: #{$!}"
exit 1
end

socket.print command

answer=socket.gets

socket.close


It works if the server sends just one line. But I don't know how many lines the server answers. So I tried something like that:

answers=[]
while answer=socket.gets
answers<<answer
end

But this results in the while-loop never ending. Even if just one line is the answer the while loop does simply never end :( Any idea how to do this?

Try socket.gets(nil) -- that waits for EOF instead of newline.
 
R

Robert Klemme

2009/1/8 said:
Hi,
I'm writing a little tcp-client which connects to a tcp-server, sends a command and recieves an answer. If I do something like that:

#!/usr/bin/env ruby

$VERBOSE=true

require 'socket'
...
begin
socket = TCPSocket.new($ip,$port)
rescue
puts "error: #{$!}"
exit 1
end

socket.print command

answer=socket.gets

socket.close


It works if the server sends just one line. But I don't know how many lines the server answers. So I tried something like that:

answers=[]
while answer=socket.gets
answers<<answer
end

But this results in the while-loop never ending. Even if just one line is the answer the while loop does simply never end :( Any idea how to do this?

Basically you need to define a protocol of your own which handles
this. There are many ways to do that. One option is to define that
there will be only one line ever. Another option is to include
something in each like which indicates whether there is more to
follow. Yet another option is to define a terminator sequence and use
gets or IO#each with terminator argument similar to this:

RKlemme@padrklemme1 ~
$ cat <<EOF | ruby -e 'ARGF.each("EOM") {|msg| p msg}'
foo
bar
baz
EOM
dada
dodo
xxx
EOM
EOF
"foo\nbar\nbaz\nEOM"
"\ndada\ndodo\nxxx\nEOM"
"\n"

RKlemme@padrklemme1 ~
$

Here "EOM" is the message terminator.

Or you can use DRb if all processes are Ruby processes. Then it's
handled by DRb and you just invoke methods.

Kind regards

robert
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,578
Members
45,052
Latest member
LucyCarper

Latest Threads

Top