原文地址:

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();
}
}

(转)socket Aio demo的更多相关文章

  1. LR Socket 测试demo

    建议像我这样最开始未接触过的,还是先从简单录制开始.录制完之后,分析测试脚本,再学习,再自己根据需要编写测试脚本. 第一:录制. A.    B. 选择需要录制的exe的目录 ,填写完后点击ok. C ...

  2. 一个简单的Socket通信Demo

    服务器端Demo: Server.java(服务器端运行主程序,直接运行): package cn.wjs; import java.net.InetAddress; import java.net. ...

  3. [java]基于UDP的Socket通信Demo

    java课编程作业:在老师给的demo的基础上实现客户端发送数据到服务器端,服务器端接受客户端后进行数据广播. 整体功能类似于聊天室,代码部分不是太难,但是在本机测试的时候出现这样的问题: 服务端通过 ...

  4. Socket简单Demo

    Socket协议网上介绍的有很多了,就不在画蛇添足了,本文主要编写一个小Demo,介绍下它具体实现 一:Socket服务器端 package com.founderit; import java.io ...

  5. socket Bio demo

    最近在做socket通信,最开始是基于Bio开发(其实开发的时候也不知道这种是基于BIO).但是问题来了,客户端发的报文,服务端接收会少,为了解决问题,只能恶补一下相关知识. 服务端: import ...

  6. 闲来无事,写个基于UDP协议的Socket通讯Demo

    项目一期已经做完,二期需求还没定稿,所以最近比较闲. 上一篇写的是TCP协议,今天写一下UDP协议.TCP是有连接协议,所以发送和接收消息前客户端和服务端需要建立连接:UDP是无连接协议,所以发送消息 ...

  7. 闲来无事,写个基于TCP协议的Socket通讯Demo

    .Net Socket通讯可以使用Socket类,也可以使用 TcpClient. TcpListener 和 UdpClient类.我这里使用的是Socket类,Tcp协议. 程序很简单,一个命令行 ...

  8. ios socket(基础demo)

    http://blog.sina.com.cn/s/blog_7a2f0a830101ecv4.html clinetSocket 1.viewcontroller.h @interface View ...

  9. 12、android socket使用demo:网络聊天

    目录: 一.效果图 二.原代码分享 三.代码分析 四.总结 一.效果图如下: 客户端1: 客户端2:           二.原代码分享如下: 1.java代码只有一个 MainActivity.ja ...

随机推荐

  1. 从E.E到S.E

    title: 从E.E到S.E date: 2014-12-18 16:49:19 categories: [杂念] tags: [想法,生涯] --- 我在本科学的是Electric Enginee ...

  2. 【NLP】揭秘马尔可夫模型神秘面纱系列文章(四)

    维特比算法解决隐马尔可夫模型解码问题(中文句法标注) 作者:白宁超 2016年7月12日14:08:28 摘要:最早接触马尔可夫模型的定义源于吴军先生<数学之美>一书,起初觉得深奥难懂且无 ...

  3. u-boot源码汇编段简要分析

    Hi,大家好!我是CrazyCatJack,你们可以叫我CCJ或者疯猫.今天我给大家带来的是u-boot的源代码汇编段分析,以后还会给大家讲解后续的C代码,请持续关注哦^_^ 先简单说一下u-boot ...

  4. 国内maven镜像,快的飞起

    在oschina关来关去的烦恼下,终于受不了去寻找其他公共库了. 阿里云maven镜像 <mirrors> <mirror> <id>alimaven</id ...

  5. Redis简单案例(三) 连续登陆活动的简单实现

    连续登陆活动,或许大家都不会陌生,简单理解就是用户连续登陆了多少天之后,系统就会送一些礼品给相应的用户.最常见的 莫过于游戏和商城这些.游戏就送游戏币之类的东西,商城就送一些礼券.正值国庆,应该也有不 ...

  6. [WinForm]WinForm跨线程UI操作常用控件类大全

    前言 在C#开发的WinForm窗体程序开发的时候,经常会使用多线程处理一些比较耗时之类的操作.不过会有一个问题:就是涉及到跨线程操作UI元素. 相信才开始接触的人一定会遇上这个问题. 为了解决这个问 ...

  7. C#写文本日志帮助类(支持多线程)改进版(不适用于ASP.NET程序)

    由于iis的自动回收机制,不适用于ASP.NET程序 代码: using System; using System.Collections.Concurrent; using System.Confi ...

  8. 安装MySql for Visual Studio的坑

    阅读目录 问题描述 解决过程 解决方案 总结 回到顶部 问题描述 安装MySql for Visual Studio 一般来说是为了能在VS的服务器数据连接的数据源中能选择MySql类型,如下图: 但 ...

  9. 【无私分享:ASP.NET CORE 项目实战(第六章)】读取配置文件(一) appsettings.json

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 在我们之前的Asp.net mvc 开发中,一提到配置文件,我们不由的想到 web.config 和 app.config,在 ...

  10. 25 highest paying companies: Which tech co outranks Google, Facebook and Microsoft?

    Tech companies dominate Glassdoor’s ranking of the highest paying companies in the U.S., snagging 20 ...