By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,364 Members | 1,493 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,364 IT Pros & Developers. It's quick & easy.

Client for server doing dispatcher_with_send

P: n/a
Hi all,

I have a server that uses the asyncore stuff with dispatcher_with_send in
order to send a bunch of pickled bytes to a client. The length of the
message is generally about 3000 bytes.

My problem is that I don't know how to write the client elegantly. I'm not
using asyncore or anything for the client -- just the socket module.

Currently, my code is working, but is inelegant, I think. here it is:

data = ""
newData = ""
while True:
newData = sock.recv(8192)
data += newData
if len(newData) < 512:
break
sock.close()

This works because the dispatcher_with_send() sends packets with 512 bytes
in them, unless there is less than 512 bytes to send.

Is there a more elegant way to write this? How can I determine that nothing
more is being sent?

Vic
Jul 18 '05 #1
Share this Question
Share on Google+
1 Reply


P: n/a
Is there a more elegant way to write this? How can I determine that nothing
more is being sent?


Write a better protocol. A better protocol is easy (it can be done
better, but this is short and will do the job).

- Josiah

from StringIO import StringIO

class my_dispatcher_with_send(asyncore.dispatcher_with_s end):
def send (self, data):
asyncore.dispatcher_with_send(struct.pack('>L', len(data))+data)

def read(sock, length):
s = StringIO()
while s.tell() < length:
s.write(sock.recv(length-s.tell()))
return s.getvalue()

def receiver(sock):
try:
l = read(sock, 4)
l = struct.unpack('>L', l)[0]
r = read(sock, l)
sock.close()
return r
except socket.error, why:
sock.close()

Jul 18 '05 #2

This discussion thread is closed

Replies have been disabled for this discussion.