List of usage examples for java.nio.channels ServerSocketChannel socket
public abstract ServerSocket socket();
From source file:DaytimeServer.java
public static void main(String args[]) { try { // Handle startup exceptions at the end of this block // Get an encoder for converting strings to bytes CharsetEncoder encoder = Charset.forName("US-ASCII").newEncoder(); // Allow an alternative port for testing with non-root accounts int port = 13; // RFC867 specifies this port. if (args.length > 0) port = Integer.parseInt(args[0]); // The port we'll listen on SocketAddress localport = new InetSocketAddress(port); // Create and bind a tcp channel to listen for connections on. ServerSocketChannel tcpserver = ServerSocketChannel.open(); tcpserver.socket().bind(localport); // Also create and bind a DatagramChannel to listen on. DatagramChannel udpserver = DatagramChannel.open(); udpserver.socket().bind(localport); // Specify non-blocking mode for both channels, since our // Selector object will be doing the blocking for us. tcpserver.configureBlocking(false); udpserver.configureBlocking(false); // The Selector object is what allows us to block while waiting // for activity on either of the two channels. Selector selector = Selector.open(); // Register the channels with the selector, and specify what // conditions (a connection ready to accept, a datagram ready // to read) we'd like the Selector to wake up for. // These methods return SelectionKey objects, which we don't // need to retain in this example. tcpserver.register(selector, SelectionKey.OP_ACCEPT); udpserver.register(selector, SelectionKey.OP_READ); // This is an empty byte buffer to receive emtpy datagrams with. // If a datagram overflows the receive buffer size, the extra bytes // are automatically discarded, so we don't have to worry about // buffer overflow attacks here. ByteBuffer receiveBuffer = ByteBuffer.allocate(0); // Now loop forever, processing client connections for (;;) { try { // Handle per-connection problems below // Wait for a client to connect selector.select();/*from w ww . j av a2s . co m*/ // If we get here, a client has probably connected, so // put our response into a ByteBuffer. String date = new java.util.Date().toString() + "\r\n"; ByteBuffer response = encoder.encode(CharBuffer.wrap(date)); // Get the SelectionKey objects for the channels that have // activity on them. These are the keys returned by the // register() methods above. They are returned in a // java.util.Set. Set keys = selector.selectedKeys(); // Iterate through the Set of keys. for (Iterator i = keys.iterator(); i.hasNext();) { // Get a key from the set, and remove it from the set SelectionKey key = (SelectionKey) i.next(); i.remove(); // Get the channel associated with the key Channel c = (Channel) key.channel(); // Now test the key and the channel to find out // whether something happend on the TCP or UDP channel if (key.isAcceptable() && c == tcpserver) { // A client has attempted to connect via TCP. // Accept the connection now. SocketChannel client = tcpserver.accept(); // If we accepted the connection successfully, // the send our respone back to the client. if (client != null) { client.write(response); // send respone client.close(); // close connection } } else if (key.isReadable() && c == udpserver) { // A UDP datagram is waiting. Receive it now, // noting the address it was sent from. SocketAddress clientAddress = udpserver.receive(receiveBuffer); // If we got the datagram successfully, send // the date and time in a response packet. if (clientAddress != null) udpserver.send(response, clientAddress); } } } catch (java.io.IOException e) { // This is a (hopefully transient) problem with a single // connection: we log the error, but continue running. // We use our classname for the logger so that a sysadmin // can configure logging for this server independently // of other programs. Logger l = Logger.getLogger(DaytimeServer.class.getName()); l.log(Level.WARNING, "IOException in DaytimeServer", e); } catch (Throwable t) { // If anything else goes wrong (out of memory, for example) // then log the problem and exit. Logger l = Logger.getLogger(DaytimeServer.class.getName()); l.log(Level.SEVERE, "FATAL error in DaytimeServer", t); System.exit(1); } } } catch (Exception e) { // This is a startup error: there is no need to log it; // just print a message and exit System.err.println(e); System.exit(1); } }
From source file:PrintServiceWebInterface.java
public static void main(String[] args) throws IOException { // Get the character encoders and decoders we'll need Charset charset = Charset.forName("ISO-8859-1"); CharsetEncoder encoder = charset.newEncoder(); // The HTTP headers we send back to the client are fixed String headers = "HTTP/1.1 200 OK\r\n" + "Content-type: text/html\r\n" + "Connection: close\r\n" + "\r\n"; // We'll use two buffers in our response. One holds the fixed // headers, and the other holds the variable body of the response. ByteBuffer[] buffers = new ByteBuffer[2]; buffers[0] = encoder.encode(CharBuffer.wrap(headers)); ByteBuffer body = ByteBuffer.allocateDirect(16 * 1024); buffers[1] = body;// ww w .j ava2 s. c o m // Find all available PrintService objects to describe PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null); // All of the channels we use in this code will be in non-blocking // mode. So we create a Selector object that will block while // monitoring all of the channels and will only stop blocking when // one or more of the channels is ready for I/O of some sort. Selector selector = Selector.open(); // Create a new ServerSocketChannel, and bind it to port 8000. // Note that we have to do this using the underlying ServerSocket. ServerSocketChannel server = ServerSocketChannel.open(); server.socket().bind(new java.net.InetSocketAddress(8000)); // Put the ServerSocketChannel into non-blocking mode server.configureBlocking(false); // Now register the channel with the Selector. The SelectionKey // represents the registration of this channel with this Selector. SelectionKey serverkey = server.register(selector, SelectionKey.OP_ACCEPT); for (;;) { // The main server loop. The server runs forever. // This call blocks until there is activity on one of the // registered channels. This is the key method in non-blocking I/O. selector.select(); // Get a java.util.Set containing the SelectionKey objects for // all channels that are ready for I/O. Set keys = selector.selectedKeys(); // Use a java.util.Iterator to loop through the selected keys for (Iterator i = keys.iterator(); i.hasNext();) { // Get the next SelectionKey in the set, and then remove it // from the set. It must be removed explicitly, or it will // be returned again by the next call to select(). SelectionKey key = (SelectionKey) i.next(); i.remove(); // Check whether this key is the SelectionKey we got when // we registered the ServerSocketChannel. if (key == serverkey) { // Activity on the ServerSocketChannel means a client // is trying to connect to the server. if (key.isAcceptable()) { // Accept the client connection, and obtain a // SocketChannel to communicate with the client. SocketChannel client = server.accept(); // Make sure we actually got a connection if (client == null) continue; // Put the client channel in non-blocking mode. client.configureBlocking(false); // Now register the client channel with the Selector, // specifying that we'd like to know when there is // data ready to read on the channel. SelectionKey clientkey = client.register(selector, SelectionKey.OP_READ); } } else { // If the key we got from the Set of keys is not the // ServerSocketChannel key, then it must be a key // representing one of the client connections. // Get the channel from the key. SocketChannel client = (SocketChannel) key.channel(); // If we got here, it should mean that there is data to // be read from the channel, but we double-check here. if (!key.isReadable()) continue; // Now read bytes from the client. We assume that // we get all the client's bytes in one read operation client.read(body); // The data we read should be some kind of HTTP GET // request. We don't bother checking it however since // there is only one page of data we know how to return. body.clear(); // Build an HTML document as our reponse. // The body of the document contains PrintService details StringBuffer response = new StringBuffer(); response.append( "<html><head><title>Printer Status</title></head>" + "<body><h1>Printer Status</h1>"); for (int s = 0; s < services.length; s++) { PrintService service = services[s]; response.append("<h2>").append(service.getName()).append("</h2><table>"); Attribute[] attrs = service.getAttributes().toArray(); for (int a = 0; a < attrs.length; a++) { Attribute attr = attrs[a]; response.append("<tr><td>").append(attr.getName()).append("</td><td>").append(attr) .append("</tr>"); } response.append("</table>"); } response.append("</body></html>\r\n"); // Encode the response into the body ByteBuffer encoder.reset(); encoder.encode(CharBuffer.wrap(response), body, true); encoder.flush(body); body.flip(); // Prepare the body buffer to be drained // While there are bytes left to write while (body.hasRemaining()) { // Write both header and body buffers client.write(buffers); } buffers[0].flip(); // Prepare header buffer for next write body.clear(); // Prepare body buffer for next read // Once we've sent our response, we have no more interest // in the client channel or its SelectionKey client.close(); // Close the channel. key.cancel(); // Tell Selector to stop monitoring it. } } } }
From source file:com.github.neoio.nio.util.NIOUtils.java
public static ServerSocketChannel openServerSocket(Selector selector, SocketAddress socketAddress) throws NetSocketException { ServerSocketChannel toReturn; try {// ww w. ja va 2s. c o m toReturn = ServerSocketChannel.open(); toReturn.socket().bind(socketAddress); toReturn.configureBlocking(false); toReturn.register(selector, SelectionKey.OP_ACCEPT); } catch (IOException e) { logger.error("IOException occurred while opening server socket", e); toReturn = null; } return toReturn; }
From source file:gridool.communication.transport.nio.GridNioServer.java
private static Selector createSelector(int port) throws IOException { final Selector selector = SelectorProvider.provider().openSelector(); ServerSocketChannel serverChannel = ServerSocketChannel.open(); serverChannel.configureBlocking(false); ServerSocket servSocket = serverChannel.socket(); servSocket.setReuseAddress(true);//from w ww. j a v a2s .c o m servSocket.bind(new InetSocketAddress(port)); serverChannel.register(selector, SelectionKey.OP_ACCEPT); if (LOG.isInfoEnabled()) { LOG.info("GridNioServer is started at port: " + port); } return selector; }
From source file:gridool.communication.transport.tcp.GridNioServer.java
private static void startListening(final Selector connectSelector, final int port) throws IOException { ServerSocketChannel serverChannel = ServerSocketChannel.open(); serverChannel.configureBlocking(false); ServerSocket servSocket = serverChannel.socket(); servSocket.setReuseAddress(true);/*w w w . jav a 2 s . c om*/ servSocket.bind(new InetSocketAddress(port)); serverChannel.register(connectSelector, SelectionKey.OP_ACCEPT); if (LOG.isInfoEnabled()) { LOG.info("GridNioServer is started at port: " + port); } }
From source file:me.xingrz.prox.tcp.TcpProxy.java
@Override protected ServerSocketChannel createChannel(Selector selector) throws IOException { ServerSocketChannel channel = ServerSocketChannel.open(); channel.configureBlocking(false);// w w w . j a v a2 s.c o m channel.socket().bind(new InetSocketAddress(0)); channel.register(selector, SelectionKey.OP_ACCEPT, this); return channel; }
From source file:com.l2jfree.network.mmocore.AcceptorThread.java
public void openServerSocket(InetAddress address, int port) throws IOException { ServerSocketChannel selectable = ServerSocketChannel.open(); selectable.configureBlocking(false); ServerSocket ss = selectable.socket(); ss.setReuseAddress(true);//www . j a v a 2s . c o m ss.setReceiveBufferSize(getBufferSize()); if (address == null) { ss.bind(new InetSocketAddress(port)); } else { ss.bind(new InetSocketAddress(address, port)); } selectable.register(getSelector(), SelectionKey.OP_ACCEPT); }
From source file:org.reunionemu.jreunion.server.Network.java
public boolean register(InetSocketAddress address) { try {/* w w w . j a v a 2s . c o m*/ ServerSocketChannel serverChannel = ServerSocketChannel.open(); ServerSocket serverSocket = serverChannel.socket(); serverSocket.bind(address); serverChannel.configureBlocking(false); synchronized (this) { selector.wakeup(); serverChannel.register(selector, SelectionKey.OP_ACCEPT); } } catch (Exception e) { if (e instanceof BindException) { LoggerFactory.getLogger(Network.class) .error("Port " + address.getPort() + " not available. Is the server already running?", e); return false; } } return true; }
From source file:oz.hadoop.yarn.api.net.ApplicationContainerServerImpl.java
/** * /* ww w . j a v a 2s .c o m*/ */ @Override void init() throws IOException { ServerSocketChannel channel = (ServerSocketChannel) this.rootChannel; channel.configureBlocking(false); channel.socket().bind(this.address); channel.register(this.selector, SelectionKey.OP_ACCEPT); if (logger.isInfoEnabled()) { logger.info("Bound to " + channel.getLocalAddress()); } }
From source file:org.sonews.daemon.sync.SynchronousNNTPDaemon.java
@Override public void run() { try {/*from w w w . j a v a 2 s . c o m*/ Log.get().log(Level.INFO, "Server listening on port {0}", port); // Create a Selector that handles the SocketChannel multiplexing final Selector readSelector = Selector.open(); final Selector writeSelector = Selector.open(); // Start working threads final int workerThreads = Math.max(4, 2 * Runtime.getRuntime().availableProcessors()); ConnectionWorker[] cworkers = new ConnectionWorker[workerThreads]; for (int n = 0; n < workerThreads; n++) { cworkers[n] = new ConnectionWorker(); cworkers[n].start(); } Log.get().log(Level.INFO, "{0} worker threads started.", workerThreads); ChannelWriter.getInstance().setSelector(writeSelector); ChannelReader.getInstance().setSelector(readSelector); ChannelWriter.getInstance().start(); ChannelReader.getInstance().start(); final ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.configureBlocking(true); // Set to blocking mode // Configure ServerSocket; bind to socket... serverSocket = serverSocketChannel.socket(); serverSocket.bind(new InetSocketAddress(this.port)); while (isRunning()) { SocketChannel socketChannel; try { // As we set the server socket channel to blocking mode the // accept() // method will block. socketChannel = serverSocketChannel.accept(); socketChannel.configureBlocking(false); assert socketChannel.isConnected(); assert socketChannel.finishConnect(); } catch (IOException ex) { // Under heavy load an IOException "Too many open files may // be thrown. It most cases we should slow down the // connection accepting, to give the worker threads some // time to process work. Log.get().log(Level.SEVERE, "IOException while accepting connection: {0}", ex.getMessage()); Log.get().info("Connection accepting sleeping for seconds..."); Thread.sleep(5000); // 5 seconds continue; } //FIXME conn should be NNTPConnection final SynchronousNNTPConnection conn = (SynchronousNNTPConnection) context .getBean("syncNNTPConnection", NNTPConnection.class); conn.setChannelWrapper(new SocketChannelWrapperFactory(socketChannel).create()); Connections.getInstance().add(conn); try { SelectionKey selKeyWrite = registerSelector(writeSelector, socketChannel, SelectionKey.OP_WRITE); registerSelector(readSelector, socketChannel, SelectionKey.OP_READ); Log.get().log(Level.INFO, "Connected: {0}", socketChannel.socket().getRemoteSocketAddress()); // Set write selection key and send hello to client conn.setWriteSelectionKey(selKeyWrite); conn.println("200 " + Config.inst().get(Config.HOSTNAME, "localhost") + " <unknown version>" // + Application.VERSION + " news server ready - (posting ok)."); } catch (CancelledKeyException cke) { Log.get().log(Level.WARNING, "CancelledKeyException {0} was thrown: {1}", new Object[] { cke.getMessage(), socketChannel.socket() }); } catch (ClosedChannelException cce) { Log.get().log(Level.WARNING, "ClosedChannelException {0} was thrown: {1}", new Object[] { cce.getMessage(), socketChannel.socket() }); } } } catch (BindException ex) { // Could not bind to socket; this is a fatal, so perform a shutdown Log.get().log(Level.SEVERE, ex.getLocalizedMessage() + " -> shutdown sonews", ex); setRunning(false); } catch (IOException ex) { ex.printStackTrace(); } catch (Exception ex) { ex.printStackTrace(); } }