`

java 高性能网络编程 NIO

    博客分类:
  • java
 
阅读更多

 服务器端:

 

 

 // 1. 分配一个 ServerSocketChannel 文件描述符
            serverChannel = ServerSocketChannel.open();

            // 2. 从 ServerSocketChannel里获取一个对于的 socket
            serverSocket = serverChannel.socket();

            // 3. 生成一个 Selector
            selector = Selector.open();

            // 4. 把 socket 绑定到端口上
            serverSocket.bind(new InetSocketAddress(iport));

            // 5. serverChannel 未非bolck
            serverChannel.configureBlocking(false);

            // 6. 通过Selector注册ServerSocketChannel: 只能注册 accept
            // 而SocketChannel可以注册CONNENCT,READ,WRITE ; register -> validOps
            // 在各个子类实现不同
            serverChannel.register(selector, SelectionKey.OP_ACCEPT);
            while (true) {
			try {
				// 获得IO准备就绪的channel数量
				int n = selector.select();

				// 没有channel准备就绪,继续执行
				if (n == 0) {
					continue;
				}

				// 用一个iterator返回Selector的selectedkeys
				Iterator it = selector.selectedKeys().iterator();

				// 处理每一个SelectionKey
				while (it.hasNext()) {
					SelectionKey key = (SelectionKey) it.next();

					// 判断是否有新的连接到达
					if (key.isAcceptable()) {
						
						// 返回SelectionKey的ServerSocketChannel
						ServerSocketChannel server = (ServerSocketChannel) key
								.channel();
						System.out.println("有连接");
						SocketChannel channel = server.accept();
						
						registerChannel(selector, channel, SelectionKey.OP_READ);
						
						doWork(channel);
					}

					// 判断是否有数据在此channel里需要读取
					if (key.isReadable()) {
						processData(key);
					}
				}

				// 删除 selectedkeys
				it.remove();

			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

 

 

 

 客户端:

 

 

  //打开socket通道
		SocketChannel socketChannel = SocketChannel.open();
		//设置非阻塞方式
		socketChannel.configureBlocking(false);
		//打开选择器
		Selector selector = Selector.open();
		//注册连接到服务器socket动作
		socketChannel.register(selector, SelectionKey.OP_CONNECT);
		//连接
		socketChannel.connect( new InetSocketAddress("localhost",9988));
		
		Set<SelectionKey> selectkeySets;
		SelectionKey selectionKey;
		Iterator<SelectionKey> iterator;
		
		//与服务器通信通道
		SocketChannel clientChannel ;

	       while(true){
			//选择一组建,其相应的通道已为I/O操作准备就绪
			//此方法执行处于阻塞模式的选择操作
			selector.select(TIME_OUT);
			
			//返回此选择器的已选择键集。
			selectkeySets = selector.selectedKeys();
			iterator = selectkeySets.iterator();
			
			
			while(iterator.hasNext()){
				selectionKey = iterator.next();
				
				if (selectionKey.isConnectable()) {
                                  clientChannel = (SocketChannel)selectionKey.channel();
					// 判断此通道上是否正在进行连接操作。  
                                  // 完成套接字通道的连接过程。  
					if (clientChannel.isConnectionPending()) {//判断此通道上是否正在进行连接操作
						clientChannel.finishConnect();  //完成套接字通道的连接过程
                                   
                                  }
                                  clientChannel.register(selector, SelectionKey.OP_WRITE);
                            }else if (selectionKey.isReadable()) {
					clientChannel = (SocketChannel)selectionKey.channel();
					//将缓冲区清空
					receiveBuffer.clear();
					//读取服务器发送来的数据库到缓冲区
					count = clientChannel.read(receiveBuffer);//count 读取到的字节数
					if (count > 0) {
						clientChannel.register(selector, SelectionKey.OP_WRITE);
					}
                            }else if (selectionKey.isWritable()) {
					sendBuffer.clear();
					clientChannel = (SocketChannel)selectionKey.channel();
					clientChannel.write(sendBuffer);
					System.out.println("客户端向服务器发送数据:"+sendText);
					clientChannel.register(selector, SelectionKey.OP_READ);
                            }
                     }
                 }

 

分享到:
评论

相关推荐

    高性能网络编程必备技能之IO与NIO阻塞分析

    在IT行业中,网络编程是构建分布式系统和网络应用的基础,而高效的网络编程则直接关系到系统的性能...在实际项目中,结合多线程、线程池和适当的并发控制策略,可以更好地发挥IO和NIO的优势,构建出高性能的网络服务。

    一站式学习Java网络编程 全面理解BIO:NIO:AIO1

    全面理解 Java 网络编程 - BIO、NIO、AIO 本课程旨在帮助学生全面理解 Java 网络编程中的 BIO、NIO、AIO 三剑客,掌握 RPC 编程的基础知识,并结合实战项目巩固所学。 一、网络编程三剑客 - BIO、NIO、AIO BIO...

    Java网络编程 NIO Netty

    Netty是一个高性能、异步事件驱动的网络应用框架,专为Java设计,用于快速开发可维护的高性能协议服务器和客户端。Netty吸收了NIO的优点,并且提供了一套更加高级和灵活的API,使得开发者能够更容易地编写网络应用。...

    java网络编程NIO视频教程

    ### Java网络编程NIO视频教程知识点汇总 #### 1. Java NIO-课程简介 - **主要内容**:简述Java NIO(New IO)的概念及其与传统IO的区别。 - **学习目标**:理解NIO的基本原理及应用场景。 #### 2. Java NIO-概述 -...

    Java在高并发网络编程中的应用

    NIO提供了一种高效处理IO的方式,而Mina和Netty又在此基础上提供了更加简洁和高效的网络编程模型,使得开发者能够轻松地构建出高性能的网络应用。随着网络应用的持续发展,这些技术的应用范围会越来越广泛,对于Java...

    Java网络编程第三版.pdf

    此外,非阻塞I/O(NIO)的引入为高性能网络应用提供了可能,如Selector和Channel的概念。 3. **多线程与并发**:在网络编程中,多线程和并发处理是必不可少的,书中会讲解如何在Java中管理线程,以及如何处理并发...

    java nio 网络编程指南

    ### Java NIO网络编程核心知识点解析 #### 非阻塞式Socket通信:Java NIO的革命性突破 从JDK 1.4版本开始,Java引入了NIO(Non-blocking I/O)API,这标志着Java网络编程的一个重大转折点。传统上,基于阻塞I/O的...

    java网络编程第四版pdf

    理解并掌握这些内容对于编写高性能的网络服务至关重要。 除了以上章节,书中还涵盖了套接字编程、服务器Socket、网络套接字API、URL和URLConnection类,以及高级主题如NIO(非阻塞I/O)和异步I/O。这些内容详细阐述...

    Java网络编程(第4版)PDF

    《Java网络编程(第4版)》是一本深入探讨Java平台上的网络编程技术的专业书籍,适合想要提升Java通讯技术的学者阅读。此书全面覆盖了Java网络编程的基础和高级概念,帮助开发者理解如何利用Java语言构建高效、可靠的...

    java网络高级编程

    最后,网络性能优化是不可忽视的部分,如使用NIO(非阻塞I/O)替代传统的BIO(阻塞I/O),可以显著提升高并发场景下的性能。Java NIO通过Selector和Channel提供了一种高效的方式处理多个连接。 总的来说,Java网络...

    Java IO, NIO and NIO.2

    Java IO、NIO以及NIO.2是Java...Java NIO则适合于需要高吞吐量的应用,以及对I/O事件响应式编程的场合;NIO.2则适合需要更强大的文件系统操作能力和异步I/O的应用。开发人员应根据应用需求选择最合适的I/O模型来实现。

    Java NIO 高性能编程

    Java NIO 深入探讨了 1.4 版的 I/O 新特性,并告诉您如何使用这些特性来极大地提升您所写的Java 代码的执行效率。这本小册子就程序员所面临的有代表性的 I/O 问题作了详尽阐述,并讲解了如何才能充分利用新的 I/O ...

    实现java网络与nio例子

    Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 ...这个"网络与nio"的压缩包文件很可能包含了服务器端和客户端的完整代码示例,可以帮助我们深入理解并实践Java NIO在网络编程中的应用。

    Java网络编程期末考试复习题库+答案

    7. **NIO (Non-blocking I/O)**: NIO是Java 1.4引入的新特性,提供了选择器(Selector)、通道(Channel)和缓冲区(Buffer)等概念,提高了高并发场景下的性能。 8. **Java网络类库**: 如InetAddress用于处理IP...

    java网络高级编程PDF电子书

    此外,Java网络高级编程还包括了NIO(非阻塞I/O)和NIO.2(New I/O API)。NIO允许程序以非阻塞方式处理多个输入/输出流,极大地提高了服务器端的并发性能。NIO.2在Java 7中引入,进一步完善了异步I/O的功能,如文件...

    java网络编程

    - **NIO(非阻塞I/O)**:Java的NIO库提供了更高效的网络编程模型,适用于高并发场景。 - **异步I/O(AIO)**:Java NIO.2引入了异步I/O,允许非阻塞读写操作。 通过阅读《Java网络编程》第三版,开发者可以系统...

    Java NIO英文高清原版

    Netty是一个基于NIO的高性能、异步事件驱动的网络应用框架,它简化了网络编程,广泛应用于服务器端应用开发。 NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。以下是对这些核心概念的...

Global site tag (gtag.js) - Google Analytics