- Summary
Just like function select/poll/epoll on other platforms.
Classes:
SelectableChannel (SocketChannel, ServerSocketChannel, DatagramChannel, Pipe-Pipe.SinkChannel/Pipe.SourceChannel) + Selector + SelectionKey.
- Client
// Creates a non-blocking socket channel for the specified host name and port.
// connect() is called on the new channel before it is returned.
public static SocketChannel createSocketChannel(String hostName, int port) throws IOException {
// Create a non-blocking socket channel
SocketChannel sChannel = SocketChannel.open();
sChannel.configureBlocking(false);
// Send a connection request to the server; this method is non-blocking
sChannel.connect(new InetSocketAddress(hostName, port));
return sChannel;
}
// Create a non-blocking socket and check for connections
try {
// Create a non-blocking socket channel on port 80
SocketChannel sChannel = createSocketChannel("hostname.com", 80);
// Before the socket is usable, the connection must be completed
// by calling finishConnect(), which is non-blocking
while (!sChannel.finishConnect()) {
// Do something else
}
// Socket channel is now ready to use
} catch (IOException e) {
}
- Server
(Ref: )
public class MainClass {
public static void main(String[] args) throws IOException {
Charset charset = Charset.forName("ISO-8859-1");
CharsetEncoder encoder = charset.newEncoder();
CharsetDecoder decoder = charset.newDecoder();
ByteBuffer buffer = ByteBuffer.allocate(512);
Selector selector = Selector.open();
ServerSocketChannel server = ServerSocketChannel.open();
server.socket().bind(new java.net.InetSocketAddress(8000));
server.configureBlocking(false);
SelectionKey serverkey = server.register(selector, SelectionKey.OP_ACCEPT);
for (;;) {
selector.select();
Set keys = selector.selectedKeys();
for (Iterator i = keys.iterator(); i.hasNext();) {
SelectionKey key = (SelectionKey) i.next();
i.remove();
if (key == serverkey) {
if (key.isAcceptable()) {
SocketChannel client = server.accept();
client.configureBlocking(false);
SelectionKey clientkey = client.register(selector, SelectionKey.OP_READ);
clientkey.attach(new Integer(0));
}
} else {
SocketChannel client = (SocketChannel) key.channel();
if (!key.isReadable())
continue;
int bytesread = client.read(buffer);
if (bytesread == -1) {
key.cancel();
client.close();
continue;
}
buffer.flip();
String request = decoder.decode(buffer).toString();
buffer.clear();
if (request.trim().equals("quit")) {
client.write(encoder.encode(CharBuffer.wrap("Bye.")));
key.cancel();
client.close();
} else {
int num = ((Integer) key.attachment()).intValue();
String response = num + ": " + request.toUpperCase();
client.write(encoder.encode(CharBuffer.wrap(response)));
key.attach(new Integer(num + 1));
}
}
}
}
}
}
- xxx
阅读(1236) | 评论(0) | 转发(0) |