java - One thread one ByteBuffer NIO -
i wondering best way implement multiuser nio server 1 thread , 1 buffer. use selector achieve have figured out how reading on clients. having trouble implementing write using 1 buffer. need second buffer writes? or have (unfortunately) have write buffer per client? wrote example show how i'm doing stuff, know processing happens within scheduler's thread, not interacting state through thread!
scheduledexecutorservice scheduler = executors.newsinglethreadscheduledexecutor(); serversocketchannel server = serversocketchannel.open(); selector selector = selector.open(); bytebuffer buffer = bytebuffer.allocatedirect(8192); map<selectionkey, socketchannel> clients = new hashmap<>(); server.configureblocking(false); server.register(selector, selectionkey.op_accept); server.bind(new inetsocketaddress(43594)); scheduler.scheduleatfixedrate(() -> { try { selector.selectnow(); iterator<selectionkey> keys = selector.selectedkeys().iterator(); while (keys.hasnext()) { selectionkey key = keys.next(); keys.remove(); if (key.isacceptable()) { (int = 0; < 16; i++) { socketchannel client = server.accept(); if (client == null) break; client.configureblocking(false); selectionkey clientkey = client.register(selector, selectionkey.op_read); clients.put(clientkey, client); } } if (key.isreadable()) { socketchannel client = clients.get(key); if (client != null) { buffer.clear(); client.read(buffer); buffer.flip(); // stuff buffer } } } } catch (ioexception e) { e.printstacktrace(); } }, 600, 600, timeunit.milliseconds);
you can't. less trivial echo server, need @ least 1 buffer per channel, possibly 2 (read , write). otherwise can't possibly deal partially read requests, or partially written responses.
you can associate buffers channel via selectionkey
attachment.
Comments
Post a Comment