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 <module> 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