最新要闻
- 环球快资讯丨iPhone大面积bug:苹果自带天气崩了 无任何数据
- 环球实时:国产PCSK9抑制剂 ,即将迎来商业爆发?
- 全球观速讯丨韩国主持人流鼻血仍淡定直播 本人回应没事:网友看笑但直呼真敬业
- 热文:钟南山亲自颁发!理想L9获颁“五星健康车”:383.4分创造历史
- 全球热头条丨文峰股份:3月31日融券卖出5300股,融资融券余额1.56亿元
- 加满一箱油少花13元!油价迎今年来最大降幅
- 天天热资讯!2020广州大佛寺中秋佳节拜月法会安排一览
- 汉唐元三车齐发!比亚迪乘用车在西班牙正式开售
- 【世界独家】不虚标!比亚迪汉EV冠军版实测光电续航达成率93.1%
- 世界今热点:中国最畅销手机出炉:“十三香”传奇上演 安卓高端难成
- 内存狂魔第一次冲上8200MHz!芝奇带来96GB DDR5
- 佛山企业标准“领跑者”数量连续三年全国第一
- 当前视点!腮腺炎初期有什么症状?_腮腺炎初期有什么症状
- 今日要闻!验证码被攻破!谷歌AI已能精准识别 GPT-4则装瞎求人帮忙
- 美女博主在家拍擦边视频?穿瑜伽服涨粉百万!真相是...
- 全球今头条!3DMark加入AMD FSR专项测试:终于追上NVIDIA、Intel
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
全球今日报丨Java 基础 -- NIO 多人聊天室
(资料图片仅供参考)
package com.atguigu.nio.groupchat;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.*;import java.util.Iterator;public class GroupChatServer { //定义属性 private Selector selector; private ServerSocketChannel listenChannel; private static final int PORT = 6667; //构造器 //初始化工作 public GroupChatServer() { try { //得到选择器 selector = Selector.open(); //ServerSocketChannel listenChannel = ServerSocketChannel.open(); //绑定端口 listenChannel.socket().bind(new InetSocketAddress(PORT)); //设置非阻塞模式 listenChannel.configureBlocking(false); //将该listenChannel 注册到selector listenChannel.register(selector, SelectionKey.OP_ACCEPT); }catch (IOException e) { e.printStackTrace(); } } //监听 public void listen() { System.out.println("监听线程: " + Thread.currentThread().getName()); try { //循环处理 while (true) { int count = selector.select(); if(count > 0) {//有事件处理 //遍历得到selectionKey 集合 Iteratoriterator = selector.selectedKeys().iterator(); while (iterator.hasNext()) { //取出selectionkey SelectionKey key = iterator.next(); //监听到accept if(key.isAcceptable()) { SocketChannel sc = listenChannel.accept(); sc.configureBlocking(false); //将该 sc 注册到seletor sc.register(selector, SelectionKey.OP_READ); //提示 System.out.println(sc.getRemoteAddress() + " 上线 "); } if(key.isReadable()) { //通道发送read事件,即通道是可读的状态 //处理读 (专门写方法..) readData(key); } //当前的key 删除,防止重复处理 iterator.remove(); } } else { System.out.println("等待...."); } } }catch (Exception e) { e.printStackTrace(); }finally { //发生异常处理.... } } //读取客户端消息 private void readData(SelectionKey key) { //取到关联的channle SocketChannel channel = null; try { //得到channel channel = (SocketChannel) key.channel(); //创建buffer ByteBuffer buffer = ByteBuffer.allocate(1024); int count = channel.read(buffer); //根据count的值做处理 if(count > 0) { //把缓存区的数据转成字符串 String msg = new String(buffer.array()); //输出该消息 System.out.println("form 客户端: " + msg); //向其它的客户端转发消息(去掉自己), 专门写一个方法来处理 sendInfoToOtherClients(msg, channel); } }catch (IOException e) { try { System.out.println(channel.getRemoteAddress() + " 离线了.."); //取消注册 key.cancel(); //关闭通道 channel.close(); }catch (IOException e2) { e2.printStackTrace();; } } } //转发消息给其它客户(通道) private void sendInfoToOtherClients(String msg, SocketChannel self ) throws IOException{ System.out.println("服务器转发消息中..."); System.out.println("服务器转发数据给客户端线程: " + Thread.currentThread().getName()); //遍历 所有注册到selector 上的 SocketChannel,并排除 self for(SelectionKey key: selector.keys()) { //通过 key 取出对应的 SocketChannel Channel targetChannel = key.channel(); //排除自己 if(targetChannel instanceof SocketChannel && targetChannel != self) { //转型 SocketChannel dest = (SocketChannel)targetChannel; //将msg 存储到buffer ByteBuffer buffer = ByteBuffer.wrap(msg.getBytes()); //将buffer 的数据写入 通道 dest.write(buffer); } } } public static void main(String[] args) { //创建服务器对象 GroupChatServer groupChatServer = new GroupChatServer(); groupChatServer.listen(); }}//可以写一个Handlerclass MyHandler { public void readData() { } public void sendInfoToOtherClients(){ }}
package com.atguigu.nio.groupchat;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.SocketChannel;import java.util.Iterator;import java.util.Scanner;import java.util.Set;public class GroupChatClient { //定义相关的属性 private final String HOST = "127.0.0.1"; // 服务器的ip private final int PORT = 6667; //服务器端口 private Selector selector; private SocketChannel socketChannel; private String username; //构造器, 完成初始化工作 public GroupChatClient() throws IOException { selector = Selector.open(); //连接服务器 socketChannel = socketChannel.open(new InetSocketAddress("127.0.0.1", PORT)); //设置非阻塞 socketChannel.configureBlocking(false); //将channel 注册到selector socketChannel.register(selector, SelectionKey.OP_READ); //得到username username = socketChannel.getLocalAddress().toString().substring(1); System.out.println(username + " is ok..."); } //向服务器发送消息 public void sendInfo(String info) { info = username + " 说:" + info; try { socketChannel.write(ByteBuffer.wrap(info.getBytes())); }catch (IOException e) { e.printStackTrace(); } } //读取从服务器端回复的消息 public void readInfo() { try { int readChannels = selector.select(); if(readChannels > 0) {//有可以用的通道 Iteratoriterator = selector.selectedKeys().iterator(); while (iterator.hasNext()) { SelectionKey key = iterator.next(); if(key.isReadable()) { //得到相关的通道 SocketChannel sc = (SocketChannel) key.channel(); //得到一个Buffer ByteBuffer buffer = ByteBuffer.allocate(1024); //读取 sc.read(buffer); //把读到的缓冲区的数据转成字符串 String msg = new String(buffer.array()); System.out.println(msg.trim()); } } iterator.remove(); //删除当前的selectionKey, 防止重复操作 } else { //System.out.println("没有可以用的通道..."); } }catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) throws Exception { //启动我们客户端 GroupChatClient chatClient = new GroupChatClient(); //启动一个线程, 每个3秒,读取从服务器发送数据 new Thread() { public void run() { while (true) { chatClient.readInfo(); try { Thread.currentThread().sleep(3000); }catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); //发送数据给服务器端 Scanner scanner = new Scanner(System.in); while (scanner.hasNextLine()) { String s = scanner.nextLine(); chatClient.sendInfo(s); } }}
关键词:
-
全球今日报丨Java 基础 -- NIO 多人聊天室
packagecom atguigu nio groupchat;importjava io IOException;importjava net InetSocketAddress;im
来源: 全球今日报丨Java 基础 -- NIO 多人聊天室
环球热推荐:四元数法
环球快资讯丨iPhone大面积bug:苹果自带天气崩了 无任何数据
shell 脚本之一键部署安装 Nginx
环球实时:国产PCSK9抑制剂 ,即将迎来商业爆发?
全球观速讯丨韩国主持人流鼻血仍淡定直播 本人回应没事:网友看笑但直呼真敬业
热文:钟南山亲自颁发!理想L9获颁“五星健康车”:383.4分创造历史
全球热头条丨文峰股份:3月31日融券卖出5300股,融资融券余额1.56亿元
全球动态:读SQL进阶教程笔记04_集合运算
加满一箱油少花13元!油价迎今年来最大降幅
天天热资讯!2020广州大佛寺中秋佳节拜月法会安排一览
Swift与OC混编
环球信息:知乎使用指南
汉唐元三车齐发!比亚迪乘用车在西班牙正式开售
【世界独家】不虚标!比亚迪汉EV冠军版实测光电续航达成率93.1%
世界今热点:中国最畅销手机出炉:“十三香”传奇上演 安卓高端难成
内存狂魔第一次冲上8200MHz!芝奇带来96GB DDR5
佛山企业标准“领跑者”数量连续三年全国第一
当前视点!腮腺炎初期有什么症状?_腮腺炎初期有什么症状
全球时讯:深度学习——用简单的线性模型构建识别鸟与飞机模型
Redhat/CentOS Linux 系统进入单用户模式
天天即时看!万恶的环境 二 java
今日要闻!验证码被攻破!谷歌AI已能精准识别 GPT-4则装瞎求人帮忙
美女博主在家拍擦边视频?穿瑜伽服涨粉百万!真相是...
全球今头条!3DMark加入AMD FSR专项测试:终于追上NVIDIA、Intel
全球报道:广汽埃安AION Y Plus 2023款上市:14万级唯一纯电610KM续航
天天信息:V观财报|科达制造股东广东联塑短线交易致歉
世界消息!Teamcenter_SOA开发:使用查询构建器查询数据
即时:flatMap
热讯:React Native 备忘清单_开发速查表分享
世界信息:5.98万起售还嫌贵?五菱缤果上市即热销:当天交付522台
每日热议!想买车的抓紧 广州新能源汽车也有补贴了:最高1万元
世界微头条丨《原神》开发商新作:米哈游《崩坏:星穹铁道》预约超2000万
环球热推荐:米香四溢:袁隆平品牌隆平农场东北晶米10斤39.9元发车
华硕ROG游戏手机7真机曝光:无挖孔全面屏、后置三摄
天天讯息:华天科技2022年营收119亿元 拟实施先进封测研发及产业化项目
当前焦点!Leetcode Practice --- 栈和队列
我的第一个项目(七):(解决问题)Vue中canvas无法绘制图片
观点:确认引进内地!《小美人鱼》新泄露镜头:爱丽儿深情抚摸王子的脸
全球首个商用海底数据中心在海南下水:算力高、散热不费电
今日关注:不挑路面、转得很稳 仰望U8如何实现原地掉头?官方详解
大学生应聘饭店洗碗工被HR婉拒 HR:第一份工作很重要 这会害了他
不等发布会!vivo X Fold2真机抢先看:素皮+玻璃设计惊艳
现场丨圆桌对话:抓住确定性——楼宇经济的大周期和小趋势
讯息:awk 处理 Git 提交信息生成 Release Note
最长上升子序列 II
视焦点讯!day3 函数的定义和调用,练习编写简单的程序(记录1)
天天热文:内存/SSD白菜价甩卖 美光芯片大减产:工厂停机率创纪录
任泽平:在中国做生意没任何理由抱怨 燃油车正迎来诺基亚时刻
世界新资讯:宏碁推出W系列4K电视:QLED面板、30W扬声器
油价“二连降” 今年来最大降幅!加满一箱油少花13元
【全球热闻】网络时钟同步设备(NTP时间同步服务器)技术设计应用方案
全球实时:记录--你可能忽略的10种JavaScript快乐写法
聚焦:无所畏惧的求和题解
今亮点!商品日报(3月31日):焦炭低位反弹菜油补涨 纸浆、玻璃主力合约跌超2%
保姆级教程!12306官方详解“免费坐高铁”
环球速递!RTX 40系显卡才能“撑得住”!《赛博朋克2077》实现路径光追
夏季必备 圈叉潮品纯棉印花T恤/短裤24.9元起
【新视野】编程神童立志写最棒的程序改变世界 严重偏科只能选职高 妈妈无奈
世界视讯!成龙自豪发声:不是我要去好莱坞 而是好莱坞要我
“19鑫苑01”到期日期将延期一年
Excel批量检查5列数据是否一致(存在不规则空值)
【密码管理器】上海道宁为您提供存储和使用强密码的简单方法工具软件——1Password
【环球报资讯】MQTT协议介绍
世界热资讯!开心档之Go 语言环境安装
DIM中的一些知识点(慢更)
新消息丨每日机构分析:3月31日
全球实时:国家发展改革委:国内汽、柴油价格每吨分别降低335元和320元
焦点简讯:吃日料、听京剧 库克时隔3年再访中国:6年前还去过ofo小黄车总部
全球观焦点:酷派新品发布会定档4月3日:三款新机待发
世界聚焦:2023增长最快的手机品牌!一加Ace 2首销日销量在第三方平台遥遥领先
天天观察:B站弹幕射击《爆裂魔女》5月30日停运 共运营592天
任天堂Switch 2不会远了!开发者已收到新主机开发工具
世界信息:周日阳光可期抓紧洗晒 下周四冷空气再袭降水将达到中雨
每日快讯!卸载SQL Server 2012图文教程
环球报道:你还在手写 join 联表查询?MyBatis-Plus 这样写太香了!
天天新动态:Python 数字类型之 int float
每日观点:收评:两市红盘震荡创指涨0.69% 人工智能板块涨幅居前
世界百事通!比亚迪F品牌再曝谍照 主攻40-60万市场/下半年预售
天天资讯:38岁985文科硕士被迫送外卖!本人再发声:已脱下孔乙己长衫 应聘道士被拒
云南一县城禁止“脏车入城”:有明显污迹、车轮粘泥不许在城区行驶
百元就能畅享8K 流畅清爽无广告!当贝盒子H3视频评测
当前快讯:刘浩存在新片《龙马精神》首映礼上哭了:感谢成龙带自己拍戏
环球今头条!GPT-4被指威胁公共安全!OpenAI遭第三方组织投诉
基于Go/Grpc/kubernetes/Istio开发微服务的最佳实践尝试 - 2/3
【焦点热闻】如何实现根据环境切换不同配置?
数据丢失不用怕,火山引擎 DataLeap 提供排查解决方案
英特尔以强大产品力,迎接生成式AI的广阔机遇
【全球快播报】北京启动存量住房交易“带押过户”模式
热消息:直播间卖卫星 最低200万!罗永浩:真的 把卫星价格打下来
Redmi Note 12 Turbo晒战绩:16GB+1TB开售5分钟超过全行业历史销量之和
每日热闻!这就离谱!A7S3传感器用来拍Vlog 索尼ZV-E1开启预售
vivo X Fold2影像曝光:IMX866主摄、潜望长焦取消
天天实时:一键获取测试脚本,轻松验证“TSBS 时序数据库性能基准测试报告”
天天快看点丨windows系统 批量处理文件名称
Python Django投稿系统代码
环球今头条!日本最早将于2024年度在新东名高速公路部分区间设置自动驾驶车道
环球即时看!小姐姐秒种草!雅迪冠能摩登发布:独创复古女王风
当前速讯:你家乡上榜没?中国省级“癌症地图”出炉:肺癌列第一 “穷癌”下降“富癌”上升
3299元性价比封神!AMD Zen4 104MB缓存锐龙7 7800X3D价格公布