Java基于NIO实现聊天室功能

 更新时间:2021年11月23日 16:32:14   作者:林夕$相心  
这篇文章主要为大家详细介绍了Java基于NIO实现聊天室功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Java基于NIO实现聊天室功能的具体代码,供大家参考,具体内容如下

Sever端

package com.qst.one;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.channels.Channel;
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.util.Iterator;
import java.util.Set;
import java.nio.ByteBuffer;



public class Server {
 
 private static SocketChannel accept;
 public static void main(String[] args) {
  
  
  System.out.println("----服务端启动---");
  try {
   
   // 获取通道
   ServerSocketChannel channel = ServerSocketChannel.open();
   
   
   // 配置非阻塞模式
   channel.configureBlocking(false);
   // 绑定连接的端口
   channel.bind(new InetSocketAddress(9999));
   
   // 获取选择器
   Selector selector = Selector.open();
   
   // 注册通道到选择器上,开始监听事件
   channel.register(selector, SelectionKey.OP_ACCEPT);
   // 使用选择器进行轮询
   while (selector.select() > 0) {
    
    // 获取到选择器上所有注册的通道中已经就绪好的事件
    Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();

    while (iterator.hasNext()) {
     // 获取事件
     SelectionKey next = iterator.next();
     // 判断事件类型
     if (next.isAcceptable()) {
      // 获取通道
      accept = channel.accept();
      // 获取当前连接分配地址
      SocketAddress address = accept.getLocalAddress();
      System.out.println(address + "上线了");
      // 切换模式
      accept.configureBlocking(false);
      // 将通道注册到选择器上
      accept.register(selector, SelectionKey.OP_READ);
     }

     // 如果为读模式
     else if (next.isReadable()) {
      SocketChannel accept = (SocketChannel) next.channel();

      // 读取事件
      ByteBuffer buffer = ByteBuffer.allocate(1024);

      int len;
      while ((len = accept.read(buffer)) > 0) {
       // 开启读模式
       buffer.flip();
       //      System.out.println((char)len);
       System.out.println(new String(buffer.array(), 0, len));
       // 归位
       buffer.clear();
      }
     }
     iterator.remove();
    }

   } 
  } catch (Exception e) {
   try {
    SocketAddress address = accept.getRemoteAddress();
    System.out.println(address+"离线了");
   } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
   }
   
  }
  
 }

}

Client端

package com.qst.one;


import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.channels.SocketChannel;
import java.util.Scanner;
import java.nio.ByteBuffer;


public class Client {
 
 
 public static void main(String[] args) throws IOException {
  SocketChannel channel = SocketChannel.open(new InetSocketAddress("localhost", 9999));
  
  
  channel.configureBlocking(false);
  
  ByteBuffer buffer = ByteBuffer.allocate(1024);
  Scanner sc = new Scanner(System.in);
  SocketAddress address = channel.getLocalAddress();
  System.out.println(address+"ready~~~");
  
  while(true) {
   System.out.print("tim:");
   String name = sc.nextLine();
   
   buffer.put(("tim :"+name).getBytes());
   buffer.flip();
   channel.write(buffer);
   buffer.clear();
   
  }
  
  
 }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java常用锁synchronized和ReentrantLock的区别

    Java常用锁synchronized和ReentrantLock的区别

    这篇文章主要介绍了Java常用锁synchronized和ReentrantLock的区别,二者的功效都是相同的,但又有很多不同点,下面我们就进入文章了解具体的相关内容吧。需要的小伙伴也可以参考一下
    2022-05-05
  • Java匿名内部类和Lambda(->) 的多种写法总结

    Java匿名内部类和Lambda(->) 的多种写法总结

    这篇文章主要和大家分享一下Java匿名内部类和Lambda(->) 的多种写法,文中的示例代码讲解详细,对我们学习Java有一定帮助,需要的可以先看一下
    2022-07-07
  • SpringBoot Filter修改返回内容,解决请求卡死200的错误

    SpringBoot Filter修改返回内容,解决请求卡死200的错误

    这篇文章主要介绍了SpringBoot Filter修改返回内容,解决请求卡死200的错误问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Java中的MessageDigest类加密详解

    Java中的MessageDigest类加密详解

    这篇文章主要介绍了Java中的MessageDigest类加密详解,MessageDigest 类是一个引擎类,它是为了提供诸如 SHA1 或 MD5 等密码上安全的报文摘要功能而设计的,需要的朋友可以参考下
    2024-01-01
  • jpa EntityManager 复杂查询实例

    jpa EntityManager 复杂查询实例

    这篇文章主要介绍了jpa EntityManager 复杂查询实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 解决@JsonIgnore的使用以及自己踩坑

    解决@JsonIgnore的使用以及自己踩坑

    这篇文章主要介绍了解决@JsonIgnore的使用以及自己踩坑,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Required request body is missing的问题及解决

    Required request body is missing的问题及解决

    这篇文章主要介绍了Required request body is missing的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • SpringBoot中使用Swagger的最全方法详解

    SpringBoot中使用Swagger的最全方法详解

    Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化Restful风格的Web服务,这篇文章主要给大家介绍了关于SpringBoot中使用Swagger的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • Java语法基础之for语句练习

    Java语法基础之for语句练习

    以下是对Java语法基础中的for语句进行了详细介绍,需要的朋友可以过来参考下
    2013-07-07
  • JavaEE Cookie的基本使用细节

    JavaEE Cookie的基本使用细节

    本章我们将学习会话跟踪技术中的Cookie与Session,它在我们整个JavaEE的知识体系中是非常重要的,本节我们先介绍Cookie,废话不多说,直接上正文
    2022-12-12

最新评论