本文共 1680 字,大约阅读时间需要 5 分钟。
// 创建AsynchronousServerSocketChannel监听特定端口,并设置回调AcceptCompletionHandler AsynchronousServerSocketChannel serverSocketChannel = AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(PORT)); serverSocketChannel.accept(serverSocketChannel, new AcceptCompletionHandler()); // 监听回调,当用连接时会触发该回调 private static class AcceptCompletionHandler implements CompletionHandler<AsynchronousSocketChannel, AsynchronousServerSocketChannel> { @Override public void completed(AsynchronousSocketChannel result, AsynchronousServerSocketChannel attachment) { ByteBuffer byteBuffer = ByteBuffer.allocate(1024); // 注册read请求以及回调ReadCompletionHandler result.read(byteBuffer, result, new ReadCompletionHandler(byteBuffer, "client")); // 递归监听 attachment.accept(attachment, this); } @Override public void failed(Throwable exc, AsynchronousServerSocketChannel attachment) { // 递归监听 attachment.accept(attachment, this); } } // 读取数据回调,当有数据可读时触发该回调 public class ReadCompletionHandler implements CompletionHandler<Integer, AsynchronousSocketChannel> { private ByteBuffer byteBuffer; private String remoteName; public ReadCompletionHandler(ByteBuffer byteBuffer, String remoteName) { this.byteBuffer = byteBuffer; this.remoteName = remoteName; } @Override public void completed(Integer result, AsynchronousSocketChannel attachment) { if (result <= 0) return; byteBuffer.flip(); System.out.println("[" + this.remoteName + "] " + new String(byteBuffer.array())); byteBuffer.clear(); // 递归监听数据 attachment.read(byteBuffer, attachment, this); } @Override public void failed(Throwable exc, AsynchronousSocketChannel attachment) { byteBuffer.clear(); // 递归监听数据 attachment.read(byteBuffer, attachment, this); } }转载地址:http://iphii.baihongyu.com/