网站首页 > 精选教程 正文
socket编程的阻塞模式效率低下,但却是Java中典型socket编程的精髓。但是,还有其他技术。例如采用异步套接字通道,通过套接字建立通信,这可以大大降低效率。
插座
在典型的套接字编程情况下,即使用 TCP 和 UDP 套接字的情况下,I/O 操作以阻塞和同步模式工作。这意味着当客户端套接字的线程调用读取操作时,它会阻塞服务器,直到数据可用。如果底层缓冲区已满,这也可能会阻止写入。这使得其他客户端套接字线程停止,直到通道被释放。这种类型的通道阻塞显然是低效的。为了克服这种情况。相反,可以做的是等到线程完成其工作。客户端套接字可以在服务器提供数据后立即通知;同时,其他线程可以做其他事情,直到来自服务器的数据到达。如果服务器有多个打开的套接字,另一种方法是创建单独的线程进行通信。无论哪种情况,这都是一种解决方法,而不是适当的解决方案。然而,正如我们将看到的,Java 通过 SocketChannel 为这个问题提供了一个解决方案。
套接字通道
另一方面,套接字通道是与服务器套接字建立通信的非阻塞方式。在这里,我们可以让一个线程同时与多个打开的连接进行通信。这是通过向 Selector 添加一堆 SocketChannel 来实现的。选择器对象位于客户端和服务器之间。客户端套接字线程通过循环选择器的 select 方法来获取套接字通道。它可以通知套接字通道的状态是否已被接受、接收数据或关闭。这种技术可以在单个线程中与多个客户端进行通信,而无需维护多个线程和同步的开销。你可以在图 1 中看到这一点。
异步套接字通道
支持异步套接字通道的类实际上是 Java NIO API 库的一部分。思路是通过sockets实现非阻塞异步IO通信。异步 IO 利用回调代码在 IO 完成时执行,非阻塞的思想是指立即返回的 IO 操作,可以有数据,也可以没有数据,或者错误代码。这意味着,在从非阻塞通道读取时,返回值或阻塞通道没有延迟,直到返回有形的东西。有两个与异步套接字操作相关的关键类。它们是 AsynchronousServerSocketChannel 和 AsynchronousSocketChannel;两者都可以在名为 java.nio.channels 的包中找到。
AsynchronousServerSocketChannel 类的对象指定侦听传入客户端连接请求的套接字服务器。只有在接受请求后才能开始交互。名为 AsynchronousSocketChannel 的类负责客户端和服务器两端的所有建立交互。
普通的,也就是同步套接字连接和异步套接字连接之间的主要区别在于,在后一种情况下,请求者会在每个操作完成后立即得到通知。同步套接字连接不是这种情况,因为在这种情况下,它会阻塞通道,直到请求完成。
由于套接字通道的异步特性,有一个处理程序负责处理套接字操作的成功或失败状态。
- 上一篇: Java面试常见问题:阻塞与非阻塞,同步与异步
- 下一篇: java异步编程产生的原因
猜你喜欢
- 2024-11-27 多线程技术(同步异步,并发并行)守护线程(java垃圾回收机制)
- 2024-11-27 Java 爬虫遇上数据异步加载,试试这两种办法
- 2024-11-27 Java 17 多线程的同步和异步synchronized关键字
- 2024-11-27 java异步编程产生的原因
- 2024-11-27 Java面试常见问题:阻塞与非阻塞,同步与异步
- 2024-11-27 parseq-让java异步并发编程更简单
- 2024-11-27 Java异步记录日志-2022新项目
- 2024-11-27 Java异步编程实战:基于JDK中的Future实现异步编程
- 2024-11-27 Java8异步编程就是拽的不行
- 2024-11-27 Java异步任务优化CompletionService
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)