优弱点很明明。这里首要说下弱点:首要瓶颈在线程上。每个毗连城市成立一个线程。固然线程耗损比历程小,可是一台呆板现实上能成立的有用线程有限,以Java来说,1.5往后,一个线程大抵耗损1M内存!且跟着线程数目的增进,CPU切换线程上下文的耗损也随之增进,在高过某个阀值后,继承增进线程,机能不增反降!而同样由于一个毗连就新建一个线程,以是编码模子很简朴!
就机能瓶颈这一点,就确定了BIO并不得当举办高机能处事器的开拓!像Tomcat这样的Web处事器,从7开始就从BIO改成了NIO,来进步处事器机能!
NIO
- //获取socket通道
- SocketChannel channel = SocketChannel.open();
- channel.configureBlocking(false);
- //得到通道打点器
- selector=Selector.open();
- channel.connect(new InetSocketAddress(serverIp, port));
- //为该通道注册SelectionKey.OP_CONNECT变乱
- channel.register(selector, SelectionKey.OP_CONNECT);
- while(true){
- //选择注册过的io操纵的变乱(第一次为SelectionKey.OP_CONNECT)
- selector.select();
- while(SelectionKey key : selector.selectedKeys()){
- if(key.isConnectable()){
- SocketChannel channel=(SocketChannel)key.channel();
- if(channel.isConnectionPending()){
- channel.finishConnect();//假如正在毗连,则完成毗连
- }
- channel.register(selector, SelectionKey.OP_READ);
- }else if(key.isReadable()){ //有可读数据变乱。
- SocketChannel channel = (SocketChannel)key.channel();
- ByteBuffer buffer = ByteBuffer.allocate(10);
- channel.read(buffer);
- byte[] data = buffer.array();
- String message = new String(data);
- System.out.println("recevie message from server:, size:"
- + buffer.position() + " msg: " + message);
- }
- }
- }
- //获取一个ServerSocket通道
- ServerSocketChannel serverChannel = ServerSocketChannel.open();
- serverChannel.configureBlocking(false);
- serverChannel.socket().bind(new InetSocketAddress(port));
- //获取通道打点器
- selector = Selector.open();
- //将通道打点器与通道绑定,并为该通道注册SelectionKey.OP_ACCEPT变乱,
- serverChannel.register(selector, SelectionKey.OP_ACCEPT);
- while(true){
- //当有注册的变乱达到时,要领返回,不然阻塞。
- selector.select();
- for(SelectionKey key : selector.selectedKeys()){
- if(key.isAcceptable()){
- ServerSocketChannel server =
- (ServerSocketChannel)key.channel();
- SocketChannel channel = server.accept();
- channel.write(ByteBuffer.wrap(
- new String("send message to client").getBytes()));
- //在与客户端毗连乐成后,为客户端通道注册SelectionKey.OP_READ变乱。
- channel.register(selector, SelectionKey.OP_READ);
- }else if(key.isReadable()){//有可读数据变乱
- SocketChannel channel = (SocketChannel)key.channel();
- ByteBuffer buffer = ByteBuffer.allocate(10);
- int read = channel.read(buffer);
- byte[] data = buffer.array();
- String message = new String(data);
- System.out.println("receive message from client, size:"
- + buffer.position() + " msg: " + message);
- }
- }
- }
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|