Quick question on reading from TCPSockets

G

Greg Chambers

So in my program, I am reading a series of ASCII strings from the
TCPSocket. My code is letting everything through just fine. The
problem is in the verification of the data. You see, the point of this
protocol I am using is I am receiving a series of strings where each
string has a 4 letter command and then parameters after it. The command
and parameters are separated by commas. So my main worry here is most
of the examples of TCPSocket networking I've seen use the #read method
which requires a known amount of bytes to be read and I am worried that
I will cut one of the commands part way through and cause problems.

I thought about using #readlines but I wasn't sure how it would treat a
split message. If I get a message like
GHWD,12,67585,234,4767,234232,757
HGYT,0,0
PJIY,9876,234,56432,23

but the full last command was actually
PJIY,9876,234,56432,234565,234,7774

then that messes everything up. Is there a way to read data delimited
by a newline and if the last line read does not end with a newline to
have it placed back in a buffer of some sort to get the next set of
messages appended to it?
 
R

Roger Pack

then that messes everything up. Is there a way to read data delimited
by a newline and if the last line read does not end with a newline to
have it placed back in a buffer of some sort to get the next set of
messages appended to it?

Yeah you'd have to buffer it and process it only when a newline comes
in.
=r
 
R

Robert Klemme

So in my program, I am reading a series of ASCII strings from the
TCPSocket. My code is letting everything through just fine. The
problem is in the verification of the data. You see, the point of this
protocol I am using is I am receiving a series of strings where each
string has a 4 letter command and then parameters after it. The command
and parameters are separated by commas. So my main worry here is most
of the examples of TCPSocket networking I've seen use the #read method
which requires a known amount of bytes to be read and I am worried that
I will cut one of the commands part way through and cause problems.

I thought about using #readlines but I wasn't sure how it would treat a
split message. If I get a message like


but the full last command was actually


then that messes everything up. Is there a way to read data delimited
by a newline and if the last line read does not end with a newline to
have it placed back in a buffer of some sort to get the next set of
messages appended to it?

You can simply use #gets or #each (same as #each_line). Note that #each
and #each_line accept separators so in case you have something different
as separator character for records (commands) you can still use that
approach. You need to be aware though that the separator character is
preserved:

socket.each "\n" do |command|
command.chomp!
cmd, *args = command.split ','
end


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,756
Messages
2,569,535
Members
45,008
Latest member
obedient dusk

Latest Threads

Top