加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

BIO和NIO相识几多呢?一路从实践角度从头领略下吧

发布时间:2019-10-24 02:02:43 所属栏目:建站 来源:追逐仰望星空
导读:01 媒介 这段时刻本身在看一些Java中BIO和NIO之类的对象,看了许多博客,发明各类关于NIO的观念说的口不择言头头是道,可以说长短常的完备,可是整个看下来之后,本身对NIO照旧一孔之见的状态,以是这篇文章不会提到许多的观念,而是站在一个实践的角度,

完成了处事端的计划后,我们来实现一个客户端,起首实例化Socket工具,而且绑定ip为127.0.0.1(本机),端标语为8080,挪用write要领向处事器发送数据。

BIO和NIO相识几多呢?一路从实践角度从头领略下吧

2.5 运行功效

当我们启动处事器,但客户端还没有向处事器提倡毗连时,节制台功效如下:

BIO和NIO相识几多呢?一路从实践角度从头领略下吧

当客户端启动并向处事器发送数据后,节制台功效如下:

BIO和NIO相识几多呢?一路从实践角度从头领略下吧

2.6 结论

从上面的运行功效,起首我们至少可以看到,在处事器启动后,客户端还没有毗连处事器时,处事器因为挪用了accept要领,将一向阻塞,直到有客户端哀求毗连处事器。

03 对客户端成果举办扩展

在上文中,我们实现的客户端的逻辑首要是,成立Socket --> 毗连处事器 --> 发送数据,我们的数据是在毗连处事器之后就当即发送的,此刻我们来对客户端举办一次扩展,当我们毗连处事器后,欠妥即发送数据,而是守候节制台手动输入数据后,再发送给处事端。(处事端代码保持稳固)

3.1 代码

  1. public class Consumer { 
  2.     public static void main(String[] args) { 
  3.         try { 
  4.             Socket socket = new Socket("127.0.0.1",8080); 
  5.             String message = null; 
  6.             Scanner sc = new Scanner(System.in); 
  7.             message = sc.next(); 
  8.             socket.getOutputStream().write(message.getBytes()); 
  9.             socket.close(); 
  10.             sc.close(); 
  11.         } catch (IOException e) { 
  12.             // TODO Auto-generated catch block 
  13.             e.printStackTrace(); 
  14.         } 
  15.     } 

3.2 测试

当处事端启动,客户端还没有哀求毗连处事器时,节制台功效如下:

BIO和NIO相识几多呢?一路从实践角度从头领略下吧

当处事端启动,客户端毗连处事端,但没有发送数据时,节制台功效如下:

BIO和NIO相识几多呢?一路从实践角度从头领略下吧

当处事端启动,客户端毗连处事端,而且发送数据时,节制台功效如下:

BIO和NIO相识几多呢?一路从实践角度从头领略下吧

3.3 结论

从上文的运行功效中我们可以看到,处事器端在启动后,起首必要守候客户端的毗连哀求(第一次阻塞),假如没有客户端毗连,处事端将一向阻塞守候,然后当客户端毗连后,处事器会守候客户端发送数据(第二次阻塞),假如客户端没有发送数据,那么处事端将会一向阻塞守候客户端发送数据。处事端从启动到收到客户端数据的这个进程,将会有两次阻塞的进程。这就是BIO的很是重要的一个特点,BIO会发生两次阻塞,第一次在守候毗连时阻塞,第二次在守候数据时阻塞。

04 BIO

4.1 在单线程前提下BIO的瑕玷

在上文中,我们实现了一个浅显的处事器,这个浅显的处事器是以单线程运行的,着实我们不丢脸出,当我们的处事器吸取到一个毗连后,而且没有吸取到客户端发送的数据时,是会阻塞在read()要领中的,那么此时假如再来一个客户端的哀求,处事端是无法举办相应的。换言之,在不思量多线程的环境下,BIO是无法处理赏罚多个客户端哀求的。

4.2 BIO如那里理赏罚并发

在适才的处事器实现中,我们实现的是单线程版的BIO处事器,不丢脸出,单线程版的BIO并不能处理赏罚多个客户端的哀求,那么怎样能使BIO处理赏罚多个客户端哀求呢。

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读