设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 创业者
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

BIO和NIO了解多少呢?一起从实践角度重新理解下吧(5)

发布时间:2019-10-23 18:24 所属栏目:21 来源:追逐仰望星空
导读:(1)第一种解决方案(等待连接时和等待数据时不阻塞) publicclassServer{ publicstaticvoidmain(String[]args)throwsInterruptedException{ ByteBufferbyteBuffer=ByteBuffer.allocate(1024); try{ //Java为非阻塞设

(1)第一种解决方案(等待连接时和等待数据时不阻塞)

  1. public class Server { 
  2.     public static void main(String[] args) throws InterruptedException { 
  3.         ByteBuffer byteBuffer = ByteBuffer.allocate(1024); 
  4.         try { 
  5.             //Java为非阻塞设置的类 
  6.             ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); 
  7.             serverSocketChannel.bind(new InetSocketAddress(8080)); 
  8.             //设置为非阻塞 
  9.             serverSocketChannel.configureBlocking(false); 
  10.             while(true) { 
  11.                 SocketChannel socketChannel = serverSocketChannel.accept(); 
  12.                 if(socketChannel==null) { 
  13.                     //表示没人连接 
  14.                     System.out.println("正在等待客户端请求连接..."); 
  15.                     Thread.sleep(5000); 
  16.                 }else { 
  17.                     System.out.println("当前接收到客户端请求连接..."); 
  18.                 } 
  19.                 if(socketChannel!=null) { 
  20.  //设置为非阻塞 
  21.                     socketChannel.configureBlocking(false); 
  22.                     byteBuffer.flip();//切换模式 写-->读 
  23.                     int effective = socketChannel.read(byteBuffer); 
  24.                     if(effective!=0) { 
  25.                         String content = Charset.forName("utf-8").decode(byteBuffer).toString(); 
  26.                         System.out.println(content); 
  27.                     }else { 
  28.                         System.out.println("当前未收到客户端消息"); 
  29.                     } 
  30.                 } 
  31.             } 
  32.         } catch (IOException e) { 
  33.             // TODO Auto-generated catch block 
  34.             e.printStackTrace(); 
  35.         } 
  36.     } 

运行结果

BIO和NIO了解多少呢?一起从实践角度重新理解下吧

不难看出,在这种解决方案下,虽然在接收客户端消息时不会阻塞,但是又开始重新接收服务器请求,用户根本来不及输入消息,服务器就转向接收别的客户端请求了,换言之,服务器弄丢了当前客户端的请求。

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读