NIO网络编程
2024-09-03 09:14:30
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
最新文章
- bash的变量设置
- FTP文件夹打开错误,Windows无法访问此文件夹
- java基础知识回顾之---java StringBuffer,Stringbuilder与String的区别
- NS2仿真:公交车移动周期模型及性能分析
- OpenStack协同并发 eventlet
- nodejs学习笔记之安装、入门
- C/C++ 笔试、面试题目大汇总 转
- 深入Android媒体存储服务(一):APP与媒体存储服务的交互
- idea报错:Invalid bound statement (not found)
- springboot的maven配置问题
- [leetcode]32. Longest Valid Parentheses最长合法括号子串
- phpredis -- Redis Arrays用法
- SPP-net论文总结
- 查询sqlserver 表结构呀
- 【Luogu】 P3928 SAC E#1 - 一道简单题 Sequence2
- python 字符串,数学之间的不可描述的关系
- linux学习笔记命令篇1---命令ls
- web大文件上传控件-监控f_create流程-Xproer.HttpUploader6
- struts2 if标签示例[转]
- pscp no such file or directory
热门文章
- ES6的新特性
- iOS UILanel 一些小实用
- Java DbUtils简介
- 解决apscheduler报错:Run time of job …… next run at: ……)” was missed by
- 搜索和浏览离线 Wikipedia 维基百科(中/英)数据工具
- 网站 &; APP 安利
- nginx centos7 出现403 403 Forbidden
- which had no Root Element. This likely means the XML is malformed or missing
- 《MVC架构下网站的设计与实现》论文笔记(十八)
- vue项目中使用vue-layer弹框插件