On 2013-02-12 02:20, Chris Angelico wrote:
On Tue, Feb 12, 2013 at 12:41 PM, Ihsan Junaidi Ibrahim <ih...@grep.my> wrote:

On Feb 11, 2013, at 11:24 PM, Chris Angelico <ros...@gmail.com> wrote:

On Tue, Feb 12, 2013 at 2:11 AM, MRAB <pyt...@mrabarnett.plus.com> wrote:
I probably wouldn't make it fixed length. I'd have the length in
decimal followed by, say, "\n".

Or even "followed by any non-digit". Chances are your JSON data begins
with a non-digit, so you'd just have to insert a space in the event
that you're JSON-encoding a flat integer. (Which might not ever
happen, if you know that your data will always be an object.)

ChrisA

So on the first recv() call, I set the buffer at 1 character and I iterate
>> over single character until a non-digit character is encountered?

More efficient would be to guess that it'll be, say, 10 bytes, and
then retain any excess for your JSON read loop. But you'd need to sort
that out between the halves of your code.

If the length is always followed by a space then it's easier to split
it off the input:

    buf = sock.recv(10)
    space_pos = buf.find(b" ")
    nbuf = int(buf[ : space_pos])
    buf = buf[space_pos+ 1 : ]

    while len(buf) < nbuf:
        chunk = sock.recv(nbuf - len(buf))
        if not chunk:
            break

        buf += chunk

I'm assuming that:

1. The initial recv returns the length followed by a space. It could,
of course, return fewer bytes (space_pos == -1), so you may need to
recv some more bytes, like what's done later on.

2. At least 10 bytes were sent. Imagine what would happen if the sender
sent b"2 []" immediately followed by b"2 []". The initial recv could
return all of it. In that case you could save the excess until next
time. Alternatively, the sender could guarantee that it would never
send fewer than the 10 bytes, padding with several b" " if necessary.

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to