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

	//--------------------------------------------------------------
	// 输入输入对象
	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 ); 
    }
	

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值