今天测试了一下AsynchronousServerSocketChannel进行网络编程,发现这个效率确实高。讲一下测试场景,AsynchronousServerSocketChannel监听连接,获取到连接以后,提交给线程池去执行任务。一开始有些地方比较迷惑,比如启动一个5个线程的连接池,当我有10个连接进来,按照每一个连接都会封装成任务的做法,岂不是有五个一开始会等待,直到之前的五个中有任务执行完了,剩余的五个任务才会陆续执行,这样的话,为什么人们都说它效率高呢?
反正我一开始是有这个想法,于是我写了个测试,验证我的想法,发现并不是我想的那样,先看看代码,然后再详细说明一下。
package com.pzn.aio; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.channels.AsynchronousServerSocketChannel; import java.nio.channels.AsynchronousSocketChannel; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; public class AioServer { public static void main(String[] args) throws IOException, InterruptedException, ExecutionException { // ThreadPoolExecutor pool = (ThreadPoolExecutor) Executors.newFixedThreadPool(5); // AsynchronousServerSocketChannel boss = AsynchronousServerSocketChannel.open(); boss.bind(new InetSocketAddress("127.0.0.1", 9000)); while (true) { System.out.println("active thread... " + pool.getActiveCount()); AsynchronousSocketChannel worker = boss.accept().get(); System.out.println("accepted a new connect."); pool.submit(new Task(worker)); } } }
package com.pzn.aio; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.nio.channels.AsynchronousSocketChannel; import java.nio.channels.CompletionHandler; import java.util.concurrent.TimeUnit; public class Task implements Runnable { private final AsynchronousSocketChannel worker; public Task(AsynchronousSocketChannel worker) { this.worker = worker; } public void run() { try { worker.write(ByteBuffer.wrap("i am server.".getBytes("utf-8")), null, new CompletionHandler<Integer, Object>() { public void completed(Integer result, Object attachment) { try { TimeUnit.SECONDS.sleep(5); System.out.println("write completed."); worker.close(); } catch (InterruptedException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void failed(Throwable exc, Object attachment) { System.out.println("write failed."); } }); System.out.println(Thread.currentThread() + " execute Asynchronous task."); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } }
Task这个任务中,调用AsynchronousSocketChannel的write方法使用异步的方式,最后一个参数是回调,当server写数据完成后,会执行回调中的方法,我在回调方法completed中睡眠5秒时为了观察效果,看看线程池是否可以超过5个任务同时连接。
结果表明,是可以的。实际上这个Task的run方法会立即执行完,根本不会去管回调中的睡眠时间,这样就相当于线程池会马上有空闲线程来处理新的连接,当然还是有一点的延迟,但不至于延迟等待5秒。特别要注意的是:执行回掉的方法,这个就不是我们所能干预的了,依赖操作系统的机制来进入回调,回调方法的执行已经和线程池没有关系了,因为所有提交的Task的run方法都已经执行结束了。
相关推荐
4. **异步网络编程**:介绍Java NIO(非阻塞I/O)和AIO(异步I/O),这两种技术可以显著提高网络应用的性能,特别是在高并发场景下。 5. **网络协议处理**:讲解HTTP、HTTPS、FTP等常用网络协议,以及如何在Java中...
Java网络编程是Java开发中的重要领域,它涵盖了网络通信的所有基本概念和技术,包括TCP/IP协议栈、套接字(Socket)编程、多线程、数据传输格式等。孙卫琴的《java网络编程》一书深入浅出地讲解了这些核心概念,并...
本篇文章将深入探讨网络编程中服务端优化的关键点,特别是针对"粘包分包"问题的解决策略。 "粘包分包"现象在网络通信中常常出现,主要发生在基于TCP协议的通信中。TCP协议为了提高传输效率,会将多个小的数据段合并...
综上所述,Java网络编程技术经历了从BIO到NIO再到AIO的发展过程,每一代技术都在解决特定场景下的性能问题。随着互联网技术的不断发展,高性能网络编程的需求日益增长,Java网络编程技术也在不断创新和发展,以适应...
除此之外,Java NIO(Non-blocking I/O)和AIO(Asynchronous I/O)也是现代Java网络编程的重要组成部分。NIO提供了选择器(Selector)和通道(Channel)的概念,使得程序可以在单个线程中处理多个连接,提高了系统...
而AIO(Java 7引入的AsynchronousSocketChannel等)进一步简化了异步编程模型,使得服务端可以同时处理多个客户端请求,而无需为每个请求分配单独的线程。 网络编程中还会涉及到网络安全问题,如SSL/TLS加密通信,...
二、java NIO,AIO编程视频教程 1、java NIO,AIO编程_01.flv 2、java NIO,AIO编程_02.flv 3、java NIO,AIO编程_03.flv 4、java NIO,AIO编程_04.flv 5、java NIO,AIO编程_05.flv 三、Java语言基础教程-Java NIO...
根据提供的文件信息,我们可以推断出这是一本关于Java网络编程的专业书籍——《Java网络编程》第三版(2004年),作者为Elliotte Rusty Harold。本书旨在为读者提供深入理解Java网络编程的基础知识和技术细节。下面...
Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码) Java 网络IO编程是 Java 编程语言中最重要的知识点之一,涉及到网络编程的各种技术和模型。本篇文章主要介绍了 Java 网络IO编程总结,包括 BIO、NIO 和 AIO ...
这个框架基于Java的异步I/O(Asynchronous Input/Output)模型,旨在简化多路复用的网络编程,尤其适用于高并发、低延迟的场景。在Java中,AIO(或NIO.2)是继传统的阻塞I/O(BIO)和非阻塞I/O(NIO)之后的一种新的...
Java BIO NIO AIO Java BIO、NIO、AIO是 Java 中的三种 I/O 模式,每种模式都有其特点和应用场景。下面对每种模式进行详细解释。 Java BIO Java BIO( Blocking I/O)是一种同步阻塞式的 I/O 模式,即服务器实现...
Java作为一门广泛使用的编程语言,尤其在服务端开发领域占据着重要的地位。这份"java高级服务端阅读资料pdf1-5章"涵盖了Java服务端开发的一些核心知识点,旨在提升开发者对于Java技术栈的理解和应用能力。以下是根据...
Java Socket 开发高并发小型服务器涉及的核心概念是网络编程中的Socket技术,以及如何利用Java语言构建能够处理大量并发连接的服务端。首先,Socket是网络通信中的一个基础概念,它为两台计算机之间的通信提供了接口...
在Java编程中,心跳包(Heartbeat Packet)是一种在网络通信中维持连接活性的重要机制,尤其在TCP协议下,心跳包可以解决长连接因网络延迟或静默而导致的连接超时问题。TCP是一种面向连接的、可靠的传输层协议,它...
在Java编程中,IO模型是处理输入/输出操作的核心机制,包括了三种主要模型: Blocking I/O(BIO)、Non-blocking I/O(NIO)和Asynchronous I/O(AIO)。理解这三种模型的区别和应用场景对于优化Java程序的性能至关...
这个项目不仅涵盖了基础的Java网络编程,还可能涉及到更高级的主题,如NIO(非阻塞I/O)和AIO(异步I/O),以及现代网络应用的SSL/TLS安全加密通信。通过对源码的深入学习,开发者可以进一步提升在网络通信领域的...
RMI是Java在分布式计算领域的重要工具,它简化了网络应用的开发,使得开发者可以像操作本地对象一样操作远程对象。 首先,我们需要了解RMI的基本概念。RMI系统由两部分组成:服务器端(Server)和客户端(Client)...
7. **并发与性能优化**:为了提高服务端处理能力,可能需要使用线程池、非阻塞I/O(NIO)或异步I/O(AIO)等高级特性来优化并发性能。 8. **网络安全**:网络通信涉及到数据安全,包括加密传输(如SSL/TLS)、防止...
在Java中,Socket类和ServerSocket类是进行网络通信的核心,它们分别代表客户端和服务端。通过创建ServerSocket实例,服务器可以监听特定端口,等待客户端连接。一旦连接建立,通过Socket对象进行双向数据流的读写。...
【tio代码的相关demo运用(包含服务端和客户端)】 t-io是一个高性能、异步事件驱动的网络通信框架,主要...无论是服务端的搭建还是客户端的连接,t-io都能以简洁的代码实现复杂的功能,大大简化了网络编程的难度。