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

Reply via email to