Re: Java NIO server and Python asyncore client
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
Java NIO server and Python asyncore client
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. Server.java: import java.net.InetAddress; import java.net.InetSocketAddress; import java.nio.channels.SelectionKey; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.nio.channels.SelectableChannel; import java.nio.channels.Selector; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Iterator; import java.util.Set; class Server { public Selector sel; public ServerSocketChannel ssc; public SocketChannel channel; public static void main(String[] args) throws Exception { Server s = new Server(); s.openSocket(12000); s.run(); } private void openSocket(int port) throws Exception { InetSocketAddress address = new InetSocketAddress(0.0.0.0, port); ssc = ServerSocketChannel.open(); ssc.configureBlocking(false); ssc.socket().bind(address); sel = Selector.open(); ssc.register(sel, SelectionKey.OP_ACCEPT); } public void run() throws Exception { while (true) { sel.select(); SetSelectionKey keys = sel.selectedKeys(); IteratorSelectionKey i = keys.iterator(); while (i.hasNext()) { SelectionKey key = (SelectionKey) i.next(); i.remove(); if (!key.isValid()) { continue; } if (key.isAcceptable()) { channel = ssc.accept(); channel.configureBlocking(false); System.out.println(Accepted...\n); channel.register(sel, SelectionKey.OP_READ); } if (key.isReadable()) { if (channel == key.channel()) { System.out.println(Readable\n); ByteBuffer buffer = ByteBuffer.wrap(new byte[1024]); int pos = channel.read(buffer); buffer.flip(); System.out.println(new String(buffer.array(), 0, pos)); } } } } } } Asyncore Python Code: import socket import select import asyncore class Connector(asyncore.dispatcher): def __init__(self, host, port): asyncore.dispatcher.__init__(self) self.buffer = hi self.create_socket() self.connect((host, port)) def handle_connect(self): print([]--[]) # not called -- def handle_read(self): pass def writable(self): len(self.buffer) 0 def handle_write(self): sent = self.send(self.buffer) print([]--- + self.buffer[0:sent]) self.buffer = self.buffer[sent:] def handle_close(self): print([]...x...[]) self.close() connector = Connector(localhost, 12000, Handler()) asyncore.loop() Python Blocking client: # Echo client program import socket import sys HOST = 'localhost'# The remote host PORT = 12000 # The same port as used by the server s = None for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM): af, socktype, proto, canonname, sa = res try: s = socket.socket(af, socktype, proto) print(socket) except OSError as msg: s = None continue try: s.connect(sa) print(connected) except OSError as msg: s.close() s = None continue break if s is None: print('could not open socket') sys.exit(1) print(Sending) s.sendall(bytes(Hey server, UTF-8)) data = s.recv(1024) #s.close() print('Received', repr(data)) -- http://mail.python.org/mailman/listinfo/python-list
Re: Java NIO server and Python asyncore client
foobarome...@gmail.com writes: 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. I fear you must tell us which Python version you are using. Your call to dispatcher.create_socket is incompatible with the code in Python 2.7 (it lacks parameters family and type). Otherwise, I could not detect a problem in your code. I assume that does not work does not mean I get an exception but means I do not get anything. You might need some debugging to detect the problem. Check dispatcher.socket_map after you have set up your connector. It should contain your connector object and this should be both readable() and writable(). If this is the case, I would debug asyncore.loop: asyncore.dispatcher treats the socket as connected as soon as it becomes either readable or writable. Both should happen after connect is successful. Thus, I would look what goes wrong: * the socket does not become readable/writable this would proabably mean that the socket never gets connected, maybe because of bad parameters to create_socket. * the channel is not properly registered * bad internal state -- http://mail.python.org/mailman/listinfo/python-list