Note that there are some explanatory texts on larger screens.

plurals
  1. POHow do I make this non-blocking server multi-threaded?
    text
    copied!<p>I'm trying to allow multiple connections to a little Java server type app. It works fine as is, but if one connection opens and then hangs, all subsequent connections will hang. I'm not sure how to go about handling each connection, up to about 20 concurrent ones in their own thread while keeping track of which thread belongs to which client etc. The code I have so far is:</p> <pre><code>private void init() { try { // Create the server socket channel ServerSocketChannel server = ServerSocketChannel.open(); // nonblocking I/O server.configureBlocking(false); // host-port server.socket().bind(new InetSocketAddress(host, port)); System.out.println("Server connected on " + host + ":" + port); // Create the selector Selector selector = Selector.open(); // Recording server to selector (type OP_ACCEPT) server.register(selector, SelectionKey.OP_ACCEPT); // Infinite server loop for (;;) { // Waiting for events selector.select(); // Get keys Set keys = selector.selectedKeys(); Iterator i = keys.iterator(); // For each keys... while (i.hasNext()) { SelectionKey key = (SelectionKey) i.next(); // Remove the current key i.remove(); // if isAccetable = true // then a client required a connection if (key.isAcceptable()) { // get client socket channel SocketChannel client = server.accept(); // Non Blocking I/O client.configureBlocking(false); // recording to the selector (reading) client.register(selector, SelectionKey.OP_READ); continue; } // then the server is ready to read if (key.isReadable()) { SocketChannel client = (SocketChannel) key.channel(); // Read byte coming from the client int BUFFER_SIZE = 32; ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE); try { client.read(buffer); } catch (Exception e) { // client is no longer active e.printStackTrace(); continue; } buffer.flip(); Charset charset = Charset.forName("ISO-8859-1"); CharsetDecoder decoder = charset.newDecoder(); CharBuffer charBuffer = decoder.decode(buffer); Handler dataHandler = new Handler(); client.write(ByteBuffer.wrap(dataHandler.processInput(charBuffer.toString()).getBytes())); client.socket().close(); continue; } } } } catch (IOException ex) { Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex); } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload