查看这篇文章,了解更多关于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. spring cloud config使用mysql存储配置文件

    spring cloud config使用mysql存储配置文件 1.结构图 2.pom.xml: <?xml version="1.0" encoding="UT ...

  2. eclipse中离线安装activit插件

    离线安装activiti教程: 1.先下载压缩包和jar包 链接:https://pan.baidu.com/s/1hSToZt_4A262rUxc8KToCw 密码:j5r1 2.将下载好的jars ...

  3. MATLAB之图像与音频信号处理

    原理简介 离散傅立叶.离散余弦和离散小波变换是图像.音频信号常用基础操作,时域信号转换到不同变换域以后,会导致不同程度的能量集中,信息隐藏利用这个原理在变换域选择适当位置系数进行修改,嵌入信息,并确保 ...

  4. KafkaProducer源码分析

    Kafka常用术语 Broker:Kafka的服务端即Kafka实例,Kafka集群由一个或多个Broker组成,主要负责接收和处理客户端的请求 Topic:主题,Kafka承载消息的逻辑容器,每条发 ...

  5. Net基础篇_学习笔记_第十二天_面向对象继承(字符串_字符串的各种方法)

    我们可以讲字符串看做是char类型的一个只读数组.ToCharArray();将字符串转换为char数组new string(char[] chs):能够将char数组转换为字符串 1).Length ...

  6. laravel中利用循环实现隔行换色

    1.首先在你的路由文件定义好访问的路径 2. <!doctype html><html lang="en"><head> <meta ch ...

  7. python语言程序设计部分习题

    第二章 python程序实例解析 程序练习题 2.1   实例1的修改,采用eval(input(<提示内容>))替换现有输入部分,并使输出的温度值为整数. vv 2.2 汇率兑换程序.按 ...

  8. Tomcat9 安装与配置

    一.下载 到http://tomcat.apache.org/下载绿色解压包 二.启动 1.解压后打开tomcat/bin目录下的startup.bat即可启动 打开后发现出现乱码 解决方法: 打开t ...

  9. Day 5文件管理—三剑客的了解

    文件的下载 wget curl 1.文件的上传 rz sz #不支持拷贝文件夹 文件内容进行 排序 sort ,去重uniq, 统计 文件的截取 cut awk sed .... | ######3. ...

  10. 001: html基础标签

    一:浏览器内核(理解) 序言: 1:web标准 主要包括结构(Structure).表现(Presentation)和行为(Behavior)三个方面. 2:常见标签 2.1:HTML head bo ...