本文实例为大家分享了java基于nio实现群聊功能的具体代码,供大家参考,具体内容如下
package com.dashu.netty.group_chat;import java.net.inetsocketaddress;import java.nio.bytebuffer;import java.nio.channels.*;import java.nio.chart.standardcharts;import java.util.iterator;public class groupchatrver { /** * 初始化选择器 */ private lector lector; /** * 初始化服务器网络通道 */ private rversocketchannel rversocketchannel; /** * 端口 */ private static final int port = 6666; /** * 构造方法 */ public groupchatrver() { try { //获取选择关于咏雪的诗句器 lector = lector.open(); //获取服务器网络通道 rversocketchannel = rversocketchannel.open(); //网络地址 inetsocketaddress inetsocketaddress = new inetsocketaddress(port); //服务器网络通道绑定网络地址 rversocketchannel.socket().bind(inetsocketaddress); //设置服务器网络通道非阻塞 rversocketchannel.configureblocking(fal); //将服务器网络通道注册到选择器上,绑定连接请求事件 rversocketchannel.register(lector, lectionkey.op_accept); } catch (exception e) { e.printstacktrace(); } } /** * 监听客户端请求事件 */ public void listen() { try { //无限循环 while (true) { //获取递进是什么意思请求数 int count = lector.lect(); //count大于0,则代表有请求进来 if (count > 0) { //获取请求集 iterator<lectionkey> lectionkeyiterator = lector.lectedkeys().iterator(); //遍历请求集 while (lectionkeyiterator.hasnext()) { //得到请求 lectionkey lectionkey = lectionkeyiterator.next(); //连接请求 if (lectionkey.isacceptable()) { //获取客户端网络通道 socketchannel socketchannel = rversocketchannel.accept(); //设置客户端网络通道非阻塞 socketchannel.configureblocking(fal); //将客户端网络通道注册到选择器上 socketchannel.register(lector, lectionkey.op_read); system.out.println(socketchannel.getremoteaddress() + "上线了"); } //信息读取请求 if (lectionkey.isreadable()) { //客户端信息读取 readdata(lectionkey); } //移除请求 lectionkeyiterator.remove(); } } el { system.out.println("等待..."); } } } catch (exception e) { e.printstacktrace(); } } /** * 客户端信息读取 * * @param lectionkey */ private void readdata(lectionkey lectionkey) { //初始化客户端网络通道 socketchannel socketchannel = null; try { //获取客户端网络通道 socketchannel = (socketchannel) lectionkey.channel(); //创建缓冲区 bytebuffer bytebuffer = bytebuffer.allocate(1024); //读取客户端网络通道中的数据到缓冲区 int count = socketchannel.read(bytebuffer); //判断缓冲区中是否有数据 if (count > 0) { //将缓冲区的数据转换位字符串 string message = new string(bytebuffer.array()); system.out.println(message.trim()); //将信息群发到其他客户端 ndinfotootclients(message, socketchannel); } } catch (exception e) { e.printstacktrace(); } } /** * 将信息群发到其他客户端 * * @param message * @param socketchannel */ private void ndi卜组词nfotootclients(string message, socketchannel socketchannel) { //获取所有注册到选择器的客户端,并遍历 for (lectionkey lectionkey : lector.keys()) { //获取通道 channel channel = lectionkey.channel(); //判断通道是否属于socketchannel,同时不等于发送信息的客户端 if (channel instanceof socketchannel && channel != socketchannel) { //通道转换 socketchannel sc = (socketchannel) channel; //将信息写入缓冲区 bytebuffer bytebuffer = bytebuffer.wrap(message.getbytes(standardcharts.utf_8)); try { //将缓冲区的数据写入通道 sc.write(bytebuffer); } catch (exception e) { e.printstacktrace(); } } } } public static void main(string[] args) { groupchatrver groupchatrver = new groupchatrver(); system.out.println("服务器启动,开始监听客户端请求..."); groupchatrver.listen(); }}
package com.dashu.netty.group_chat;import java.net.inetsocketaddress;import java.nio.bytebuffer;import java.nio.channels.lectionkey;import java.nio.channels.lector;import java.nio.channels.socketchannel;import java.nio.chart.standardcharts;import java.util.iterator;import java.util.scanner;public class groupchatclient { /** * 网络连接地址 */ private final string host = "127.0.0.1"; /** * 端口 */ private final int port = 6666; /** * 初始化选择器 */ private lector lector; /** * 初始化网络通道 */ private socke分类别tchannel socketchannel; /** * 用户名 */ private string urname; public groupchatclient() { try { //获取选择器 lector = lector.open(); //获取服务器网络地址 inetsocketaddress 鲍鱼的简单做法inetsocketaddress = new inetsocketaddress(host, port); //获取网络通道 socketchannel = socketchannel.open(inetsocketaddress); //设置网络通道非阻塞 socketchannel.configureblocking(fal); //将网络通道注册到选择器 socketchannel.register(lector, lectionkey.op_read); //获取用户名 system.out.println("请输入用户名:"); scanner scanner = new scanner(system.in); urname = scanner.nextline(); system.out.println(urname + " 进入群聊..."); } catch (exception e) { e.printstacktrace(); } } /** * 向服务器发送信息 * * @param message */ public void ndinfo(string message) { message = urname + ":" + message; try { //向通道写入数据 socketchannel.write(bytebuffer.wrap(message.getbytes(standardcharts.utf_8))); } catch (exception e) { e.printstacktrace(); } } /** * 读取服务器发来的信息 */ public void readinfo() { try { //获取请求数 int count = lector.lect(); if (count > 0) { //获取请求集 iterator<lectionkey> lectionkeyiterator = lector.lectedkeys().iterator(); //遍历请求集 while (lectionkeyiterator.hasnext()) { //获取请求 lectionkey lectionkey = lectionkeyiterator.next(); //判断位读请求 if (lectionkey.isreadable()) { //获取通道 socketchannel sc = (socketchannel) lectionkey.channel(); //创建缓冲区 bytebuffer bytebuffer = bytebuffer.allocate(1024); //读取通道的数据到缓冲区 sc.read(bytebuffer); //缓冲区数据转字符串 string message = new string(bytebuffer.array()); //输出 system.out.println(message.trim()); } //移除已完成请求 lectionkeyiterator.remove(); } } } catch (exception e) { e.printstacktrace(); } } public static void main(string[] args) { groupchatclient groupchatclient = new groupchatclient(); /** * 开启一个线程,每3秒读取一次服务器发来的信息 */ new thread() { @override public void run() { while (true) { groupchatclient.readinfo(); try { thread.sleep(3000); } catch (exception e) { e.printstacktrace(); } } } }.start(); //信息输入 scanner scanner = new scanner(system.in); system.out.println("请输入信息:"); while (scanner.hasnextline()) { string s = scanner.nextline(); //信息发送 groupchatclient.ndinfo(s); system.out.println("请输入信息:"); } }}
1、服务器
2、客户端01
3、客户端02
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持www.887551.com。
本文发布于:2023-04-03 22:31:24,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/6da3faf02de82ba8ea6cef6c11aea8b0.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:Java基于NIO实现群聊功能.doc
本文 PDF 下载地址:Java基于NIO实现群聊功能.pdf
留言与评论(共有 0 条评论) |