查看这篇文章,了解更多关于Java的阻塞和非阻塞替代创建套接字的信息。

套接字使用TCP / IP传输协议,是两台主机之间的最后一块网络通信。 您通常不必处理它们,因为它们之上构建了协议,如HTTP或FTP; 但是,了解它们的工作方式非常重要。

TCP:它是一种可靠的数据传输协议,可确保发送的数据完整且正确,并且需要建立连接。Java提供了一种阻塞和非阻塞替代方法来创建套接字,并且根据您的要求,您可以考虑使用其中一个。

Java IO

Java阻塞IO API包含在Java.net包下的JDK中,通常最简单易用。

此API基于可以读取或写入的字节流和字符流。 没有可用于前后移动的索引,就像在数组中一样,它只是一个连续的数据流。

每次客户端请求连接到服务器时,它都会阻塞一个线程。 因此,如果我们希望有许多同时连接,我们必须创建足够大的线程池。

1. 使用给定端口创建ServerSocket以进行侦听。

2. 当调用accept()并开始监听客户端连接时,服务器将阻塞。

3. 如果客户端请求连接,则accept()返回一个Socket。

4. 现在,我们可以从客户端(InputStream)读取并将数据发送回客户端(OutputStream)。

如果我们想允许多个连接,我们必须创建一个线程池:

如您所见,此API有一些限制。 我们将无法接受比机器中可用线程更多的连接。 因此,如果您希望有许多连接,则需要一个替代方案。

Java NIO

Java.nio是用于套接字连接的非阻塞API,这意味着您对可用线程的数量并不紧密。 使用此库,一个线程可以同时处理多个连接。

Channel::通道是输入和输出流的组合,因此它们允许您进行读写,并且它们使用缓冲区来执行这些操作。

Buffer:它是一块内存,用于从通道读取并写入其中。 当你想从Buffer中读取数据时,需要调用flip(),以便将pos设置为0。

1. 在第1行,pos将等于写入Buffer的字节数。

2. 在第3行,调用flip()将位置设置为0并限制先前写入的字节数。

3. 在第5行,它一次从缓冲区读取一个字节到极限。

4. 最后,在第7行,我们清除缓冲区。

Selector:选择器可以注册多个通道,并检查哪些通道已准备好接受新连接。 与阻塞IO的accept()方法类似,当调用select()时,它将阻塞应用程序,直到Channel准备好进行操作。 由于Selector可以注册多个通道,因此只需要一个线程来处理多个连接。

Selection Key:它包含特定通道的属性(兴趣集,就绪集,选择器/通道和可选的附加对象)。 选择键主要用于了解通道的当前兴趣(isAcceptable(),isReadable(),isWritable()),获取通道并对该通道进行操作。

下面我们将使用Echo Socket Channel服务器来展示NIO的工作原理。

1. 从第1行到第3行,创建了ServerSocketChannel,您必须明确地将其设置为非阻塞模式。 套接字还配置为监听端口8080。

2. 在第5行和第6行,创建一个Selector,并在Selector上注册ServerSocketChannel,其中SelectionKey指向ACCEPT操作。

3. 为了使应用程序始终保持监听,阻塞方法select()位于无限while循环内,select()将在选择至少一个通道时返回,唤醒唤醒()或线程被中断。

4. 然后,在第10行,从选择器返回一组键,我们将遍历它们以执行就绪通道。

1. 每次创建新连接时,isAcceptable()都将为true,并且新的Channel将注册到Selector中。

2. 为了跟踪每个通道的数据,将它放在一个Map中,其中套接字通道作为键和ByteBuffers列表。

3. 然后,选择器将指向READ操作。

1. 在读取块中,将检索通道,并将传入的数据写入ByteBuffer。

2. 在第6行,我们检查连接是否已关闭。

3. 在第9行和第10行,缓冲区设置为flip()读取模式并添加到Map。

4. 然后,调用interestOps()以指向WRITE操作。

1. 再一次,检索通道以便将保存在Map中的数据写入其中。

2. 然后,我们将Selector设置为READ操作。

如果连接关闭,通道将从Map中删除,我们关闭通道。

Java IO Vs. NIO

IO和NIO之间的选择取决于用例。 对于更少的连接和简单的解决方案,IO可能更适合您。 然而,如果你想要能够同时处理数千个连接的更高效的东西,NIO可能是更好的选择,但请记住它会引入很多代码复杂性。 但是,有一些框架,如Netty或Apache MINA,它们构建在NIO之上,并隐藏了编程的复杂性。

如JAVA上遇到什么不懂的,可以私聊我!

