[Tutor] Unpickling data after passing over the network
Daniel Yoo
dyoo at cs.wpi.edu
Sun Feb 11 19:48:52 CET 2007
> a socket. Right now, I am pickling a basic string base 64 encoding and
> sending the data over the network. After the recipient client/server
> receives the data, it is decoded and then unpickled. The unpickling
> fails with an EOFError, and I am not sure why.
Hi Adam,
Did you "flush" the output buffer? Network sockets are, like files,
typically buffered, so you may need to tell the system to not wait for the
buffer to fill.
Let me look at your functions to see if there's anything else you'll want
to think about.
> def SerialEncode(data):
> import cPickle, base64
> return base64.encodestring(cPickle.dumps(data,2))
>
> def DeserialDecode(data):
> import cPickle, base64
> return cPickle.loads(base64.decodestring(data))
You can simplify by pulling the imports of 'cPickle' and 'base64' out to
the top.
> mySocket.send( SerialEncode("Hello!"))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Ok, this is one source of a problem.
Remember what you did with the recv's earlier, with the looping? Same
thing: send() isn't guaranteed to write all the bytes out at once. Read
the documentation to send() a little closely, and you'll see the warning
there:
http://docs.python.org/lib/socket-objects.html#l2h-3696
One way to get around this is to work at a higher level of abstraction:
sockets can also be treated as file-like objects which do the looping for
you automatically, at the expense of having less control over the socket.
See socket.makefile():
http://docs.python.org/lib/socket-objects.html#l2h-3693
Otherwise, everything else looks ok from a casual glance.
Good luck!
More information about the Tutor
mailing list