nio示例
public class NioService {
private Selector selector;
public void init{
try {
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.configureBlocking(false);
//开启非阻塞模式
ssc.socket().bind(new InetSocketAddress(8082));
//绑定监听端口
selector = Selector.open();
ssc.register(selector, SelectionKey.OP_ACCEPT);
//注册选择器
Handler handler = new Handler();
while (true){
if(selector.select(3000)==0){//使用超时方式完成非阻塞操作
System.out.println("等待请求超时。。。。。。。。。");
continue;
}
Iterator it = selector.selectedKeys().iterator();
while (it.hasNext()){
try {
SelectionKey sk = it.next();
if (sk.isAcceptable()) {//接收就绪
handler.handAccept(sk);
}
if (sk.isReadable()) {//读就绪
handler.handRead(sk);
}
}catch (Exception e){
e.printStackTrace();
}finally {
it.remove();
//一定要手动去除完成的selectionKey,否则selector会一直保持它
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}private class Handler{
//在接收准备好后,给准备好的SocketChannel注册读就绪选择器
public void handAccept(SelectionKey key) throws IOException {
SocketChannel socketChannel = ((ServerSocketChannel) key.channel()).accept();
socketChannel.configureBlocking(false);
//非阻塞
socketChannel.register(selector,SelectionKey.OP_READ);
}//将上传的文件转存到本地文件夹
public void handRead(SelectionKey key) throws IOException {
SocketChannel socketChannel = null;
FileChannel fileChannel = null;
try {
socketChannel = ((SocketChannel) key.channel());
//准备ByteBuffer
ByteBuffer byteBuffer = ByteBuffer.allocate(128);
byteBuffer.clear();
//准备目标channel
File file = new File("file/");
if(!file.exists()){
file.mkdirs();
}
fileChannel = new FileOutputStream("file/"+UUID.randomUUID().toString()).getChannel();
//转存
while (socketChannel.read(byteBuffer) != -1) {
byteBuffer.flip();
fileChannel.write(byteBuffer);
byteBuffer.clear();
//一定要clear()
}
//下面不确定正确性
byteBuffer.clear();
String sendString = "ok";
byteBuffer.put(sendString.getBytes("utf-8"));
socketChannel.write(byteBuffer);
}catch (IOException e){
throw e;
}finally {
if(fileChannel!=null)
fileChannel.close();
if(socketChannel!=null)
socketChannel.close();
}
}
}
【nio示例】}
推荐阅读
- 逻辑回归的理解与python示例
- Spring|Spring Cloud Feign实现文件上传下载的示例代码
- C语言进阶栈帧示例详解教程
- 2019年PB|2019年PB County Senior Open, 保龄生涯(64)
- OpenCV|OpenCV-Python实战(18)——深度学习简介与入门示例
- 第一个程序——helloworld
- c#中task与thread区别及其使用的方法示例
- locust实例
- 辛星2018年nio教程第四篇:ByteBuffer的加速技术
- Springboot整合kafka的示例代码