<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    sblig

    BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
      10 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

    ?服務(wù)器端:

    ?

    ?

     // 1. 分配一個(gè) ServerSocketChannel 文件描述符
                serverChannel = ServerSocketChannel.open();
    
                // 2. 從 ServerSocketChannel里獲取一個(gè)對于的 socket
                serverSocket = serverChannel.socket();
    
                // 3. 生成一個(gè) 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
                // 在各個(gè)子類實(shí)現(xiàn)不同
                serverChannel.register(selector, SelectionKey.OP_ACCEPT);
                while (true) {
    			try {
    				// 獲得IO準(zhǔn)備就緒的channel數(shù)量
    				int n = selector.select();
    
    				// 沒有channel準(zhǔn)備就緒,繼續(xù)執(zhí)行
    				if (n == 0) {
    					continue;
    				}
    
    				// 用一個(gè)iterator返回Selector的selectedkeys
    				Iterator it = selector.selectedKeys().iterator();
    
    				// 處理每一個(gè)SelectionKey
    				while (it.hasNext()) {
    					SelectionKey key = (SelectionKey) it.next();
    
    					// 判斷是否有新的連接到達(dá)
    					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);
    					}
    
    					// 判斷是否有數(shù)據(jù)在此channel里需要讀取
    					if (key.isReadable()) {
    						processData(key);
    					}
    				}
    
    				// 刪除 selectedkeys
    				it.remove();
    
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}

    ?

    ?

    ?

    ?客戶端:

    ?

    ?

      //打開socket通道
    		SocketChannel socketChannel = SocketChannel.open();
    		//設(shè)置非阻塞方式
    		socketChannel.configureBlocking(false);
    		//打開選擇器
    		Selector selector = Selector.open();
    		//注冊連接到服務(wù)器socket動(dòng)作
    		socketChannel.register(selector, SelectionKey.OP_CONNECT);
    		//連接
    		socketChannel.connect( new InetSocketAddress("localhost",9988));
    		
    		Set<SelectionKey> selectkeySets;
    		SelectionKey selectionKey;
    		Iterator<SelectionKey> iterator;
    		
    		//與服務(wù)器通信通道
    		SocketChannel clientChannel ;
    
    	       while(true){
    			//選擇一組建,其相應(yīng)的通道已為I/O操作準(zhǔn)備就緒
    			//此方法執(zhí)行處于阻塞模式的選擇操作
    			selector.select(TIME_OUT);
    			
    			//返回此選擇器的已選擇鍵集。
    			selectkeySets = selector.selectedKeys();
    			iterator = selectkeySets.iterator();
    			
    			
    			while(iterator.hasNext()){
    				selectionKey = iterator.next();
    				
    				if (selectionKey.isConnectable()) {
                                      clientChannel = (SocketChannel)selectionKey.channel();
    					// 判斷此通道上是否正在進(jìn)行連接操作。  
                                      // 完成套接字通道的連接過程。  
    					if (clientChannel.isConnectionPending()) {//判斷此通道上是否正在進(jìn)行連接操作
    						clientChannel.finishConnect();  //完成套接字通道的連接過程
                                       
                                      }
                                      clientChannel.register(selector, SelectionKey.OP_WRITE);
                                }else if (selectionKey.isReadable()) {
    					clientChannel = (SocketChannel)selectionKey.channel();
    					//將緩沖區(qū)清空
    					receiveBuffer.clear();
    					//讀取服務(wù)器發(fā)送來的數(shù)據(jù)庫到緩沖區(qū)
    					count = clientChannel.read(receiveBuffer);//count 讀取到的字節(jié)數(shù)
    					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("客戶端向服務(wù)器發(fā)送數(shù)據(jù):"+sendText);
    					clientChannel.register(selector, SelectionKey.OP_READ);
                                }
                         }
                     }
    
    

    ?



    已有 0 人發(fā)表留言,猛擊->>這里<<-參與討論


    ITeye推薦



    posted on 2012-09-28 16:31 李凡 閱讀(300) 評(píng)論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 在线观看免费精品国产| 1000部免费啪啪十八未年禁止观看| 91网站免费观看| 91亚洲自偷手机在线观看| 毛片在线全部免费观看| 亚洲无线观看国产精品| 成在线人视频免费视频| 亚洲色无码专区在线观看| 拍拍拍无挡视频免费观看1000| 亚洲国产综合人成综合网站| 一级毛片aaaaaa视频免费看| 亚洲精品视频在线观看你懂的| 一级a性色生活片久久无少妇一级婬片免费放 | 91免费人成网站在线观看18| 911精品国产亚洲日本美国韩国| 污污网站18禁在线永久免费观看| 亚洲AV无码乱码在线观看裸奔| 鲁丝片一区二区三区免费| 91嫩草亚洲精品| 国产无人区码卡二卡三卡免费| 亚洲中文字幕无码mv| 免费大香伊蕉在人线国产| 国产97视频人人做人人爱免费| 国产亚洲精品va在线| 亚洲毛片免费观看| 亚洲va久久久久| 亚洲人成人无码网www国产| 成人免费av一区二区三区| 一区二区三区亚洲| 国产精品视频免费一区二区| 精品成人一区二区三区免费视频 | 久久免费视频精品| 亚洲国产成人手机在线电影bd | 日韩视频免费在线观看| 亚洲成人黄色在线| 可以免费观看的一级毛片| 免费福利电影在线观看| 激情综合亚洲色婷婷五月APP| 无码欧精品亚洲日韩一区夜夜嗨| 国产真人无码作爱视频免费 | 久久av免费天堂小草播放|