千家信息网

java NIO怎么实现简单聊天程序

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章主要为大家展示了"java NIO怎么实现简单聊天程序",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"java NIO怎么实现简单聊天程序"这篇文章
千家信息网最后更新 2026年11月01日java NIO怎么实现简单聊天程序

这篇文章主要为大家展示了"java NIO怎么实现简单聊天程序",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"java NIO怎么实现简单聊天程序"这篇文章吧。

具体内容如下

服务端

功能:

1、接受客户端连接
2、发送消息
3、读取客户端消息

Server.java

public class Server {    private Selector selector;    private ByteBuffer writeBuffer = ByteBuffer.allocate(1024);    private ByteBuffer readBuffer = ByteBuffer.allocate(1024);    Msg msg = new Msg();    MsgSender msgSender = new MsgSender(msg);    public static void main(String[] args) {        Server server = new Server();        new Thread(server.msgSender).start();        server.start();    }    //初始化服务端    public Server() {        try {            this.selector = Selector.open();            ServerSocketChannel ssc = ServerSocketChannel.open();            ssc.configureBlocking(false);            ssc.bind(new InetSocketAddress(8899));            ssc.register(this.selector, SelectionKey.OP_ACCEPT);            System.out.println("服务端初始化完毕。。。。");        } catch (IOException e) {            e.printStackTrace();        }    }    //启动服务端等待selector事件    public void start() {        while (true) {            try {                int num = this.selector.select();                if (num > 0) {                    Iterator it = this.selector.selectedKeys().iterator();                    while (it.hasNext()) {                        SelectionKey key = it.next();                        it.remove();                        if (key.isValid()) {                            if (key.isAcceptable()) {                                this.accept(key);                            }                            if (key.isReadable()) {                                this.read(key);                            }                            if (key.isWritable()) {                                this.write(key);                            }                        }                    }                }            } catch (IOException e) {                e.printStackTrace();            }        }    }    //发送消息    private void write(SelectionKey key) {        SocketChannel sc = (SocketChannel) key.channel();        try {            sc.configureBlocking(false);        } catch (IOException e) {            e.printStackTrace();        }  //判断是否有消息需要发送        if(msg!=null && msg.getFlag()){            System.out.println(msg);            try {                msg.setFlag(false);                writeBuffer.clear();                writeBuffer.put(msg.getContent().getBytes());                writeBuffer.flip();                sc.write(writeBuffer);            } catch (IOException e) {                e.printStackTrace();            }        }    }    //读取客户端消息    private void read(SelectionKey key) {        SocketChannel sc = (SocketChannel) key.channel();        try {            sc.configureBlocking(false);            readBuffer.clear();            int read = sc.read(readBuffer);            if (read == -1) {                sc.close();                key.cancel();            }            readBuffer.flip();            System.out.println(new String(readBuffer.array()));        } catch (IOException e) {            e.printStackTrace();        }    }    //接受客户端连接    private void accept(SelectionKey key) {        ServerSocketChannel ssc = (ServerSocketChannel) key.channel();        try {            SocketChannel sc = ssc.accept();            System.out.println(String.format("a new client join!!!host:%s;port:%d", sc.socket().getLocalAddress(), sc.socket().getPort()));            sc.configureBlocking(false);            sc.register(this.selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);        } catch (IOException e) {            e.printStackTrace();        }    }}

Msg.java

class Msg {    private Boolean flag=false;    private String content;    public Boolean getFlag() {        return flag;    }    public void setFlag(Boolean flag) {        this.flag = flag;    }    public String getContent() {        return content;    }    public void setContent(String content) {        this.content = content;    }    @Override    public String toString() {        return "Msg{" +                "flag=" + flag +                ", content='" + content + '\'' +                '}';    }}

MsgSender.java

class MsgSender implements Runnable{    private Msg msg;    public MsgSender(Msg msg) {        this.msg = msg;    }    @Override    public void run() {        while (true) {            System.out.println("input:\n");            Scanner scanner = new Scanner(System.in);            this.msg.setContent(scanner.next());            this.msg.setFlag(true);        }    }}

客户端

采用的时BIO,简单的使用线程实现消息的读写

功能:

1、连接服务端
2、读取消息
3、发送消息

public class Client {    private SocketChannel sc;    ByteBuffer writeBuffer = ByteBuffer.allocate(1024);    ByteBuffer readBuffer = ByteBuffer.allocate(1024);    public static void main(String[] args) {        new Client();    }    public Client() {        try {            sc = SocketChannel.open();            //连接服务端            sc.connect(new InetSocketAddress(8899));            //发送消息            this.write(sc);            //读取消息            this.read(sc);        } catch (IOException e) {            e.printStackTrace();        }    }    private void read(SocketChannel sc) {        new Thread(new Runnable() {            @Override            public void run() {                while (true) {                    try {                        readBuffer.clear();                        int read = sc.read(readBuffer);                        readBuffer.flip();                        System.out.println(new String(readBuffer.array()));                    } catch (IOException e) {                        e.printStackTrace();                    }                }            }        }).start();    }    private void write(SocketChannel sc) {        new Thread(new Runnable() {            @Override            public void run() {                while (true) {                    Scanner scanner = new Scanner(System.in);                    String next = scanner.next();                    writeBuffer.clear();                    writeBuffer.put(next.getBytes());                    writeBuffer.flip();                    try {                        sc.write(writeBuffer);                    } catch (IOException e) {                        e.printStackTrace();                    }                }            }        }).start();    }}

以上是"java NIO怎么实现简单聊天程序"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

消息 服务 客户 客户端 内容 程序 篇文章 功能 学习 帮助 事件 易懂 更多 条理 知识 线程 编带 行业 资讯 资讯频道 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 南京欣网互联网络科技有限公司 广州万易互联网科技有限公司 云之行互联网科技 厦门中拓互联网络科技有限公司 新华互联网科技学院 以房互联网科技 紫鲸互联网科技 深圳天众互联网科技公司 深圳卡尔迅互联网科技有限公司怎么样 深圳前海聚择互联网科技有限公司 互联网科技博主是什么意思 随着互联网科技发展 北京华百购互联网科技有限公司 阿里互联网科技公司 宁夏众和广鑫互联网科技有限公司 互联网科技革命什么开始 易企秀互联网科技是做什么的 互联网科技收购价值 互联网科技品牌 互联网高科技绘画 互联网未来科技 凡科互联网科技 四个字互联网科技公司取名 四川慕妮娅互联网科技有限公司 南通创西澳互联网科技有限公司 银行科技岗属于互联网吗 互联网科技收购价值 深圳互联网科技园地址 广东猫王互联网科技有限公司电话 互联网高科技绘画
0