JavaNIO怎么实现聊天室程序

本文小编为大家详细介绍“Java NIO怎么实现聊天室程序”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java NIO怎么实现聊天室程序”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

创新互联基于成都重庆香港及美国等地区分布式IDC机房数据中心构建的电信大带宽,联通大带宽,移动大带宽,多线BGP大带宽租用,是为众多客户提供专业西部信息中心报价,主机托管价格性价比高,为金融证券行业服务器托管,ai人工智能服务器托管提供bgp线路100M独享,G口带宽及机柜租用的专业成都idc公司。

服务端:

package test.javanio;   /**   * @author    * @version    * CreateTime:2010-12-1 下午05:12:11   * Description:   */ import java.io.IOException;  import java.net.InetSocketAddress;  import java.nio.ByteBuffer;  import java.nio.channels.SelectionKey;  import java.nio.channels.Selector;  import java.nio.channels.ServerSocketChannel;  import java.nio.channels.SocketChannel;  import java.util.Date;  import java.util.Iterator;  import java.util.logging.Level;  import java.util.logging.Logger;   public class MySocketServer implements Runnable {       private boolean running;       private Selector selector;      String writeMsg;      StringBuffer sb = new StringBuffer();      SelectionKey ssckey;       public MySocketServer() {           running = true;       }       public void init() {          try {              selector = Selector.open();              ServerSocketChannel ssc = ServerSocketChannel.open();              ssc.configureBlocking(false);              ssc.socket().bind(new InetSocketAddress(2345));              ssckey = ssc.register(selector, SelectionKey.OP_ACCEPT);              System.out.println("server is starting..." + new Date());          } catch (IOException ex) {              Logger.getLogger(MySocketServer.class.getName()).log(Level.SEVERE,                      null, ex);          }      }       public static void main(String[] args) {          MySocketServer server = new MySocketServer();          new Thread(server).start();       }       public void execute() {          try {              while (running) {                  int num = selector.select();                  if (num > 0) {                      Iterator it = selector.selectedKeys()                              .iterator();                      while (it.hasNext()) {                          SelectionKey key = it.next();                          it.remove();                          if (!key.isValid())                              continue;                          if (key.isAcceptable()) {                              System.out.println("isAcceptable");                              getConn(key);                          } else if (key.isReadable()) {                              System.out.println("isReadable");                              readMsg(key);                          }                           else if (key.isValid() && key.isWritable()) {                              if (writeMsg != null) {                                  System.out.println("isWritable");                                  writeMsg(key);                              }                           }                           else                             break;                       }                   }                  Thread.yield();              }           } catch (IOException ex) {              Logger.getLogger(MySocketServer.class.getName()).log(Level.SEVERE,                      null, ex);          }      }       private void getConn(SelectionKey key) throws IOException {          ServerSocketChannel ssc = (ServerSocketChannel) key.channel();          SocketChannel sc = ssc.accept();          sc.configureBlocking(false);          sc.register(selector, SelectionKey.OP_READ);          System.out.println("build connection :"                 + sc.socket().getRemoteSocketAddress());      }       private void readMsg(SelectionKey key) throws IOException {          sb.delete(0, sb.length());          SocketChannel sc = (SocketChannel) key.channel();          System.out.print(sc.socket().getRemoteSocketAddress() + " ");          ByteBuffer buffer = ByteBuffer.allocate(1024);          buffer.clear();          int len = 0;          StringBuffer sb = new StringBuffer();          while ((len = sc.read(buffer)) > 0) {              buffer.flip();              sb.append(new String(buffer.array(), 0, len));          }          if (sb.length() > 0)              System.out.println("get from client:" + sb.toString());          if (sb.toString().trim().toLowerCase().equals("quit")) {              sc.write(ByteBuffer.wrap("BYE".getBytes()));              System.out.println("client is closed "                     + sc.socket().getRemoteSocketAddress());              key.cancel();              sc.close();              sc.socket().close();           } else {              String toMsg = sc.socket().getRemoteSocketAddress() + "said:"                     + sb.toString();              System.out.println(toMsg);               writeMsg = toMsg;               /*               * Iterator it=key.selector().keys().iterator();               *                * while(it.hasNext()){ SelectionKey skey=it.next();               * if(skey!=key&&skey!=ssckey){ SocketChannel client=(SocketChannel)               * skey.channel(); client.write(ByteBuffer.wrap(toMsg.getBytes()));               * }               *                * }               */              /*               *                * key.attach(toMsg);               * key.interestOps(key.interestOps()|SelectionKey.OP_WRITE);               */             Iterator it = key.selector().keys().iterator();               while (it.hasNext()) {                  SelectionKey skey = it.next();                  if (skey != key && skey != ssckey) {                      if (skey.attachment() != null) {                          String str = (String) skey.attachment();                          skey.attach(str + toMsg);                      } else {                          skey.attach(toMsg);                      }                      skey                              .interestOps(skey.interestOps()                                      | SelectionKey.OP_WRITE);                  }               }              selector.wakeup();// 可有可无           }       }       public void run() {          init();          execute();      }       private void writeMsg(SelectionKey key) throws IOException {           System.out.println("++++enter write+++");          SocketChannel sc = (SocketChannel) key.channel();          String str = (String) key.attachment();           sc.write(ByteBuffer.wrap(str.getBytes()));          key.interestOps(SelectionKey.OP_READ);      }  }

客户端:

package test.javanio;   /**   * @author    * @version    * CreateTime:2010-12-1 下午05:12:46   * Description:   */ import java.io.BufferedReader;  import java.io.IOException;  import java.io.InputStreamReader;  import java.net.InetSocketAddress;  import java.nio.ByteBuffer;  import java.nio.channels.Selector;  import java.nio.channels.SocketChannel;  import java.util.logging.Level;  import java.util.logging.Logger;  import java.util.Currency.*;   public class MySocketClient implements Runnable {      Selector selector;       boolean running;       SocketChannel sc;       public MySocketClient() {          running = true;       }       public void init() {          try {              sc = SocketChannel.open();              sc.configureBlocking(false);              sc.connect(new InetSocketAddress("localhost", 2345));           } catch (IOException ex) {              Logger.getLogger(MySocketClient.class.getName()).log(Level.SEVERE,                      null, ex);          }      }       public static void main(String[] args) {           MySocketClient client = new MySocketClient();          new Thread(client).start();      }       public void execute() {           int num = 0;          try {              while (!sc.finishConnect()) {              }          } catch (IOException ex) {              Logger.getLogger(MySocketClient.class.getName()).log(Level.SEVERE,                      null, ex);          }           ReadKeyBoard rkb = new ReadKeyBoard();          new Thread(rkb).start();          while (running) {              try {                   ByteBuffer buffer = ByteBuffer.allocate(1024);                  buffer.clear();                   StringBuffer sb = new StringBuffer();                  Thread.sleep(500);                   while ((num = sc.read(buffer)) > 0) {                      sb.append(new String(buffer.array(), 0, num));                      buffer.clear();                  }                  if (sb.length() > 0)                      System.out.println(sb.toString());                  if (sb.toString().toLowerCase().trim().equals("bye")) {                      System.out.println("closed....");                       sc.close();                      sc.socket().close();                      rkb.close();                      running = false;                  }              } catch (InterruptedException ex) {                  Logger.getLogger(MySocketClient.class.getName()).log(                          Level.SEVERE, null, ex);              } catch (IOException ex) {                  Logger.getLogger(MySocketClient.class.getName()).log(                          Level.SEVERE, null, ex);              }          }       }       public void run() {          init();          execute();      }       class ReadKeyBoard implements Runnable {           boolean running2 = true;           public ReadKeyBoard() {           }           public void close() {              running2 = false;          }           public void run() {              BufferedReader reader = new BufferedReader(new InputStreamReader(                      System.in));              while (running2) {                  try {                      System.out.println("enter some commands:");                      String str = reader.readLine();                      sc.write(ByteBuffer.wrap(str.getBytes()));                   } catch (IOException ex) {                      Logger.getLogger(ReadKeyBoard.class.getName()).log(                              Level.SEVERE, null, ex);                  }              }           }       }  }

读到这里,这篇“Java NIO怎么实现聊天室程序”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注创新互联行业资讯频道。


分享文章:JavaNIO怎么实现聊天室程序
网页路径:http://bzwzjz.com/article/jocgoc.html

其他资讯

Copyright © 2007-2020 广东宝晨空调科技有限公司 All Rights Reserved 粤ICP备2022107769号
友情链接: 营销型网站建设 网站建设 成都网站建设流程 网站建设改版 网站建设方案 网站建设公司 成都网站设计 阿坝网站设计 网站设计制作报价 攀枝花网站设计 成都网站建设 网站建设 成都模版网站建设 成都网站设计 高端网站设计 外贸网站建设 成都商城网站制作 成都网站建设 成都网站建设 网站制作 移动网站建设 成都网站建设