JAVA阻塞(IO)和非阻塞(NIO)的更多相关文章

  1. 【死磕NIO】— 阻塞IO,非阻塞IO,IO复用,信号驱动IO,异步IO,这你真的分的清楚吗?

    通过上篇文章([死磕NIO]- 阻塞.非阻塞.同步.异步,傻傻分不清楚),我想你应该能够区分了什么是阻塞.非阻塞.异步.非异步了,这篇文章我们来彻底弄清楚什么是阻塞IO,非阻塞IO,IO复用,信号驱动 ...

  2. 5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO

    POSIX 同步IO.异步IO.阻塞IO.非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的,以致于我在很长一段时间对此感到困惑,所以想写一篇文章整理一下. ...

  3. 阻塞IO和非阻塞IO的区别

    转载地址: http://blog.sina.com.cn/s/blog_a46817ff0101g0gv.html http://blog.csdn.net/nodeathphoenix/artic ...

  4. 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

    同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出 ...

  5. 转 网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

    此文章为转载,如有侵权,请联系本人.转载出处,http://blog.chinaunix.net/uid-28458801-id-4464639.html 同步(synchronous) IO和异步( ...

  6. 简述同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别

    POSIX 同步IO.异步IO.阻塞IO.非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的,以致于我在很长一段时间对此感到困惑,所以想写一篇文章整理一下. ...

  7. 理论铺垫:阻塞IO、非阻塞IO、IO多路复用/事件驱动IO(单线程高并发原理)、异步IO

    完全来自:http://www.cnblogs.com/alex3714/articles/5876749.html 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同 ...

  8. Python_阻塞IO、非阻塞IO、IO多路复用

    0.承上 进程: 计算机里最小的资源分配单位: 数据隔离, 利用多核,数据不安全. 线程: 计算机中最小的CPU调度单位: 数据共享,GIL锁,数据不安全. 协程: 线程的一部分,是有用户来调度的; ...

  9. 同步IO、异步IO、阻塞IO、非阻塞IO之间的联系与区别

    POSIX 同步IO.异步IO.阻塞IO.非阻塞IO,这几个词常见于各种各样的与网络相关的文章之中,往往不同上下文中它们的意思是不一样的,以致于我在很长一段时间对此感到困惑,所以想写一篇文章整理一下. ...

  10. 事件驱动模型 IO多路复用 阻塞IO与非阻塞IO select epool

    一.事件驱动 1.要理解事件驱动和程序,就需要与非事件驱动的程序进行比较.实际上,现代的程序大多是事件驱动的,比如多线程的程序,肯定是事件驱动的.早期则存在许多非事件驱动的程序,这样的程序,在需要等待 ...

随机推荐

  1. ECMAScript es6新功能讲解视频教程

    下载链接:https://www.yinxiangit.com/1.html 目录: 01.课程介绍-ECMAScript 新功能.mp402.块的作用域-let.mp403.恒量-const.mp4 ...

  2. 使用Python SMTP发送邮件

    import smtplibfrom email.mime.text import MIMEText # 服务器SMPTserver = "smtp.163.com"# 发送邮件的 ...

  3. Build a pile of Cubes

    version_1: def find_nb(m): # your code ii = 1 total = 0 while total < m: total = sum(each**3 for ...

  4. 可见性有序性,Happens-before来搞定

    写在前面 上一篇文章并发 Bug 之源有三,请睁大眼睛看清它们 谈到了可见性/原子性/有序性三个问题,这些问题通常违背我们的直觉和思考模式,也就导致了很多并发 Bug 为了解决 CPU,内存,IO 的 ...

  5. Golang error 的突围

    目录 error 的困局 尝试破局 Errors are just values handle not just check errors Only handle errors once 小结 胎死腹 ...

  6. git的几个小技巧

    git的几个小技巧 分享git的几个小技巧,后面会根据使用补充.目前包括git撤销本地修改.git回退到前n个版本.git多用户提交冲突解决.git 命令简化.欢迎大家补充^_* 1.git撤销本地修 ...

  7. Day 25 网络基础2

    ip地址划分 ip地址由32位二进制组成. 什么是二进制?0101 10进制 0-9 10 2进制 0-1 10 二进制1100 ==1X2^3+1X2^2+0X2^1+0X2^0 =12 十进制15 ...

  8. centos C++ ccache llvm编译环境配置

    下载ccache rpm包wget https://centos.pkgs.org/6/epel-x86_64/ccache-3.1.6-2.el6.x86_64.rpm.htmlyum -y ins ...

  9. Vue学习之vue中的计算属性和侦听器

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 完整SpringBoot Cache整合redis缓存(二)

    缓存注解概念 名称 解释 Cache 缓存接口,定义缓存操作.实现有:RedisCache.EhCacheCache.ConcurrentMapCache等 CacheManager 缓存管理器,管理 ...