首页 > 作文

Java基于NIO实现群聊功能

更新时间:2023-04-03 22:31:26 阅读: 评论:0

本文实例为大家分享了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 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图