这篇文章主要为大家详细介绍了Java基于NIO实现聊天室功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了Java基于NIO实现聊天室功能的具体代码,供大家参考,具体内容如下

Sever端

  1. package com.qst.one;
  2. import java.io.IOException;
  3. import java.net.InetSocketAddress;
  4. import java.net.SocketAddress;
  5. import java.nio.channels.Channel;
  6. import java.nio.channels.SelectableChannel;
  7. import java.nio.channels.SelectionKey;
  8. import java.nio.channels.Selector;
  9. import java.nio.channels.ServerSocketChannel;
  10. import java.nio.channels.SocketChannel;
  11. import java.util.Iterator;
  12. import java.util.Set;
  13. import java.nio.ByteBuffer;
  14. public class Server {
  15. private static SocketChannel accept;
  16. public static void main(String[] args) {
  17. System.out.println("----服务端启动---");
  18. try {
  19. // 获取通道
  20. ServerSocketChannel channel = ServerSocketChannel.open();
  21. // 配置非阻塞模式
  22. channel.configureBlocking(false);
  23. // 绑定连接的端口
  24. channel.bind(new InetSocketAddress(9999));
  25. // 获取选择器
  26. Selector selector = Selector.open();
  27. // 注册通道到选择器上,开始监听事件
  28. channel.register(selector, SelectionKey.OP_ACCEPT);
  29. // 使用选择器进行轮询
  30. while (selector.select() > 0) {
  31. // 获取到选择器上所有注册的通道中已经就绪好的事件
  32. Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
  33. while (iterator.hasNext()) {
  34. // 获取事件
  35. SelectionKey next = iterator.next();
  36. // 判断事件类型
  37. if (next.isAcceptable()) {
  38. // 获取通道
  39. accept = channel.accept();
  40. // 获取当前连接分配地址
  41. SocketAddress address = accept.getLocalAddress();
  42. System.out.println(address + "上线了");
  43. // 切换模式
  44. accept.configureBlocking(false);
  45. // 将通道注册到选择器上
  46. accept.register(selector, SelectionKey.OP_READ);
  47. }
  48. // 如果为读模式
  49. else if (next.isReadable()) {
  50. SocketChannel accept = (SocketChannel) next.channel();
  51. // 读取事件
  52. ByteBuffer buffer = ByteBuffer.allocate(1024);
  53. int len;
  54. while ((len = accept.read(buffer)) > 0) {
  55. // 开启读模式
  56. buffer.flip();
  57. // System.out.println((char)len);
  58. System.out.println(new String(buffer.array(), 0, len));
  59. // 归位
  60. buffer.clear();
  61. }
  62. }
  63. iterator.remove();
  64. }
  65. }
  66. } catch (Exception e) {
  67. try {
  68. SocketAddress address = accept.getRemoteAddress();
  69. System.out.println(address+"离线了");
  70. } catch (IOException e1) {
  71. // TODO Auto-generated catch block
  72. e1.printStackTrace();
  73. }
  74. }
  75. }
  76. }

Client端

  1. package com.qst.one;
  2. import java.io.IOException;
  3. import java.net.InetSocketAddress;
  4. import java.net.SocketAddress;
  5. import java.nio.channels.SocketChannel;
  6. import java.util.Scanner;
  7. import java.nio.ByteBuffer;
  8. public class Client {
  9. public static void main(String[] args) throws IOException {
  10. SocketChannel channel = SocketChannel.open(new InetSocketAddress("localhost", 9999));
  11. channel.configureBlocking(false);
  12. ByteBuffer buffer = ByteBuffer.allocate(1024);
  13. Scanner sc = new Scanner(System.in);
  14. SocketAddress address = channel.getLocalAddress();
  15. System.out.println(address+"ready~~~");
  16. while(true) {
  17. System.out.print("tim:");
  18. String name = sc.nextLine();
  19. buffer.put(("tim :"+name).getBytes());
  20. buffer.flip();
  21. channel.write(buffer);
  22. buffer.clear();
  23. }
  24. }
  25. }


以上就是本文的全部内容,希望对大家的学习有所帮助

更多相关文章

  1. 自定义方法通过类名获取对象集合
  2. js 自定义获取指定类名的标签集合
  3. Android自定义实现日历控件
  4. js 实现数组排序 获取最大值,最小值,翻转
  5. java获取文件路径
  6. Go:fmt.Scanln在控制台获取用户输入的值
  7. 如何获取thinkphp的版本号
  8. dblink不稳定造成 cursor: pin s wait on x等待事件
  9. Redis实现分布式锁

随机推荐

  1. C++实现在二维数组中的查找
  2. C#中的Console.Read()方法详解
  3. C/C++函数如何返回多个值?(代码示例)
  4. C ++中Accessor函数的特征
  5. 用C++实现最短路径之Dijkstra算法
  6. c#如何在程序中定义和使用自定义事件
  7. C中的time()函数怎么用?
  8. C语言中%d,%s,%x,%f,%.100的意义
  9. c语言是什么意思
  10. C#中常用的运算符有哪些