1、创建服务端代码

public class NioServer {

    private static Map<String, SocketChannel> clientMap = new HashMap<>();

    public static void main(String[] args) throws IOException {

        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
ServerSocket serverSocket = serverSocketChannel.socket();
serverSocket.bind(new InetSocketAddress(8899)); Selector selector = Selector.open();
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); while (true){
try {
selector.select();
Set<SelectionKey> selectionKeys = selector.selectedKeys();
selectionKeys.forEach( selectionKey -> { final SocketChannel client;
try{
//客户端向服务端发起一个连接
if(selectionKey.isAcceptable()){
ServerSocketChannel server = (ServerSocketChannel)selectionKey.channel();
client = server.accept();
client.configureBlocking(false);
client.register(selector, SelectionKey.OP_READ);
String key = "[" + UUID.randomUUID() + "]";
clientMap.put(key, client); }
//有数据可读
else if(selectionKey.isReadable()){
client = (SocketChannel)selectionKey.channel();
ByteBuffer readBuffer = ByteBuffer.allocate(1024);
int count = client.read(readBuffer);
if(count > 0){
readBuffer.flip(); Charset charset = Charset.forName("utf-8"); String receivedMessage = String.valueOf(charset.decode(readBuffer).array()); System.out.println(client + ": " + receivedMessage); String senderKey = null; for(Map.Entry<String,SocketChannel> entry : clientMap.entrySet()){
if(client == entry.getValue()){
senderKey = entry.getKey();
break;
}
} for(Map.Entry<String,SocketChannel> entry : clientMap.entrySet()){
SocketChannel value = entry.getValue();
ByteBuffer writeBuffer = ByteBuffer.allocate(1024);
writeBuffer.put((senderKey + ":" + receivedMessage).getBytes());
writeBuffer.flip();
value.write(writeBuffer);
} }
}
}catch (Exception ex){
ex.printStackTrace();
}
}); selectionKeys.clear(); }catch (Exception ex){
ex.printStackTrace();
}
} }
}

  

2、创建客户端代码

public class NioClient {

    public static void main(String[] args) {
try{ SocketChannel socketChannel = SocketChannel.open();
socketChannel.configureBlocking(false); Selector selector = Selector.open();
socketChannel.register(selector, SelectionKey.OP_CONNECT); socketChannel.connect(new InetSocketAddress("127.0.0.1",8899)); while (true){
selector.select();
Set<SelectionKey> keySet = selector.selectedKeys(); for(SelectionKey selectionKey : keySet){
//与服务端已经建立好了连接
if(selectionKey.isConnectable()){
SocketChannel client = (SocketChannel)selectionKey.channel();
if(client.isConnectionPending()){
client.finishConnect();
//向服务端发数据
ByteBuffer writeBuffer = ByteBuffer.allocate(1024);
writeBuffer.put((LocalDateTime.now() + "连接成功").getBytes());
writeBuffer.flip();
client.write(writeBuffer); // 启动一个线程,不断的读取标准输入的内容。然后将内容向回个服务端
ExecutorService executorService = Executors.newSingleThreadExecutor(Executors.defaultThreadFactory());
executorService.submit(() -> {
while (true){ try {
writeBuffer.clear();
InputStreamReader input = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(input); String sendMessage = br.readLine(); writeBuffer.put(sendMessage.getBytes());
writeBuffer.flip();
client.write(writeBuffer); }catch (Exception ex){ ex.printStackTrace();
}
}
}); }
client.register(selector, SelectionKey.OP_READ);
}else if(selectionKey.isReadable()){
SocketChannel client = (SocketChannel)selectionKey.channel();
ByteBuffer readBuffer = ByteBuffer.allocate(1024); int count = client.read(readBuffer); if(count > 0){
String receivedMessage = new String(readBuffer.array(), 0, count);
System.out.println(receivedMessage);
} }
}
keySet.clear();
} }catch (Exception ex){
ex.printStackTrace();
}
}
}

  

3、测试

1) 启动服务端

2) 启动两个客户端

3) 输出结果

NioServer输出

第一个NioClient输出。连接建立后,输入hello

第二个NioClient输出。 连接建立后,输入world

最新文章

  1. bash的变量设置
  2. FTP文件夹打开错误,Windows无法访问此文件夹
  3. java基础知识回顾之---java StringBuffer,Stringbuilder与String的区别
  4. NS2仿真:公交车移动周期模型及性能分析
  5. OpenStack协同并发 eventlet
  6. nodejs学习笔记之安装、入门
  7. C/C++ 笔试、面试题目大汇总 转
  8. 深入Android媒体存储服务(一):APP与媒体存储服务的交互
  9. idea报错:Invalid bound statement (not found)
  10. springboot的maven配置问题
  11. [leetcode]32. Longest Valid Parentheses最长合法括号子串
  12. phpredis -- Redis Arrays用法
  13. SPP-net论文总结
  14. 查询sqlserver 表结构呀
  15. 【Luogu】 P3928 SAC E#1 - 一道简单题 Sequence2
  16. python 字符串,数学之间的不可描述的关系
  17. linux学习笔记命令篇1---命令ls
  18. web大文件上传控件-监控f_create流程-Xproer.HttpUploader6
  19. struts2 if标签示例[转]
  20. pscp no such file or directory

热门文章

  1. ES6的新特性
  2. iOS UILanel 一些小实用
  3. Java DbUtils简介
  4. 解决apscheduler报错:Run time of job …… next run at: ……)” was missed by
  5. 搜索和浏览离线 Wikipedia 维基百科(中/英)数据工具
  6. 网站 &amp; APP 安利
  7. nginx centos7 出现403 403 Forbidden
  8. which had no Root Element. This likely means the XML is malformed or missing
  9. 《MVC架构下网站的设计与实现》论文笔记(十八)
  10. vue项目中使用vue-layer弹框插件