`
chenliang1234576
  • 浏览: 196185 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JAVA非阻塞网络通信NIO关键代码

    博客分类:
  • Java
阅读更多
	//--------------------------------------------------------------
	// 输入输入对象
	private ByteBuffer r_buff =  ByteBuffer.allocate(1024);
	private ByteBuffer w_buff =  ByteBuffer.allocate(1024);
	
	public   byte[]  networkForServer(byte[] toServerData) throws IOException{
		
	    byte[] result = new  byte[]{}; 
	    SocketChannel channel = SocketChannel.open();
        channel.configureBlocking(false);    
        InetSocketAddress s = new InetSocketAddress("125.46.49.88",9000);
        channel.connect(s);
        
        Selector selector = Selector.open();
        channel.register(selector, SelectionKey.OP_CONNECT|SelectionKey.OP_READ|SelectionKey.OP_WRITE);
        
    //    Charset charset=Charset.forName("GBK");
          
        boolean isFinished = false;
        int exec = 0;  // 执行此时
        while(!isFinished){
            int n = selector.select();
            if(n==0){
            	continue;
            }
            Iterator it = selector.selectedKeys().iterator();
            while(it.hasNext()){
            	exec++;
            	SelectionKey skey = (SelectionKey)it.next();
            	
                debug("0"," count = " + exec +"  -----  accept -->"+ skey.isAcceptable() +"   connect --> " +skey.isConnectable() 
        		 	      +"  read --> "+ skey.isReadable() +" valid --> " + skey.isValid() + " write --> " + skey.isWritable());
            	  
            	if(skey.isConnectable()){ // 是否连接
            		   SocketChannel sc = (SocketChannel) skey.channel();
                       sc.configureBlocking(false);
                       sc.finishConnect();
                       sc.register(selector, SelectionKey.OP_READ);  
                       debug("1","connect");
            	}
            	// 根据nio的注册状态,执行操作
            	if(skey.isReadable()){ 
            		debug("2","read");
            		readData(skey,selector);   
            	} 
            	if(skey.isWritable()){
            		debug("3","write");
            		ByteBuffer bbuffer = ByteBuffer.wrap(toServerData);
            		writeData(skey,bbuffer,selector); 
            	} 
            	
            	if(exec==6){ // 第二次读取完了之后此时获取的是最后数据
            			// 关闭连接
            			skey.cancel();
            			channel.close(); 
            			isFinished = true; // 终止执行
            	 }
            	it.remove();            	
            } 
            
            
           /* if(num>0){
                Set<SelectionKey> keys = selector.selectedKeys();
                a++;
              	 
                for(SelectionKey k:keys){
                	
                 System.out.println(" ---- " + a +"----  accept -->"+ k.isAcceptable() +"   connect --> " + k.isConnectable() 
        		 	      +"  read --> "+ k.isReadable() +" valid --> " + k.isValid() + " write --> " + k.isWritable());
                    
               if(k.isConnectable()){
                        SocketChannel sc = (SocketChannel) k.channel();
                        sc.configureBlocking(false);
                        sc.finishConnect();
                        sc.register(selector, SelectionKey.OP_READ);      
                        System.out.println(" --> 1" ); 
                        
                        
                        ByteBuffer bb = ByteBuffer.wrap(toServerData);
                        sc.write(bb);
                         
                   } else if (k.isReadable()) {
                        ByteBuffer echoBuffer = ByteBuffer.allocate(1024);
                        SocketChannel sc = (SocketChannel) k.channel(); 
                        //---------------------------  
                         int len = 0; 
                         len =  sc.read(echoBuffer);
                         echoBuffer.flip(); 
                         result = echoBuffer.array(); 
                         System.out.println("echo server return:data len -->"+ echoBuffer.limit() +"   len = " + len); 
                         getResponseHeader(result); 
                         // +charset.decode(echoBuffer).toString());
                          echoBuffer.clear();   
                          
                          sc.finishConnect();
                          k.cancel();
                          sc.close(); 
                   }
                }
            }   */   
        } 
        return result; 
   }
	
	 
	public  void readData(SelectionKey k,Selector selector) throws IOException{
		  int count = 0; 
          SocketChannel sc = (SocketChannel) k.channel(); 
          r_buff.clear();
          while((count=sc.read(r_buff))>0){ //循环读取r_buff
        	  //确保r_buff可读
        	  r_buff.flip();  
        	  // 把数据拿出来并显示 
              byte[] result = r_buff.array(); 
              System.out.println("echo server return:data len -->"+ r_buff.limit() +"   len = " + count); 
              getResponseHeader(result);  
        	  r_buff.clear();
          }    
          sc.register(selector, SelectionKey.OP_WRITE);  
	}
	public  void writeData(SelectionKey k,ByteBuffer bbuffer,Selector selector) throws IOException{ 
          SocketChannel sc = (SocketChannel) k.channel();  
      	  w_buff.clear();
      	  w_buff.put(bbuffer);
      	  w_buff.flip();
      	  echo2Server(sc);
      	  w_buff.clear(); 
      	  sc.register(selector, SelectionKey.OP_READ); 
	}
	// 向服务端发数据
	public void echo2Server(SocketChannel sc) throws IOException {
		 while(w_buff.hasRemaining()){
			 sc.write(w_buff); 
		 }
	}
	
    public void debug(String msgId,String message){
    	  System.out.println("debug("+ msgId+") --> " + message ); 
    }
	

 

注意:此段代码是循环执行,用的时候需要修改循环参数。

分享到:
评论

相关推荐

    Java NIO非阻塞服务端与客户端相互通信

    总之,Java NIO非阻塞服务端与客户端通信的关键在于利用非阻塞IO和选择器,实现高效的多路复用,有效利用系统资源,提升并发处理能力。通过实践本教程中的代码示例,你将能够清晰地理解这一概念并掌握其应用技巧。

    基于JavaNIO的非阻塞通信的研究与实现

    Java NIO通过引入非阻塞通信机制,显著提高了Java应用程序在网络通信和文件处理方面的性能。通过合理利用缓冲区、通道和选择器等组件,开发人员可以构建出高效且可扩展的应用程序。尽管非阻塞通信带来了很多优势,但...

    java非阻塞通信研究

    总之,Java非阻塞通信的研究涵盖了Java NIO和NIO.2的核心机制,以及如何在实际项目中应用这些技术来构建高并发、低延迟的系统。通过深入理解这些概念,开发者能够构建出更加高效、可扩展的Java应用程序。《Java非...

    非阻塞java通信代码

    总之,非阻塞Java通信通过Java NIO库实现了高效的网络编程,通过非阻塞I/O和事件驱动,使得服务器能够处理更多的并发连接,提高了系统的整体性能。`Server.java`和`Client.java`的代码将具体展示如何在Java中实现这...

    java nio示例代码

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一个新特性,旨在提供一种比传统的IO(I/O)模型更高效、性能更好的处理输入和输出的方式。传统的Java IO基于流(Stream)...

    JavaSocket学习---NIO实现非阻塞的通信

    在Java编程语言中,Socket是网络通信的基本组件,它提供了进程间网络通信的能力。而NIO(Non-blocking Input/Output,非阻塞I/O)是Java提供的一个高性能的I/O模型,与传统的阻塞I/O相比,NIO具有更高的并发性能。本...

    java非阻塞式的通信

    ### Java非阻塞式通信详解 #### 一、线程阻塞的概念与影响 线程阻塞是指在程序运行过程中,线程遇到某些条件而暂时停止执行的状态,这种状态下线程将不会消耗CPU资源,直到阻塞条件解除。在传统的Java网络编程中,...

    Java非阻塞套接字概述

    Java非阻塞套接字是Java 1.4引入的一项重要特性,它是Java NIO(New Input/Output)的一部分,提供了高效、灵活且可扩展的网络通信能力。非阻塞套接字允许在网络通信中使用套接字时,不会因为等待数据而阻塞应用程序...

    默蓝网络通信测试工具(NIOSocket工具)支持TCP/IP和HTTP通信-网络通信开发人员必备

    Java NIO(非阻塞I/O)Socket编程是此工具的核心技术之一。传统的Java Socket编程是基于阻塞I/O,当一个线程进行读写操作时,若数据未准备好,线程会被阻塞。而NIO引入了选择器和通道的概念,允许多个通道的并发读写...

    java网络编程(非阻塞与阻塞编程)

    在深入探讨Java网络编程中的非阻塞与阻塞编程之前,我们先来了解这两个概念的基本含义。阻塞编程,通常指的是在程序执行过程中,当某一部分代码遇到I/O操作时,如读写文件或网络通信,整个程序会暂停运行,等待I/O...

    java NIO实例

    Java NIO,全称为Non-Blocking Input/Output(非阻塞输入/输出),是Java从1.4版本开始引入的一种新的I/O模型,它为Java应用程序提供了更高效的数据传输方式。传统的Java I/O模型(BIO)在处理大量并发连接时效率较...

    自己写的Java NIO 同步不阻塞IO操作

    描述中提到的"用nio想的一个不阻塞NIOSocket例子"可能是一个Java NIO的Socket通信示例,利用NIO的Channel和Selector来实现客户端和服务器之间的非阻塞通信。通常,NIO中的SocketChannel用于网络通信,Selector用于...

    基于NIO非阻塞的java聊天demo(支持单聊和群聊)

    在这个基于NIO非阻塞的Java聊天demo中,我们将会看到如何利用NIO实现一个支持单聊和群聊的应用。 首先,NIO的核心组件包括Channel、Buffer、Selector和Pipe。在传统的IO模型中,数据是从流的一端流向另一端,而在...

    Java-NIO非阻塞服务器示例.docx

    Java-NIO非阻塞服务器示例 本资源主要讲解了Java-NIO非阻塞服务器的示例,通过使用Java-NIO包来实现非阻塞的服务器端模式。下面是从代码中提取的知识点: 一、Java-NIO包简介 Java-NIO(New I/O)包是Java 1.4...

    JAVA非阻塞通信技术原理研究与实现.pdf

    为此,Java非阻塞通信技术应运而生,它基于Java NIO(New I/O)包的全新设计理念,为服务端的高并发处理提供了新的解决方案。 Java NIO的非阻塞通信机制,与传统阻塞式通信的最大区别在于它采用了事件驱动的方式...

    使用NIO实现非阻塞socket通信

    在NIO中,`java.nio.channels.SocketChannel`代表了一个TCP连接,可以用来进行非阻塞的读写操作。 4. **服务器端实现**: 服务器端通常包含以下步骤: - 打开ServerSocketChannel并绑定到特定端口。 - 注册...

    nio.rar_NIO_NIO-socket_java nio_java 实例_java.nio

    NIO套接字是Java NIO库中用于网络通信的关键组件,它们允许程序非阻塞地读写数据,这对于开发高性能的服务器应用尤其有用。 描述中的“java nio 编程一个实例子.服务端程序”提示我们,这个实例是一个服务器端的...

    实现java网络与nio例子

    Java NIO(New Input/Output)是Java标准库提供的一种I/O模型,它与传统的 Blocking I/O(BIO)模型不同,NIO提供了非阻塞的读写方式,提高了程序处理高并发I/O操作的效率。这个例子包含了NIO在网络通信中的应用,...

    基于java NIO的socket通信demo

    总的来说,这个示例展示了如何使用Java NIO进行Socket通信,通过非阻塞的方式提高系统的并发处理能力。同时,它还演示了如何处理字符集问题,保证了跨平台数据交换的准确性。对于理解和实践Java NIO在网络编程中的...

    Java NIO学习资料+代码.zip

    Java NIO提供了多种通道,如FileChannel用于文件操作,SocketChannel和ServerSocketChannel用于网络通信。通道是双向的,可以同时进行读写操作。 - **缓冲区(Buffers)**:缓冲区是数据存储的地方,它是Java NIO的...

Global site tag (gtag.js) - Google Analytics