广告
返回顶部
首页 > 资讯 > 精选 >Java NIO怎么实现聊天室功能
  • 269
分享到

Java NIO怎么实现聊天室功能

2023-06-21 19:06:49 269人浏览 薄情痞子
摘要

这篇文章主要介绍了Java NIO怎么实现聊天室功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下代码里面已经包含了必要的注释,这里不详述了。实现了基本

这篇文章主要介绍了Java NIO怎么实现聊天室功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

具体内容如下

代码里面已经包含了必要的注释,这里不详述了。实现了基本的聊天室功能。

常量类:

public class Constant {    public static final int serverPort = 44444;}

服务端:

package server; import java.io.IOException;import java.net.InetSocketAddress;import java.net.SocketAddress;import java.nio.ByteBuffer;import java.nio.channels.ClosedChannelException;import java.nio.channels.SelectionKey;import java.nio.channels.Selector;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.nio.charset.Charset;import java.util.Iterator;import java.util.Set; import constant.Constant; public class SocketServer {    private Charset charset = Charset.forName("UTF-8");    private ServerSocketChannel serverSocketChannel;    private Selector serverSocketSelector;    private SelectionKey serverReGISterKey;    private ByteBuffer buffer = ByteBuffer.allocate(1024);     public static void main(String[] args) throws IOException {        new SocketServer().openServer(new InetSocketAddress(Constant.serverPort));    }     public void openServer(SocketAddress address) throws IOException {        init(address);        handle();    }     private void init(SocketAddress address) throws IOException {        serverSocketSelector = Selector.open();         serverSocketChannel = ServerSocketChannel.open();        serverSocketChannel.configureBlocking(false);        serverRegisterKey = serverSocketChannel.register(serverSocketSelector, SelectionKey.OP_ACCEPT);         serverSocketChannel.socket().bind(address);    }     private void handle() throws IOException {        System.out.println("服务端open");        while (serverSocketSelector.select() > 0) {            Iterator<SelectionKey> iterator = serverSocketSelector.selectedKeys().iterator();             // 为什么这里要用迭代器,而不用增强for循环之类的呢?是因为这里获得一个key之后,要对其进行移除,避免二次处理,造成影响            while (iterator.hasNext()) {                dispatch(iterator.next());                iterator.remove();            }        }    }     private void dispatch(SelectionKey key) throws IOException {        if (key.isAcceptable()) {            accept(key);        } else if (key.isReadable()) {            readMessage(key);        } else if (key.isValid() && key.isWritable()) {            writeMessage(key);        }    }     private void accept(SelectionKey key) throws IOException, ClosedChannelException {        // 主要的是,接收事件是发生在服务器这边的,所以这边的通道要强转为ServerSocketChannel        ServerSocketChannel server = (ServerSocketChannel) key.channel();        SocketChannel client = server.accept();        client.configureBlocking(false);        // 同时再给该通道注册选择器,监听的内容的读取        client.register(serverSocketSelector, SelectionKey.OP_READ);    }     private void readMessage(SelectionKey key) throws IOException {        SocketChannel client = (SocketChannel) key.channel();        client.read(buffer);        // 调整为读取模式        buffer.flip();        String content = charset.decode(buffer).toString();        // 压缩空间,即抛弃已经读取的内容(实际上还在里面,只是处于等待被覆盖状态)        buffer.compact();        // 这里可以根据业务逻辑,设置不设置都可以,但是这里想接受到消息后立马回复一条消息,所以设置下一次感兴趣的(监听)事件为写        key.interestOps(SelectionKey.OP_WRITE);        // 设置系统回复信息        key.attach("系统已经收到你的消息\n");        // 开始广播这个客户端的内容到其他客户端        broadcast(key, content);    }     private void broadcast(SelectionKey self, String content) throws IOException {        Set<SelectionKey> selectedKeys = self.selector().keys();        for (SelectionKey key : selectedKeys) {             // 不能发送给自己,也不要服务器自己本身对这个有反应            if (key != self && key != serverRegisterKey) {                String oldMessage = (String) key.attach(null);                // 如果有旧消息的话,在下一次发送时,连同旧消息一起发送                key.attach(oldMessage != null ? oldMessage + content : content);                key.interestOps(key.interestOps() | SelectionKey.OP_WRITE);            }        }    }     private void writeMessage(SelectionKey key) throws IOException {        SocketChannel client = (SocketChannel) key.channel();        // 获取发给这个客户端的消息,并清空消息        client.write(charset.encode((String) key.attach(null)));        key.interestOps(SelectionKey.OP_READ);    }}

客户端(包含了Socket版本和SocketChannel版本):

package client; import java.io.IOException;import java.net.InetSocketAddress;import java.net.Socket;import java.net.UnknownHostException;import java.nio.ByteBuffer;import java.nio.channels.SocketChannel;import java.nio.charset.Charset;import java.util.Scanner; import constant.Constant; public class SocketClient {     public static void main(String[] args) throws IOException {        nioVersion();        // ioVersion();    }     private static void ioVersion() throws UnknownHostException, IOException {        System.out.println("客户端");        final Socket socket = new Socket();        socket.connect(new InetSocketAddress(Constant.serverPort));         new Thread() {            @Override            public void run() {                Scanner scanner = new Scanner(System.in);                 while (scanner.hasNext()) {                    String line = scanner.nextLine();                    try {                        socket.getOutputStream().write((line + "\n").getBytes("UTF-8"));                    } catch (IOException e) {                        e.printStackTrace();                    }                }                scanner.close();                try {                    socket.close();                } catch (IOException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            };        }.start();         new Thread() {            @Override            public void run() {                try {                    Scanner scanner = new Scanner(socket.getInputStream(), "utf-8");                    while (scanner.hasNext()) {                        String line = scanner.nextLine();                        System.out.println("收到消息:" + line);                    }                    scanner.close();                } catch (IOException e) {                    e.printStackTrace();                }             }        }.start();    }     private static void nioVersion() throws IOException {        Charset charset = Charset.forName("UTF-8");         System.out.println("客户端");        SocketChannel socketChannel = SocketChannel.open();        // 设置为非阻塞模式        socketChannel.configureBlocking(false);        socketChannel.connect(new InetSocketAddress(Constant.serverPort));         while (true) {            if (socketChannel.finishConnect()) {                new Thread() {                    @Override                    public void run() {                        Scanner scanner = new Scanner(System.in);                        while (scanner.hasNext()) {                            String input = scanner.nextLine();                             try {                                socketChannel.write(charset.encode(input));                            } catch (IOException e) {                                e.printStackTrace();                            }                         }                        scanner.close();                    }                }.start();                 new Thread() {                    ByteBuffer dst = ByteBuffer.allocate(1024);                     @Override                    public void run() {                        while (true) {                            try {                                int len = socketChannel.read(dst);                                if (len > 0) {                                    dst.flip();                                    System.out.println("收到消息:" + charset.decode(dst));                                    dst.compact();                                }                            } catch (IOException e) {                                // TODO Auto-generated catch block                                e.printStackTrace();                            }                        }                    }                }.start();                return;            }        }    } }

感谢你能够认真阅读完这篇文章,希望小编分享的“Java NIO怎么实现聊天室功能”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网精选频道,更多相关知识等着你来学习!

--结束END--

本文标题: Java NIO怎么实现聊天室功能

本文链接: https://www.lsjlt.com/news/300397.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Java NIO怎么实现聊天室功能
    这篇文章主要介绍了Java NIO怎么实现聊天室功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下代码里面已经包含了必要的注释,这里不详述了。实现了基本...
    99+
    2023-06-21
  • Java NIO实现聊天室功能
    本文实例为大家分享了Java NIO实现聊天室功能的具体代码,供大家参考,具体内容如下 代码里面已经包含了必要的注释,这里不详述了。实现了基本的聊天室功能。 常量类: publi...
    99+
    2022-11-12
  • Java基于NIO怎么实现聊天室功能
    Java基于NIO怎么实现聊天室功能,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Sever端package com.qst.one;import java...
    99+
    2023-06-21
  • Java基于NIO实现聊天室功能
    本文实例为大家分享了Java基于NIO实现聊天室功能的具体代码,供大家参考,具体内容如下 Sever端 package com.qst.one; import java.io....
    99+
    2022-11-12
  • Java怎么实现NIO聊天室
    这篇文章给大家分享的是有关Java怎么实现NIO聊天室的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。功能介绍功能:群聊+私发+上线提醒+下线提醒+查询在线用户文件Utils需要用maven导入下面两个包 ...
    99+
    2023-06-15
  • Java NIO怎么实现聊天室程序
    本文小编为大家详细介绍“Java NIO怎么实现聊天室程序”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java NIO怎么实现聊天室程序”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。服务端:package&n...
    99+
    2023-06-17
  • Java NIO实现多人聊天室
    本文实例为大家分享了Java NIO实现多人聊天室的具体代码,供大家参考,具体内容如下 1. 服务器端代码 ChatServer类: package nio.test.serve...
    99+
    2022-11-12
  • Java NIO实现聊天功能
    本文实例为大家分享了Java NIO实现聊天功能的具体代码,供大家参考,具体内容如下 server code :  package com.tch.test.nio; imp...
    99+
    2022-11-12
  • Java聊天室之实现聊天室服务端功能
    目录一、题目描述二、解题思路三、代码详解多学一个知识点一、题目描述 题目实现:实现聊天室服务器端功能。运行程序,服务端等待客户端连接,并显示客户端的连接信息。 二、解题思路 创建一个...
    99+
    2022-11-13
    Java实现聊天室 Java 聊天室 Java 服务端
  • Java聊天室之实现聊天室客户端功能
    目录一、题目描述二、解题思路三、代码详解一、题目描述 题目实现:实现聊天室客户端。运行程序,用户登录服务器后,可以从用户列表中选择单个用户进行聊天,也可以选择多个用户进行聊天。 二、...
    99+
    2022-11-13
    Java实现聊天室 Java 聊天室 Java 客户端
  • Java Socket实现聊天室功能
    本文实例为大家分享了Java Socket实现聊天室的具体代码,供大家参考,具体内容如下 1 创建登录判断类UserLogin import java.util.HashSet; i...
    99+
    2022-11-13
  • 怎么使用Java NIO实现多人聊天室
    本篇内容主要讲解“怎么使用Java NIO实现多人聊天室”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么使用Java NIO实现多人聊天室”吧!NIO服务端public&n...
    99+
    2023-06-21
  • Unity实现聊天室功能
    本文实例为大家分享了Unity实现聊天室功能的具体代码,供大家参考,具体内容如下 简单聊天室功能,客户端发送消息后,服务器接收到消息后分发到其它客户端上并显示聊天内容 聊天室服务器 ...
    99+
    2022-11-11
  • Java NIO实战之多人聊天室
    本文实例为大家分享了Java NIO实战之多人聊天室的具体代码,供大家参考,具体内容如下 NIO服务端 public class NioServer { pu...
    99+
    2022-11-12
  • Java实现简单的聊天室功能
    本文实例为大家分享了Java实现简单聊天室功能的具体代码,供大家参考,具体内容如下 一、客户端的创建 1.我们可以用Socket来创建客户端 public class Client...
    99+
    2022-11-13
  • Java怎么用局域网实现聊天室功能
    这篇文章主要介绍了Java怎么用局域网实现聊天室功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java怎么用局域网实现聊天室功能文章都会有所收获,下面我们一起来看看吧。类和接口Server类(服务器端)pa...
    99+
    2023-06-30
  • Java实现NIO聊天室的示例代码(群聊+私聊)
    目录功能介绍文件UtilsFinalValueMessageNioServerNioClient功能介绍 功能:群聊+私发+上线提醒+下线提醒+查询在线用户 文件 U...
    99+
    2022-11-12
  • Java实现局域网聊天室功能(私聊、群聊)
    本文实例为大家分享了Java实现局域网聊天室功能的具体代码,供大家参考,具体内容如下 Server 服务端 import java.io.IOException; import ja...
    99+
    2022-11-13
  • Java聊天室之实现客户端群聊功能
    目录一、题目描述二、解题思路三、代码详解一、题目描述 题目实现:不同的客户端之间需要进行通信,一个客户端与其他的多个客户端进行通信,实现群聊功能。 实现一个客户端与其他多个客户端进行...
    99+
    2022-11-13
    Java实现聊天室 Java 聊天室 Java 客户端群聊
  • JavaScript实现QQ聊天室功能
    本文实例为大家分享了JavaScript实现QQ聊天室的具体代码,供大家参考,具体内容如下 1. 任务要求 1)掌握基本过滤选择器; 2)掌握jQuery对象的click()方法; ...
    99+
    2022-11-13
    js QQ 聊天室
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作