使用aio,实现客户端和服务器 对一个数进行轮流累加

  1. //服务器端
  2. public class Server {
  3. private static ExecutorService executorService = Executors.newFixedThreadPool(4);
  4. public static void main(String[] args) {
  5. try {
  6. AsynchronousChannelGroup group=AsynchronousChannelGroup.withThreadPool(executorService);
  7. AsynchronousServerSocketChannel server=AsynchronousServerSocketChannel.open(group);
  8. server.bind(new InetSocketAddress(8881));
  9. server.accept(null, new CompletionHandler<AsynchronousSocketChannel, Object>() {
  10. @Override
  11. public void completed(AsynchronousSocketChannel client, Object attachment) {
  12. server.accept(null, this);
  13. try {
  14. System.out.println("服务器收到客户端"+client.getRemoteAddress().toString());
  15. } catch (IOException e) {
  16. // TODO Auto-generated catch block
  17. e.printStackTrace();
  18. }
  19. ByteBuffer buffer=ByteBuffer.allocate(1024);
  20. client.read(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() {
  21. @Override
  22. public void completed(Integer index, ByteBuffer buffer) {
  23. try {
  24. buffer.flip();
  25. int i=buffer.getInt(0);
  26. System.out.println(Thread.currentThread().getName()+" 服务器收到客户端消息"+client.getRemoteAddress().toString()+ " "+i);
  27. buffer.putInt(0, i+1);
  28. client.write(buffer).get();//这个是异步的,一定要用get 确保执行结束 才能clear
  29. buffer.clear();
  30. client.read(buffer,buffer,this);
  31. }catch (Exception e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. @Override
  36. public void failed(Throwable exc, ByteBuffer attachment) {
  37. throw new RuntimeException(exc.getMessage());
  38. }
  39. });
  40. }
  41. @Override
  42. public void failed(Throwable exc, Object attachment) {
  43. throw new RuntimeException(exc.getMessage());
  44. }
  45. });
  46. while(true) {
  47. Thread.sleep(2000);
  48. }
  49. } catch (IOException e) {
  50. // TODO Auto-generated catch block
  51. e.printStackTrace();
  52. } catch (InterruptedException e) {
  53. // TODO Auto-generated catch block
  54. e.printStackTrace();
  55. }
  56. }
  57. }
  1. //客户端
  2. public class Client {
  3. public static void main(String[] args) {
  4. try {
  5. AsynchronousSocketChannel client=AsynchronousSocketChannel.open();
  6. client.connect(new InetSocketAddress("127.0.0.1", 8881), null, new CompletionHandler<Void, Object>() {
  7. @Override
  8. public void completed(Void result, Object attachment) {
  9. System.out.println("连接服务器成功");
  10. ByteBuffer buffer=ByteBuffer.allocate(1024);
  11. buffer.putInt(0,1);
  12. try {
  13. client.write(buffer).get();
  14. } catch (InterruptedException e1) {
  15. // TODO Auto-generated catch block
  16. e1.printStackTrace();
  17. } catch (ExecutionException e1) {
  18. // TODO Auto-generated catch block
  19. e1.printStackTrace();
  20. }
  21. buffer.clear();
  22. client.read(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() {
  23. @Override
  24. public void completed(Integer result, ByteBuffer buffer) {
  25. try {
  26. //System.out.println("result="+result+" postition="+buffer.position()+" limit="+buffer.limit());
  27. buffer.flip();
  28. int i=buffer.getInt(0);
  29. System.out.println("客户端收到服务器返回的消息"+client.getRemoteAddress().toString()+" "+i);
  30. buffer.putInt(0, i+1);
  31. Thread.sleep(2000);
  32. client.write(buffer).get();
  33. buffer.clear();
  34. client.read(buffer, buffer, this);
  35. } catch (IOException e) {
  36. // TODO Auto-generated catch block
  37. e.printStackTrace();
  38. } catch (InterruptedException e) {
  39. // TODO Auto-generated catch block
  40. e.printStackTrace();
  41. } catch (ExecutionException e) {
  42. // TODO Auto-generated catch block
  43. e.printStackTrace();
  44. }
  45. }
  46. @Override
  47. public void failed(Throwable exc, ByteBuffer attachment) {
  48. throw new RuntimeException(exc.getMessage());
  49. }
  50. });
  51. }
  52. @Override
  53. public void failed(Throwable exc, Object attachment) {
  54. throw new RuntimeException(exc.getMessage());
  55. }
  56. });
  57. while(true) {
  58. Thread.sleep(2000);
  59. }
  60. } catch (IOException e) {
  61. // TODO Auto-generated catch block
  62. e.printStackTrace();
  63. } catch (InterruptedException e) {
  64. // TODO Auto-generated catch block
  65. e.printStackTrace();
  66. }
  67. }
  68. }

JAVA aio简单使用的更多相关文章

  1. java的IO,AIO简单对比

    以下内容转载lzzzl Channel 通道 Buffer 缓冲区 Selector 选择器 其中Channel对应以前的流,Buffer不是什么新东西,Selector是因为nio可以使用异步的非堵 ...

  2. 深入理解Java AIO(一)—— Java AIO的简单使用

    深入理解Java AIO(一)—— Java AIO的简单使用 深入理解AIO系列分为三个部分 第一部分也就是本节的Java AIO的简单使用 第二部分是AIO源码解析(只解析关键部分)(待更新) 第 ...

  3. 深入理解Java AIO(二)—— AIO源码解析

    深入理解Java AIO(二)—— AIO源码解析 这篇只是个占位符,占个位置,之后再详细写(这个之后可能是永远) 所以这里只简单说一下我看了个大概的实现原理,具体的等我之后更新(可能不会更新了) 当 ...

  4. Java实现简单版SVM

    Java实现简单版SVM 近期的图像分类工作要用到latent svm,为了更加深入了解svm,自己动手实现一个简单版的.         之所以说是简单版,由于没实用到拉格朗日,对偶,核函数等等.而 ...

  5. java实现简单的单点登录

    java实现简单的单点登录 摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统当中.本文从业务的角度分析了单点登录的需求和应用领域:从技术本身的角度分析了单点登录技术的内部机制和实现 ...

  6. Java自定义简单标签

     Java自定义简单标签可以方便的在页面输出信息,并且对于权限的控制,和对于Jsp标签和servlet代码的分离有着很好的作用. 下面将以权限的控制为例自定义一个标签: 一.标签类型 <wxt: ...

  7. 主题:Java WebService 简单实例

    链接地址:主题:Java WebService 简单实例    http://www.iteye.com/topic/1135747 前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要 ...

  8. java设计模式--简单工厂

    java设计模式--简单工厂 简单工厂不是一个标准的设计模式,但是很常用需要掌握. 在java应用开发中,要"面向接口编程". 1.java中接口的概念: 在java中接口是一种特 ...

  9. JAVA实现简单的四则运算

    GitHub 项目地址 https://github.com/745421831/-/tree/master PSP PSP2.1 Personal Software Process Stages 预 ...

随机推荐

  1. 基于python的scrapy环境搭建

    0.1安装python软件 32位机的电脑安装python-3.6.3.exe 64位机的电脑安装python-3.6.3-amd64.exe 0.1.1 python环境搭建 执行安装程序 选择Ad ...

  2. FP-Tree算法详细过程(Java实现)

    我就不说FP-Tree的作用.优点什么的了,直接用例子来解释构建FP-Tree和找出所有频繁项集,第一次写博客,不对之处还请指出. 输入文件: testInput.txt T1 T2 T3 T4 T5 ...

  3. Spring boot 梳理 - 在bean中使用命令行参数-自动装配ApplicationArguments

    If you need to access the application arguments that were passed to SpringApplication.run(…​), you c ...

  4. markdown常用语法使用笔记

    markdown是当下比较流行的一种编辑标记语言,很多系统都支持markdown语法来编辑文件内容,像gitbook之类的,一下是一些学习笔记. 1.开头用#的数量表示1-6阶的标题,结尾可以以任意数 ...

  5. git基本命令整合

    基础命令 用户设置 $ git config --global user.name "Your Name" $ git config --global user.email &qu ...

  6. [Mathematics][MIT 18.03] Proof of a Theory about the Solution to Second-order Linear Homogeneous Differential Equation

    At first, I'd like to say thank you to MIT open courses which give me the privilege to enjoy the mos ...

  7. .Net Core 商城微服务项目系列(十五): 构建定时任务调度和消息队列管理系统

    一.系统描述 嗨,好久不见各位老哥,最近有点懒,技术博客写的太少了,因为最近在写小说,写的顺利的话说不定就转行了,哈哈哈哈哈哈哈哈哈. 今天要介绍的是基于.Net Core的定时任务调度和消息队列管理 ...

  8. redis常用笔记(第一版)

    1.SINTER 说明:多key之间取交集数据 key1 = {a,b,c,d} key2 = {c} key3 = {a,c,e} SINTER key1 key2 key3 = {c} 2.sad ...

  9. Zookeeper学习笔记之 Zab协议(Zookeeper Atomic Broadcast)

    Zab协议(Zookeeper Atomic Broadcast): 广播模式: Leader将所有更新(称为proposal),顺序发送给Follower 当Leader收到半数以上的Followe ...

  10. IDEA 学习笔记之 Python项目开发

    Python项目开发: 下载Python: https://www.python.org/downloads/release/python-363/ 安装Python: 配置环境变量(path): C ...