当前位置: 首页 > 后端技术 > Java

netty入门(原生jdknio写一个服务器)

时间:2023-04-01 14:35:30 Java

jdknioserver简介学习netty之前我们需要先了解nio,所以想分享一下如何用jdknio编写服务进程第一步:开启一个服务通道(Channel)并设置非阻塞模式第二步:创建一个serviceStep3:开启一个multiplexer并注册到Channel,对ACCEPT事件感兴趣Step4:轮询选择multiplexer,对不同的multiplexer进行相关操作(读写)publicclassNoUseNettyNio{publicvoidserve(intport)throwsIOException{//打开一个ServerSocketChannelServerSocketChannelserverSocketChannel=ServerSocketChannel.open();//设置一个serverSocketChannel为非阻塞模式,即nioserverSocketChannel.configureBlocking(false);//通过serverSocketChannel获取serverSocketServerSocketserverSocket=serverSocketChannel.socket();//创建服务器网卡地址对象InetSocketAddressaddress=newInetSocketAddress(port);//为serverSocket绑定网卡地址serverSocket.bind(address);//开启一个selector(multiplexSelectorselector=Selector.open();//将multiplexer注册到serverSocketChannel(pipeline)serverSocketChannel.register(selector,SelectionKey.OP_ACCEPT);//创建一个byteBufferByteBufferbuffer=ByteBuffer.wrap(("HTTP/1.1200OK\r\n"+"Content-Type:text/html;charset=UTF-8\r\n").getBytes(StandardCharsets.UTF_8));for(;;){try{//选择一个通道,该方法被阻塞,当有通道、线程中断或Selector唤醒时,返回selector.select();}catch(IOExceptione){e.printStackTrace();休息;}//得到一个selectKey集合,只能删除不能添加,SetselectionKeys=selector.selectedKeys();Iteratoriterator=selectionKeys.iterator();while(iterator.hasNext()){SelectionKeykey=iterator.next();迭代器.remove();尝试{if(key.isAcceptable()){ServerSocketChannel服务器=(ServerSocketChannel)key.channel();SocketChannel客户端=server.accept();client.configureBlocking(false);client.register(selector,SelectionKey.OP_READ|SelectionKey.OP_WRITE,buffer.duplicate());System.out.println("接受来自"+client的连接);}if(key.isWritable()){SocketChannel客户端=(SocketChannel)key.channel();ByteBuffer附件=(ByteBuffer)key.attachment();while(buffer.hasRemaining()){System.out.println(attachment.toString());if(client.write(attachment)==0){break;}}client.close();}}catch(IOExceptione){key.channel();尝试{key.channel().close();}catch(IOExceptionex){}e.printStackTrace();}}}}publicstaticvoidmain(String[]args)throwsIOException{NoUseNettyNionoUseNettyNio=newNoUseNettyNio();noUseNettyNio.serve(8910);}}