我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java基于NIO如何实现群聊模式

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java基于NIO如何实现群聊模式

这篇文章将为大家详细讲解有关java基于NIO如何实现群聊模式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

具体内容如下

Client

package com.qst.chat;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;public class GroupChatClient { private final int PORT = 9999; private final String HOST = "localhost"; private SocketChannel channel; private static Selector selector; private String name;  public GroupChatClient() throws IOException {  selector = Selector.open();  // 连接服务器  channel = SocketChannel.open(new InetSocketAddress(HOST, PORT));  // 设置非阻塞  channel.configureBlocking(false);  // 将channel 注册到selector  channel.register(selector, SelectionKey.OP_READ);   name = channel.getLocalAddress().toString().substring(1);  System.out.println(name + "is ok ...."); } // 向服务器发送消息 public void sendTO(String msg) {    ByteBuffer buffer = ByteBuffer.wrap((name+":"+msg).getBytes());  try {   channel.write(buffer);  } catch (IOException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } } // 读取从服务器端回复的消息 public static void getInfo() {    try {   if(selector.select() >0) {    Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();        while(iterator.hasNext()) {     SelectionKey key = iterator.next();          if(key.isReadable()) {     // 得到通道     SocketChannel sc =  (SocketChannel) key.channel();          ByteBuffer buffer = ByteBuffer.allocate(1024);          int len;          // 把读到的缓冲区的数据转成字符串     while((len = sc.read(buffer)) > 0) {      System.out.println(new String(buffer.array()));     }          }           }    // 删除当前的selectionKey, 防止重复操作    iterator.remove();       }  } catch (IOException e) {   // TODO Auto-generated catch block   e.printStackTrace();  }   }  public static void main(String[] args) {  try {   GroupChatClient client = new GroupChatClient();         new Thread() {            public void run() {     while(true)     {      try {       Thread.sleep(3000);       GroupChatClient.getInfo();      } catch (InterruptedException e) {       // TODO Auto-generated catch block       e.printStackTrace();      }     }         };   }.start();         Scanner sc = new Scanner(System.in);//   while(true) {//    String name = sc.nextLine();//    client.sendTO(name);//   }   while(sc.hasNextLine()) {      String s = sc.nextLine();              client.sendTO(s);   }     } catch (IOException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } }}

Server端

package com.qst.chat;import java.io.IOException;import java.net.InetAddress;import java.net.InetSocketAddress;import java.net.ServerSocket;import java.net.Socket;import java.nio.ByteBuffer;import java.nio.channels.SelectableChannel;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.time.chrono.IsoChronology;import java.util.Iterator;import com.sun.accessibility.internal.resources.accessibility;import sun.print.resources.serviceui;public class GroupChatServer { private static ServerSocketChannel socketChannel; private static Socket socket; private static Selector selector; private static SocketChannel accept; public GroupChatServer() throws IOException {  socketChannel = ServerSocketChannel.open();  selector = Selector.open();  // 绑定端口  socketChannel.socket().bind(new InetSocketAddress(9999));  // 设置非阻塞模式  socketChannel.configureBlocking(false);  // 将该通道 注册到selector  socketChannel.register(selector, SelectionKey.OP_ACCEPT); } // 监听 public static void listen() {  System.out.println("监听线程: " + Thread.currentThread().getName());  try {   while (selector.select() > 0) {    Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();    if (iterator.hasNext()) {     // 遍历得到selectionKey 集合     SelectionKey next = iterator.next();     if (next.isAcceptable()) {      next.channel();      // socketChannel = (ServerSocketChannel) next.channel();      SocketChannel accept = socketChannel.accept();      accept.configureBlocking(false);      accept.register(selector, SelectionKey.OP_READ);       System.out.println(accept.getRemoteAddress()+" 上线 了。。。");     }     if (next.isReadable()) {      readDate(next);     }     // 移除当前的next,防止重复处理     iterator.remove();     // System.out.println("未发现");    }   }  } catch (IOException e) {   // TODO Auto-generated catch block   e.printStackTrace();  } } // 读取客户端消息 public static void readDate(SelectionKey key) {  try {   accept = (SocketChannel) key.channel();   ByteBuffer buffer = ByteBuffer.allocate(1024);   int len = accept.read(buffer);   if (len > 0) {    buffer.flip();    String msg = new String(buffer.array());    System.out.println("user = " + msg);    // 向其它的客户端转发消息(去掉自己)    sendToAll(msg, accept);    buffer.clear();   }  } catch (IOException e) {   // TODO Auto-generated catch block   try {    String msg = accept.getRemoteAddress().toString();    // 取消注册    key.cancel();    // 关闭通道    accept.close();    System.out.println(msg + "离线了");   } catch (IOException e1) {    // TODO Auto-generated catch block    e1.printStackTrace();   }   // e.printStackTrace();  } finally {   // TODO: handle finally clause  } } public static void sendToAll(String msg, SocketChannel ssc) {  for (SelectionKey ss : selector.keys()) {   // 通过 key 取出对应的 SocketChannel   SelectableChannel channel = ss.channel();   // 排除自己   if (channel instanceof SocketChannel && channel != ssc) {    // 转型    SocketChannel sh = (SocketChannel) channel;    // 转存到buffer    ByteBuffer wrap = ByteBuffer.wrap(msg.getBytes());    try {     // 写入通道     sh.write(wrap);    } catch (IOException e) {     // TODO Auto-generated catch block     e.printStackTrace();    }   }  } } public static void main(String[] args) throws IOException {  GroupChatServer server = new GroupChatServer();  GroupChatServer.listen(); }}

key.isAcceptable()进行接入 操作的时候, 获取通道有两种方式

通过selector获取 (Selector key) socketChannel = (ServerSocketChannel) key.channel();
建立连接 socketChannel .accept();

定义一个全局变量

在进行初始化的时候,存储(socketChannel = ServerSocketChannel.open();)
建立连接 socketChannel .accept();

key.isReadable() 当进行到读入操作的时候( ) SelectionKey key accept = (SocketChannel) key.channel();

演示

服务器启动,客户端启动

java基于NIO如何实现群聊模式

java基于NIO如何实现群聊模式

客户端发送消息

java基于NIO如何实现群聊模式

启动第二个客户端

java基于NIO如何实现群聊模式

java基于NIO如何实现群聊模式

两个客户端相互通信

java基于NIO如何实现群聊模式

java基于NIO如何实现群聊模式

java基于NIO如何实现群聊模式

离线信息显示

java基于NIO如何实现群聊模式

关于“java基于NIO如何实现群聊模式”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java基于NIO如何实现群聊模式

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java基于NIO如何实现群聊模式

这篇文章将为大家详细讲解有关java基于NIO如何实现群聊模式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下Clientpackage com.qst.chat;import java.io.
2023-06-21

Java基于NIO如何实现群聊系统

这篇文章主要为大家展示了“Java基于NIO如何实现群聊系统”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java基于NIO如何实现群聊系统”这篇文章吧。具体内容如下实例要求:1.编写一个 NI
2023-06-21

Java NIO如何实现群聊系统

这期内容当中小编将会给大家带来有关Java NIO如何实现群聊系统,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。实例要求:1)编写一个 NIO 群聊系统,实现服务器端和客户端之间的数据简单通讯(非阻塞)2
2023-06-21

Java基于NIO怎么实现聊天室功能

Java基于NIO怎么实现聊天室功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Sever端package com.qst.one;import java.io.IOExce
2023-06-21

基于Java NIO的即时聊天服务器模型怎么实现

这篇文章主要讲解了“基于Java NIO的即时聊天服务器模型怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“基于Java NIO的即时聊天服务器模型怎么实现”吧!废话不多说,关于NIO
2023-06-17

Java基于TCP如何实现简单聊天程序

本篇内容介绍了“Java基于TCP如何实现简单聊天程序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、如何实现TCP通信要实现TCP通信需
2023-06-29

基于k8s如何部署Session模式Flink集群

这篇文章主要介绍“基于k8s如何部署Session模式Flink集群”,在日常操作中,相信很多人在基于k8s如何部署Session模式Flink集群问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”基于k8s如何
2023-07-05

基于websocket如何实现聊天室对话

这篇文章主要介绍了基于websocket如何实现聊天室对话,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下首先搭建一个node的环境,在app.js中写入以下代码n
2023-06-20

如何进行kubernetes scheduler基于map/reduce模式实现

如何进行kubernetes scheduler基于map/reduce模式实现,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。优选阶段通过分map/reduce
2023-06-19

基于vue3和element-plus的暗黑模式如何实现

这篇文章主要介绍“基于vue3和element-plus的暗黑模式如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于vue3和element-plus的暗黑模式如何实现”文章能帮助大家解决问
2023-07-06

C#如何基于Socket实现多人聊天功能

这篇文章主要介绍C#如何基于Socket实现多人聊天功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体内容如下服务器服务器负责接受所有客户端发来的消息,和将接受到的问题群发到其他用户。代码:using Syste
2023-06-29

如何使用C#基于WebSocket实现聊天室功能

这篇文章将为大家详细讲解有关如何使用C#基于WebSocket实现聊天室功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。ServerHelper:using System;using System.Co
2023-06-29

java如何实现组合模式

小编给大家分享一下java如何实现组合模式,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!介绍组合模式又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素
2023-05-30

java策略模式如何实现

本篇内容介绍了“java策略模式如何实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 刘备要到江东娶老婆了,走之前诸葛亮给赵云(伴郎)三个
2023-06-19

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录