problem with sockets code
James Mills
prologic at shortcircuit.net.au
Fri Oct 3 00:25:40 EDT 2008
On Fri, Oct 3, 2008 at 2:13 AM, Daniel <daniel.watrous at gmail.com> wrote:
> Hello,
>
> I can't seem to get my sockets code to work right. Here is what I
> have inside my RequestHandler handle() function:
>
> total_data=[]
>
> data = True
> logger_server.debug(self.__class__.__name__ + ' set data =
> True')
> while data:
> logger_server.debug(self.__class__.__name__ + ' receive
> first readline() of data')
> data = self.rfile.readline().strip()
> logger_server.debug(self.__class__.__name__ + ' first
> readline() of data = %s' % data)
> total_data.append(data)
> receivedCommand = '\n'.join(total_data)
>
> And this is what I have inside my client code
>
> sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
> sock.connect(('localhost',5001))
>
> sock.sendall('Hello, world\r\n')
> data = sock.recv(1024)
> sock.close()
> print 'Received', repr(data)
>
> There's a little more to it, but this is enough for me to ask my
> question. The problem is that I can't get the server loop (while
> data:) to stop without closing the connection, but I want to receive
> something back from the server before closing the sockets connection.
> My logs show that the server never leaves the loop.
>
> Thanks in advance.
Daniel,
You really should use an existing framework to help
you write your application here. You're using the
plain old (standard-library) sockets module.
I would suggest you use either Twisted, or pymills.
Twisted is more feature-rich, and a general purpose
event-driven framework. It can be a little overwhelming
to use.
pymills is my event-driven, component architecture
library that allows you to build event-driven systems
very easily with a component design.
You can download pymills from here:
http://hg.shortcircuit.net.au/index.wsgi/pymills/archive/tip.tar.gz
Or you can get the latest developmen branch by using
Mercurial and cloning it:
hg clone http://hg.shortcircuit.net.au/index.wsgi/pymills/
Here is a simple EchoServer that you could modify
to suit your application needs:
<code>
#!/usr/bin/env python
from pymills import event
from pymills.event import *
from pymills.net.sockets import TCPServer
class Echo(TCPServer):
@listener("read")
def onREAD(self, sock, data):
self.write(sock, data)
def main():
echo = Echo(8000)
event.manager += echo
while True:
try:
manager.flush()
echo.poll()
except KeyboardInterrupt:
break
if __name__ == "__main__":
main()
</code>
cheers
James
--
--
-- "Problems are solved by method"
More information about the Python-list
mailing list