当前位置: 首页 > news >正文

(转)socket Aio demo

原文地址:

https://my.oschina.net/tangcoffee/blog/305656

参考文档:

http://my.oschina.net/u/862897/blog/164425

http://my.oschina.net/cshbbrain/blog/87076

http://my.oschina.net/bluesky0leon/blog/132361

http://blog.csdn.net/caiwenfeng_for_23/article/details/8458299

aio(或者叫nio2 ?) jdk1.7的新特性,代码上比nio写着舒服,但是性能貌似没比nio强。。。

import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousChannelGroup;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.apache.log4j.Logger;

public class AioServer implements Runnable{
    final static Logger logger = Logger.getLogger(AioServer.class);
    Object lock = new Object();
    InetSocketAddress serverAddress = null;
    int backlog = 0;
    int buff_size = 1024;
    int threadPoolSize = 0;
    
    public AioServer(int port){
        this.serverAddress = new InetSocketAddress(port);
        initialization();
    }
    
    public AioServer(String ip,int port){
        this.serverAddress = new InetSocketAddress(ip,port);
        initialization();
    }
    
    void initialization(){
        threadPoolSize = threadPoolSize>0? threadPoolSize: Runtime.getRuntime().availableProcessors();
    }

    @Override
    public void run() {
        try {            
            logger.info("aioserver threadPoolSize:"+this.threadPoolSize);
            ExecutorService threadPool = Executors.newFixedThreadPool(this.threadPoolSize); 
            AsynchronousChannelGroup channelGroup = AsynchronousChannelGroup.withThreadPool(threadPool);
            final AsynchronousServerSocketChannel assc = AsynchronousServerSocketChannel.open(channelGroup);
            if(this.backlog>0){ assc.bind(serverAddress,this.backlog); }
            else { assc.bind(serverAddress); }
            logger.info("aioserver listen:"+this.serverAddress);
            assc.accept(null, new CompletionHandler<AsynchronousSocketChannel,Object>(){
                @Override
                public void completed(AsynchronousSocketChannel result,
                        Object attachment) {
                    assc.accept(null, this);
                    handler(result,attachment);
                }

                @Override
                public void failed(Throwable exc, Object attachment) {
                    exc.printStackTrace();
                }                                
            });
            
            synchronized(lock){            
                lock.wait();
            }
            channelGroup.shutdownNow();
            logger.info("aioserver shutdownC.");
        } catch (Exception e) {
            e.printStackTrace();
        }        
    }    
    
    static byte[] echo = "done.".getBytes();
    static int connCount = 1;
    void handler(AsynchronousSocketChannel conn,Object att){
        try{
//            logger.info("connect server :"+connCount++);
            ByteBuffer buff = ByteBuffer.allocate(this.buff_size);
            buff.clear();
            
            int rl = conn.read(buff).get();
            buff.flip();
            logger.info("recv "+rl+": "+new String(buff.array(),0,rl));
            
            buff.clear(); //清空buff数据
            buff.put(echo);
            buff.flip();
            int wl = conn.write(buff).get();
            logger.info("send "+wl);
            conn.close();
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }
    
    public void setThreadPoolSize(int threadPoolSize){
        this.threadPoolSize = threadPoolSize;
    }
    
    public void setBacklog(int backlog){
        this.backlog = backlog;
    }
    
    public void shutdown(){
        //logger.info("call shutdown()");
        synchronized(lock){
            lock.notifyAll();
        }
    }
}

AioTest1.java

static void t3(){        
        AioServer aiose = new AioServer(9777);
        //线程模式启动
        new Thread(aiose).start();;        
        //非线程模式启动
//        aiose.run();
        try {
            Thread.sleep(1000*60*5);
            //3秒后关闭
            aiose.shutdown();
        } catch (InterruptedException e) {        
            e.printStackTrace();
        }
}

 

转载于:https://www.cnblogs.com/kevin1990/p/6249189.html

相关文章:

  • maven log4g 用法
  • JPA 系列教程 异常 集锦
  • react自学笔记总结不间断更新
  • 延迟构造
  • 微信小程序简易教程
  • Mysql免安装版配置【图文版和文字版】
  • 对AndroidStudio生成的项目进行压缩
  • 基于TFTP协议的远程升级设计
  • 正则须知(以后还会添加)
  • ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第五章:排序、分页和路由...
  • pandas常用函数之shift
  • 避免数据二次提交的处理方式
  • 磁盘配额实例详解
  • 框架与超链接的小示例
  • chrome的功能Copy as cURL
  • 10个确保微服务与容器安全的最佳实践
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • android图片蒙层
  • Android优雅地处理按钮重复点击
  • eclipse(luna)创建web工程
  • ES6核心特性
  • Java 多线程编程之:notify 和 wait 用法
  • Javascript编码规范
  • javascript面向对象之创建对象
  • Laravel Telescope:优雅的应用调试工具
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Node 版本管理
  • Protobuf3语言指南
  • Swoft 源码剖析 - 代码自动更新机制
  • tab.js分享及浏览器兼容性问题汇总
  • Vue小说阅读器(仿追书神器)
  • 分享几个不错的工具
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 简单实现一个textarea自适应高度
  • 蓝海存储开关机注意事项总结
  • 面试总结JavaScript篇
  • 悄悄地说一个bug
  • 如何设计一个比特币钱包服务
  • 山寨一个 Promise
  • 深入 Nginx 之配置篇
  • 听说你叫Java(二)–Servlet请求
  • 一份游戏开发学习路线
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 说说我为什么看好Spring Cloud Alibaba
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​flutter 代码混淆
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (39)STM32——FLASH闪存
  • (Forward) Music Player: From UI Proposal to Code
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (三)elasticsearch 源码之启动流程分析
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)