【图灵干货】Java高级教程第十七节:NIO实现群聊

发布时间:2021-11-25 13:30:49

实现步骤

  生成Selector和一个服务端监听通道。

  开始监听和处理建立连接请求。

  处理读数据

  集群数据实现。

  客户测试执行。

  服务端实现

  2.0服务端完整代码。

  下面是服务方面的主要功能。

  1.打开监视端口,方法ChatServer构造方法。

  2.处理链接请求,listener方法建立连接。

  3.通过方法readData读取消息内容。

  4.向当前所有联机的用户转发消息,方法sendData2All。

  packagecom.hgy.chat;

  /**

  *群聊天服务器。

  */

  发布类服务器{

  privateServerSocketChannelserverSocketChannel;

  私人选择器;

  /**

  *对服务端进行初始化。

  */

  公共图片服务器(){

  try{

  //和ServerSocketChannel一起创建选择器。

  selector=Selector.open();

  serverSocketChannel=serverSocketChannel.open();

  serverSocketChannel.configureBlocking(false);

  serverSocketChannel.socket().bind(newInetSocketAddress);

  //在Selector中注册服务端监听通道。

  serverSocketChannel.register(selector,SelectionKey.OP_ACCEPT);

  }catch(Exceptione){

  e.printStackTrace();

  }

  }

  /**

  *监视客户端动作。

  */

  publicvoidlistener(){

  while(true){

  try{

  if(selector.select(1000)==0){

  continue;

  }

  //获取具有事件的所有密钥。

  SetselectionKeys=selector.selectedKeys();

  Iteratoriterator=selectionKeys.iterator();

  while(iterator.hasNext()){

  SelectionKeykey=iterator.next();

  //当前键是否为处理链接类型。

  {if(key.isAcceptable){

  SocketChannelsocketChannel=。

  serverSocketChannel.accept();

  socketChannel.configureBlocking(false);

  socketChannel.register(selector,SelectionKey.OP_READ);

  }

  //当前链接为读取数据类型。

  if(key.isReadable){

  readData(键);

  }

  iterator.remove();

  }

  }catch(IOExceptione){

  e.printStackTrace();

  }

  }

  }

  /**

  *读数据,并向所有用户发送。

  *@paramkey。

  */

  私钥数据(SelectionKeykey){

  try{

  if(key.isReadable){

  SocketChannelchannel=(SocketChannel)key.channel();

  ByteBufferbyteBuffer=ByteBuffer.allocate(1024);

  channel.read(byteBuffer);

  字符串=newstring(byteBuffer.array);

  //写入所有其他客户端。

  sendData2All(s);

  }

  }catch(IOExceptione){

  e.printStackTrace();

  }

  }

  /**

  *向所有用户群发。

  *@parammsg需要发送的的消息。

  */

  privatevoidsendData2All(Stringmsg){

  try{

  //所有当前注册到selector的key都是所有用户。

  设置=selector.keys();

  for(SelectionKeykey:keys){

  //为每个用户获得通道。

  SelectableChannelchannel=key.channel();

  //执行数据发送。

  (channelinstanceofSocketChannel){

  printlnSystem.out.print("::"+msg)

  ByteBufferbyteBuffer=ByteBuffer.wrap(msg.getBytes);

  SocketChannel=(SocketChannel)频道;

  socketChannel.write(byteBuffer);

  }

  }

  }catch(Exceptione){

  e.printStackTrace();

  }

  }

  publicstaticvoidmain(String[]args){

  ChatServerchatServer=newChatServer();

  chatServer.listener();

  }

  }

  2.1构建Selector和一个服务端监听通道。

  创建ChatServer对象后,具体执行以下步骤。

  1.创建一个serverSocketChannel对象。

  2.将处理模式设置为非阻塞模式。

  3.绑定侦听端口。

  4.向selector注册channel。

  发布类服务器{

  privateServerSocketChannelserverSocketChannel;

  私人选择器;

  /**

  *对服务端进行初始化。

  */

  公共图片服务器(){

  try{

  //和ServerSocketChannel一起创建选择器。

  selector=Selector.open();

  serverSocketChannel=serverSocketChannel.open();

  serverSocketChannel.configureBlocking(false);

  serverSocketChannel.socket().bind(newInetSocketAddress)(8。

       图灵学院成立于2017年7月15日,现阶段提供 计算机基础原理、JavaSE核心、Java后端、 面试必备算法、python核心编程、数据分析、web 开发题、人工智能等专题课程,为想学习Python的学员提供优质的培训服务,帮助学员掌握更加全面的技能,是计算机人员职场中提职加薪的首选。
       免费java架构师视频学习地址:免费视频

上一篇 【图灵干货】Java高级教程第十六节:JVM-字符串底层实现原理
下一篇 【图灵干货】java高级教程第十八节:dubbo+zk面试高频问题

文章素材均来源于网络,如有侵权,请联系管理员删除。

标签: Java教程Java基础Java编程技巧面试题Java面试题