On Tuesday, February 5, 2013 10:09:28 AM UTC+2, foobar...@gmail.com wrote:
> Can someone help answer this?
> 
> http://stackoverflow.com/questions/14698020/java-nio-server-and-python-asyncore-client
> 
> 
> 
> Blocking python client works, asyncore doesn't work.
> 

There was return missing in writeable().

Modified code::

----
import socket
import select
import asyncore

class Connector(asyncore.dispatcher):
    def __init__(self, host, port):
        asyncore.dispatcher.__init__(self)
        self.debug = True
        self.buffer = bytes("hi","ascii")
        self.create_socket(socket.AF_INET,socket.SOCK_STREAM)
        print("Connector.connect(({},{}))".format(host,port))
        self.connect((host, port))

    def handle_connect(self):
        print("handle_connect()") # not called <------------------

    def handle_read(self):
        print("handle_read()")
        self.recv(4096)
        self.close()

    def writable(self):
        print("writable()")
        return len(self.buffer) > 0 # remember RETURN

    def handle_write(self):
        print("handle_write()")
        sent = self.send(self.buffer)
        print("send({})".format(self.buffer[0:sent]))
        self.buffer = self.buffer[sent:]

    def handle_close(self):
        print("handle_close()")
        self.close()

connector = Connector("localhost", 12000) #  Handler()
print("asyncore.loop() enter")
asyncore.loop() 
print("asyncore.loop() leave")
----

BSD socket communication framework does not itself support connection 
indications
on connection-oriented protocols, so asyncore "fakes" the indication by 
detecting
if socket is writable. As the writable was false => no write event => no 
connection indication.

asyncore usage and documentation is bad, so when using the module, read the 
source
code to understand it's usage and functioning, or use other implementation eg.
Tornado.
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to