java基于NIO如何实现群聊模式
发表于:2025-11-16 作者:千家信息网编辑
千家信息网最后更新 2025年11月16日,这篇文章将为大家详细讲解有关java基于NIO如何实现群聊模式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下Clientpackage com.qst.
千家信息网最后更新 2025年11月16日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 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 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()进行接入 操作的时候, 获取通道有两种方式
1、 通过selector获取 (Selector key) socketChannel = (ServerSocketChannel) key.channel();
建立连接 socketChannel .accept();
2、定义一个全局变量
在进行初始化的时候,存储(socketChannel = ServerSocketChannel.open();)
建立连接 socketChannel .accept();
key.isReadable() 当进行到读入操作的时候( ) SelectionKey key accept = (SocketChannel) key.channel();
演示
服务器启动,客户端启动

客户端发送消息
启动第二个客户端

两个客户端相互通信
离线信息显示
关于"java基于NIO如何实现群聊模式"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
客户
客户端
消息
通道
服务器
服务
模式
时候
篇文章
内容
更多
监听
阻塞
不错
实用
两个
信息
全局
变量
字符
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
优姬许可证服务器关机或未响应
网络安全人才培养 论坛
杭州远境互联网科技招聘信息
西安科技大学数据库原理与应用
1044服务器内存
软件开发者路线图 pdf
当前网络技术对教育的影响
西安网络安全就业班
网络安全的几个
网络安全项目评价
数据库汇总sum语法
如何直接得到数据库表
软件开发拟采取的措施
云南二调数据库
最新绝地求生怎么看服务器
大厂新型科技互联网
3d打样软件开发
hcie网络安全认证
电力电子软件开发
服务器安全狗 瑞星 冲突
怎么修改vs2015数据库
26岁软件开发
东方京海网络安全监测本地管理
软件开发一般学多久6
不太想做软件开发了
宁波金融业网络安全大赛
安卓手动建立数据库连接
网络安全法的形成背景
王思聪随手装了台服务器
市北区定制软件开发公司有哪些