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

//服务器端

public class Server {

private static ExecutorService executorService = Executors.newFixedThreadPool(4);

public static void main(String[] args) {

try {

AsynchronousChannelGroup group=AsynchronousChannelGroup.withThreadPool(executorService);

AsynchronousServerSocketChannel server=AsynchronousServerSocketChannel.open(group);

server.bind(new InetSocketAddress(8881));

server.accept(null, new CompletionHandler() {

@Override

public void completed(AsynchronousSocketChannel client, Object attachment) {

server.accept(null, this);

try {

System.out.println("服务器收到客户端"+client.getRemoteAddress().toString());

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

ByteBuffer buffer=ByteBuffer.allocate(1024);

client.read(buffer, buffer, new CompletionHandler() {

@Override

public void completed(Integer index, ByteBuffer buffer) {

try {

buffer.flip();

int i=buffer.getInt(0);

System.out.println(Thread.currentThread().getName()+" 服务器收到客户端消息"+client.getRemoteAddress().toString()+ " "+i);

buffer.putInt(0, i+1);

client.write(buffer).get();//这个是异步的,一定要用get 确保执行结束 才能clear

buffer.clear();

client.read(buffer,buffer,this);

}catch (Exception e) {

e.printStackTrace();

}

}

@Override

public void failed(Throwable exc, ByteBuffer attachment) {

throw new RuntimeException(exc.getMessage());

}

});

}

@Override

public void failed(Throwable exc, Object attachment) {

throw new RuntimeException(exc.getMessage());

}

});

while(true) {

Thread.sleep(2000);

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

//客户端

public class Client {

public static void main(String[] args) {

try {

AsynchronousSocketChannel client=AsynchronousSocketChannel.open();

client.connect(new InetSocketAddress("127.0.0.1", 8881), null, new CompletionHandler() {

@Override

public void completed(Void result, Object attachment) {

System.out.println("连接服务器成功");

ByteBuffer buffer=ByteBuffer.allocate(1024);

buffer.putInt(0,1);

try {

client.write(buffer).get();

} catch (InterruptedException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

} catch (ExecutionException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

buffer.clear();

client.read(buffer, buffer, new CompletionHandler() {

@Override

public void completed(Integer result, ByteBuffer buffer) {

try {

//System.out.println("result="+result+" postition="+buffer.position()+" limit="+buffer.limit());

buffer.flip();

int i=buffer.getInt(0);

System.out.println("客户端收到服务器返回的消息"+client.getRemoteAddress().toString()+" "+i);

buffer.putInt(0, i+1);

Thread.sleep(2000);

client.write(buffer).get();

buffer.clear();

client.read(buffer, buffer, this);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (ExecutionException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

@Override

public void failed(Throwable exc, ByteBuffer attachment) {

throw new RuntimeException(exc.getMessage());

}

});

}

@Override

public void failed(Throwable exc, Object attachment) {

throw new RuntimeException(exc.getMessage());

}

});

while(true) {

Thread.sleep(2000);

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

java aio聊天_JAVA aio简单使用相关推荐

  1. java gui 日历_Java实现简单日历小程序 Java图形界面小日历开发

    今天给大家介绍一下如何用Java swing开发一款简单的小日历,下面我们来看代码: 首先创建一个CalendarBean类,用于基本的日期计算: package other1; import jav ...

  2. java 日历界面_Java实现简单日历小程序 Java图形界面小日历开发

    今天给大家介绍一下如何用java swing开发一款简单的小日历,下面我们来看代码: 首先创建一个calendarbean类,用于基本的日期计算: package other1; import jav ...

  3. java银行取款_Java写简单的银行取钱系统

    按ctrl+a 选中所有的代码删除,再复制下面的代码输入即可 import java.util.Scanner; public class 简单的银行取钱系统 //class的名字可以自己新建和这个一 ...

  4. java窗口聊天_java聊天窗口的实现

    编写一数据报通信程序,实现简单的聊天功能. "聊天内容"和"输入文本"分别为当前聊天的历史信息和当前要传送出去的聊天文本."确定".&quo ...

  5. java udp聊天_Java UDP实现聊天功能代码

    我以前经常写的是基于TCP的网络编程,由于TCP建立连接鼻血要经过三次握手连接,服务器端需要阻塞式等待客户端的连接.而UDP则是可以直接向目的地址的目的端口上发送数据包,由于它只负责发送出去就好,不管 ...

  6. java 通信 教程_Java实现简单的socket通信教程

    今天学习了一下java如何实现socket通信,感觉难点反而是在io上,因为java对socket封装已经很完善了. 今天代码花了整个晚上调试,主要原因是io的flush问题和命令行下如何运行具有pa ...

  7. java字符生成器_Java实现简单字符生成器代码例子

    创建成功的字符串对象,其长度是固定的,内容是不能被修改和编辑.虽然使用"+"可以达到增加新字符或字符串的目的,但"+"会产生一个新的String实例,会在内存中 ...

  8. java扫雷教程_java实现简单扫雷游戏

    本文实例为大家分享了java实现简单扫雷游戏的具体代码,供大家参考,具体内容如下 package com.test.swing; import java.awt.event.ActionEvent; ...

  9. java泛型特点_java泛型简单总结

    Java泛型简单总结 1)基本概念: 泛型(Generic Type或Generics)是 对Java语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看做是使用参数化类型时 ...

最新文章

  1. Java项目:CRM客户关系管理系统(java+Springboot+maven+mysql)
  2. Spring定时任务的配置
  3. 论MORMOT序列的JSON格式
  4. ubuntu18 常用命令
  5. 给 ListBox 的 DataTemplate 模板中的 元素设置动画
  6. 北理计算机教案,北理工版三年级信息技术教案重点.docx
  7. java初始化配置_java – 初始化没有XML配置的数据库,但使用@Configuration
  8. 一个好的函数(gcd)求最小公约数
  9. ie下解决PNG图片不透明问题
  10. Windows 使用技巧之WinZIP密码破解
  11. php eclipse aptana,eclipse 下如何安装 Aptana插件
  12. andorid自动化测试之Monkey(上)
  13. 蠕虫病毒Synaptics.exe感染日记
  14. 如何注册腾讯云账号(图文教程)?
  15. 简单优雅的搭建个人博客
  16. 【数据结构】使用队列实现循环调度法
  17. 笔记本计算机没有声音是怎么回事,笔记本电脑声音没了怎么恢复_笔记本怎么没有声音-win7之家...
  18. Filter-url拦截
  19. 雨伞16骨好还是24骨好_伞骨什么材质好 晴雨伞骨数越多越好吗
  20. 戴尔电脑遇到问题,运行SupportAssist.更新后大部分问题可以解决。

热门文章

  1. 蓝桥杯基础模块6_2:定时器进阶
  2. 打印矩阵 java_【Java】 剑指offer(29) 顺时针打印矩阵
  3. TDMA 时分多路复用
  4. QPSK信号调制之ASCII码
  5. Apache-DBUtils实现CRUD操作,已封装的API实现jdbc对数据库进行操作
  6. python中sorted的用法append_Python中高阶函数sorted()用法
  7. java查看jvm对象个数_jmap-查看 jvm 内存对象信息
  8. 开源PagerSlidingTabStrip的使用Tab与ViewPager的完美结合
  9. 洛谷P3857 [TJOI2008]彩灯(线性基)
  10. [湖南师大集训2018 7 26] hunger 解题报告 (SPFA)