Java/Network Protocol/ServerSocketChannel
A simple TCP server for the daytime service
/*
* Copyright (c) 2004 David Flanagan. All rights reserved.
* This code is from the book Java Examples in a Nutshell, 3nd Edition.
* It is provided AS-IS, WITHOUT ANY WARRANTY either expressed or implied.
* You may study, use, and modify it for any non-commercial purpose,
* including teaching and use in open-source projects.
* You may distribute it non-commercially as long as you retain this notice.
* For a commercial use license, or to purchase the book,
* please visit http://www.davidflanagan.ru/javaexamples3.
*/
//package je3.nio;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
/**
* A simple TCP server for the daytime service. See RFC867 for details. This
* implementation lacks meaningful exception handling and cannot handle UDP
* connections.
*/
public class SimpleDaytimeServer {
public static void main(String args[]) throws java.io.IOException {
// RFC867 specifies port 13 for this service. On Unix platforms,
// you need to be running as root to use that port, so we allow
// this service to use other ports for testing.
int port = 13;
if (args.length > 0)
port = Integer.parseInt(args[0]);
// Create a channel to listen for connections on.
ServerSocketChannel server = ServerSocketChannel.open();
// Bind the channel to a local port. Note that we do this by obtaining
// the underlying java.net.ServerSocket and binding that socket.
server.socket().bind(new InetSocketAddress(port));
// Get an encoder for converting strings to bytes
CharsetEncoder encoder = Charset.forName("US-ASCII").newEncoder();
for (;;) { // Loop forever, processing client connections
// Wait for a client to connect
SocketChannel client = server.accept();
// Build response string, wrap, and encode to bytes
String date = new java.util.Date().toString() + "\r\n";
ByteBuffer response = encoder.encode(CharBuffer.wrap(date));
// Send the response to the client and disconnect.
client.write(response);
client.close();
}
}
}