Pickling over a socket

2011-04-19 Thread Roger Alexander
Hi,

I'm trying to understand how to pickle Python objects over a TCP
socket.

In the example below (based on code from Foundations of Python Network
Programming), a client creates a dictionary (lines 34-38) and uses
pickle.dump at line 42 to write the pickled object using file handle
make from a socket. The server de-pickles with pickle.load  (line 24),
again using a file handle made from a socket.

When I run the program, the following output is produced:

Listening at ('127.0.0.1', 1060)
Accepted connection from ('127.0.0.1', 49938)
Traceback (most recent call last):
File "pickles.py", line 24, in 
d = pickle.load( s_fh )
File "/usr/local/lib/python2.7/pickle.py", line 1378, in load
return Unpickler(file).load()
File "/usr/local/lib/python2.7/pickle.py", line 857, in load
key = read(1)
File "/usr/local/lib/python2.7/socket.py", line 380, in read
data = self._sock.recv(left)
socket.error: [Errno 107] Transport endpoint is not connected

I'm at a loss, can anyone provide any guidance?

Thanks,

Roger Alexander

 1  import pickle
 2  import socket, sys
 3
 4  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 5
 6  HOST = sys.argv.pop() if len(sys.argv) == 3 else '127.0.0.1'
 7  PORT = 1060
 8
 9  if sys.argv[1:] == ['server']:
10
11  s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
12  s.bind((HOST, PORT))
13  s.listen(1)
14
15  print 'Listening at', s.getsockname()
16
17  sc, sockname = s.accept()
18
19  print 'Accepted connection from', sockname
20
21  sc.shutdown(socket.SHUT_WR)
22  sf = s.makefile( "rb" )
23
24  d = pickle.load(sf)
25
26  sc.close()
27  s.close()
28
29  elif sys.argv[1:] == ['client']:
30
31  s.connect((HOST, PORT))
32  s.shutdown(socket.SHUT_RD)
33
34  d = dict()
35
36  d[ 'Name' ] = 'Jake Thompson.'
37  d[ 'Age' ]  = 25
38  d[ 'Location' ] = 'Washington, D.C.'
39
40  sf = s.makefile( "wb" )
41
42  pickle.dump( d, sf, pickle.HIGHEST_PROTOCOL )
43
44  s.close()
45
46  else:
47  print >>sys.stderr, 'usage: streamer.py server|client [host]'
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Pickling over a socket

2011-04-19 Thread Roger Alexander
Thanks everybody, got it working.

 I appreciate the help!

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