Jean-Paul Calderone wrote: > On 4 Oct 2006 19:31:38 -0700, SpreadTooThin <[EMAIL PROTECTED]> wrote: > >client: > > > >import socket > >s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) > >s.connect(("192.168.1.101", 8080)) > >print 'Connected' > >s.send('ABCD') > > Here you didn't check the return value of send to determine if all of the > string was copied to the kernel buffer to be sent, so you may have only > succeeded in sending part of 'ABCD'. > > >buffer = s.recv(4) > > in the above call, 4 is the maximum number of bytes recv will return. It > looks as though you are expecting it to return exactly 4 bytes, but in order > to get that, you will need to check the length of the return value and call > recv again with a lower limit until the combination of the return values of > each call gives a total length of 4. > > >print buffer > >s.send('exit') > > Again, you didn't check the return value of send. > > > > > > >server: > > > >serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) > >serversocket.bind(("192.168.1.101", 8080)) > >serversocket.listen(5) > >print 'Listen' > >(clientsocket, address) = serversocket.accept() > >print 'Accepted' > >flag = True > >while flag: > > chunk = serversocket.recv(4) > > You're calling recv on serversocket instead of on clientsocket. You're also > relying on recv to return exactly 4 bytes, which it may not do. > > > if chunk == '': > > raise RuntimeError, "socket connection broken" > > elif chunk == 'exit': > > flag = False > > else: > > serversocket.send(chunk) > > Another missing check of the return value of send. > > >print 'Done' > > > >Server says! > > > >Listen > >Accepted > >Traceback (most recent call last): > > File "server.py", line 11, in ? > > chunk = serversocket.recv(4) > >socket.error: (57, 'Socket is not connected') > > > > > >Client says: > >Connected > > > >What have I done wrong now! > > I recommend switching to Twisted. The Twisted equivalent (I guess - the > protocol defined above is strange and complex (probably unintentionally, due > to the things you left out, like any form of delimiter) and I doubt I really > understand the end goal you are working towards), minus bugs (untested): > > # client.py > from twisted.internet import reactor, protocol > > class Client(protocol.Protocol): > buf = '' > def connectionMade(self): > self.transport.write('ABCD') > def dataReceived(self, data): > self.buf += data > if len(self.buf) >= 4: > reactor.stop() > > protocol.ClientCreator(reactor, Client).connectTCP('192.168.1.101', 8080) > reactor.run() > > # server.py > from twisted.internet import reactor, protocol > > class Server(protocol.Protocol): > buf = '' > def dataReceived(self, bytes): > self.buf += bytes > exit = self.buf.find('exit') > if exit != -1: > self.transport.write(self.buf[:exit]) > self.buf = self.buf[exit + 4:] > reactor.stop() > else: > self.transport.write(self.buf) > self.buf = '' > > f = protocol.ServerFactory() > f.protocol = Server > reactor.listenTCP('192.168.1.101', 8080, f) > reactor.run() > > Hope this helps, > > Jean-Paul
Jean-Paul many thanks for this and your effort. but why is it every time I try to do something with 'stock' python I need another package? By the time I've finished my project there are like 5 3rd party add-ons to be installed. I know I'm a python newbie... but I'm far from a developer newbie and that can be a recipe for disaster. The stock socket should work and I think I've missed an obvious bug in the code other than checking the return status. -- http://mail.python.org/mailman/listinfo/python-list