mirror of
https://github.com/boostorg/redis.git
synced 2026-01-19 04:42:09 +00:00
106 lines
2.5 KiB
Java
106 lines
2.5 KiB
Java
import java.nio.*;
|
|
import java.nio.channels.*;
|
|
import java.net.*;
|
|
import java.util.*;
|
|
import java.io.IOException;
|
|
|
|
public class TcpEchoServer {
|
|
|
|
public static int DEFAULT_PORT = 55555;
|
|
|
|
public static void main(String[] args) {
|
|
int port;
|
|
try {
|
|
port = Integer.parseInt(args[0]);
|
|
}
|
|
|
|
catch (Exception ex) {
|
|
port = DEFAULT_PORT;
|
|
}
|
|
|
|
//System.out.println("Listening for connections on port " + port);
|
|
ServerSocketChannel serverChannel;
|
|
Selector selector;
|
|
try {
|
|
serverChannel = ServerSocketChannel.open( );
|
|
ServerSocket ss = serverChannel.socket( );
|
|
InetSocketAddress address = new InetSocketAddress(port);
|
|
ss.bind(address);
|
|
serverChannel.configureBlocking(false);
|
|
selector = Selector.open( );
|
|
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
|
|
}
|
|
catch (IOException ex) {
|
|
ex.printStackTrace( );
|
|
return;
|
|
}
|
|
while (true) {
|
|
try {
|
|
selector.select( );
|
|
}
|
|
catch (IOException ex) {
|
|
ex.printStackTrace( );
|
|
break;
|
|
}
|
|
Set readyKeys = selector.selectedKeys( );
|
|
Iterator iterator = readyKeys.iterator( );
|
|
while (iterator.hasNext( )) {
|
|
SelectionKey key = (SelectionKey) iterator.next( );
|
|
iterator.remove( );
|
|
try {
|
|
if (key.isAcceptable( )) {
|
|
ServerSocketChannel server = (ServerSocketChannel ) key.channel( );
|
|
SocketChannel client = server.accept( );
|
|
//System.out.println("Accepted connection from " + client);
|
|
client.configureBlocking(false);
|
|
SelectionKey clientKey = client.register(
|
|
selector, SelectionKey.OP_WRITE | SelectionKey.OP_READ);
|
|
ByteBuffer buffer = ByteBuffer.allocate(100);
|
|
clientKey.attach(buffer);
|
|
//System.out.println(buffer.toString());
|
|
|
|
}
|
|
|
|
if (key.isReadable( )) {
|
|
SocketChannel client = (SocketChannel) key.channel( );
|
|
ByteBuffer output = (ByteBuffer) key.attachment( );
|
|
client.read(output);
|
|
}
|
|
|
|
if (key.isWritable( )) {
|
|
SocketChannel client = (SocketChannel) key.channel( );
|
|
ByteBuffer output = (ByteBuffer) key.attachment( );
|
|
output.flip( );
|
|
client.write(output);
|
|
output.compact( );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
catch (IOException ex) {
|
|
key.cancel( );
|
|
try {
|
|
key.channel().close();
|
|
}
|
|
|
|
catch (IOException cex) {}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|