`
落叶留步
  • 浏览: 53305 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

java aio 网络编程 服务端

 
阅读更多

    今天测试了一下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方法都已经执行结束了

 

分享到:
评论

相关推荐

    java网络编程 PPT

    4. **异步网络编程**:介绍Java NIO(非阻塞I/O)和AIO(异步I/O),这两种技术可以显著提高网络应用的性能,特别是在高并发场景下。 5. **网络协议处理**:讲解HTTP、HTTPS、FTP等常用网络协议,以及如何在Java中...

    java网络编程源码

    Java网络编程是Java开发中的重要领域,它涵盖了网络通信的所有基本概念和技术,包括TCP/IP协议栈、套接字(Socket)编程、多线程、数据传输格式等。孙卫琴的《java网络编程》一书深入浅出地讲解了这些核心概念,并...

    网络编程中服务端的优化解析

    本篇文章将深入探讨网络编程中服务端优化的关键点,特别是针对"粘包分包"问题的解决策略。 "粘包分包"现象在网络通信中常常出现,主要发生在基于TCP协议的通信中。TCP协议为了提高传输效率,会将多个小的数据段合并...

    java网络编程高清pdf

    综上所述,Java网络编程技术经历了从BIO到NIO再到AIO的发展过程,每一代技术都在解决特定场景下的性能问题。随着互联网技术的不断发展,高性能网络编程的需求日益增长,Java网络编程技术也在不断创新和发展,以适应...

    java网络编程学习资料

    除此之外,Java NIO(Non-blocking I/O)和AIO(Asynchronous I/O)也是现代Java网络编程的重要组成部分。NIO提供了选择器(Selector)和通道(Channel)的概念,使得程序可以在单个线程中处理多个连接,提高了系统...

    精通Java网络编程(第二版)

    而AIO(Java 7引入的AsynchronousSocketChannel等)进一步简化了异步编程模型,使得服务端可以同时处理多个客户端请求,而无需为每个请求分配单独的线程。 网络编程中还会涉及到网络安全问题,如SSL/TLS加密通信,...

    Java视频教程 Java游戏服务器端开发 Netty NIO AIO Mina视频教程

    二、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网络编程(第3版,2004)].(Java.Network.Programming).Elliotte.Rusty.Harold.文字版

    根据提供的文件信息,我们可以推断出这是一本关于Java网络编程的专业书籍——《Java网络编程》第三版(2004年),作者为Elliotte Rusty Harold。本书旨在为读者提供深入理解Java网络编程的基础知识和技术细节。下面...

    详解Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)

    Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码) Java 网络IO编程是 Java 编程语言中最重要的知识点之一,涉及到网络编程的各种技术和模型。本篇文章主要介绍了 Java 网络IO编程总结,包括 BIO、NIO 和 AIO ...

    smart-socket 开源的Java AIO框架.zip

    这个框架基于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 BIO、NIO、AIO是 Java 中的三种 I/O 模式,每种模式都有其特点和应用场景。下面对每种模式进行详细解释。 Java BIO Java BIO( Blocking I/O)是一种同步阻塞式的 I/O 模式,即服务器实现...

    java高级服务端阅读资料pdf1-5章

    Java作为一门广泛使用的编程语言,尤其在服务端开发领域占据着重要的地位。这份"java高级服务端阅读资料pdf1-5章"涵盖了Java服务端开发的一些核心知识点,旨在提升开发者对于Java技术栈的理解和应用能力。以下是根据...

    Java_Socket开发高并发小型服务器

    Java Socket 开发高并发小型服务器涉及的核心概念是网络编程中的Socket技术,以及如何利用Java语言构建能够处理大量并发连接的服务端。首先,Socket是网络通信中的一个基础概念,它为两台计算机之间的通信提供了接口...

    Java心跳包功能TCP实现

    在Java编程中,心跳包(Heartbeat Packet)是一种在网络通信中维持连接活性的重要机制,尤其在TCP协议下,心跳包可以解决长连接因网络延迟或静默而导致的连接超时问题。TCP是一种面向连接的、可靠的传输层协议,它...

    Java编程中的IO模型详解:BIO,NIO,AIO的区别与实际应用场景分析

    在Java编程中,IO模型是处理输入/输出操作的核心机制,包括了三种主要模型: Blocking I/O(BIO)、Non-blocking I/O(NIO)和Asynchronous I/O(AIO)。理解这三种模型的区别和应用场景对于优化Java程序的性能至关...

    基于JAVA的网络通讯系统设计与实现(含源码 ).rar

    这个项目不仅涵盖了基础的Java网络编程,还可能涉及到更高级的主题,如NIO(非阻塞I/O)和AIO(异步I/O),以及现代网络应用的SSL/TLS安全加密通信。通过对源码的深入学习,开发者可以进一步提升在网络通信领域的...

    RMI网络编程开发之二 如何搭建基于JDK1.5的分布式JAVA RMI 程序

    RMI是Java在分布式计算领域的重要工具,它简化了网络应用的开发,使得开发者可以像操作本地对象一样操作远程对象。 首先,我们需要了解RMI的基本概念。RMI系统由两部分组成:服务器端(Server)和客户端(Client)...

    基于JAVA的网络通讯系统设计与实现(论文+系统).rar

    7. **并发与性能优化**:为了提高服务端处理能力,可能需要使用线程池、非阻塞I/O(NIO)或异步I/O(AIO)等高级特性来优化并发性能。 8. **网络安全**:网络通信涉及到数据安全,包括加密传输(如SSL/TLS)、防止...

    JAVA网络通信系统的研究与开发(设计说明书+源代码+调研报告).zip

    在Java中,Socket类和ServerSocket类是进行网络通信的核心,它们分别代表客户端和服务端。通过创建ServerSocket实例,服务器可以监听特定端口,等待客户端连接。一旦连接建立,通过Socket对象进行双向数据流的读写。...

    tio代码的相关demo运用。(包含服务端和客户端)

    【tio代码的相关demo运用(包含服务端和客户端)】 t-io是一个高性能、异步事件驱动的网络通信框架,主要...无论是服务端的搭建还是客户端的连接,t-io都能以简洁的代码实现复杂的功能,大大简化了网络编程的难度。

Global site tag (gtag.js) - Google Analytics