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

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

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

    sblig

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      10 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

    ?服務器端:

    ?

    ?

     // 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);
                                }
                         }
                     }
    
    

    ?



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


    ITeye推薦



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

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲av日韩av欧v在线天堂| 24小时免费直播在线观看| 狠狠色婷婷狠狠狠亚洲综合 | 97无码免费人妻超级碰碰夜夜| 亚洲免费在线视频| 91禁漫免费进入| 亚洲成人在线免费观看| 成人网站免费观看| 精品国产亚洲一区二区三区在线观看 | 亚洲黄色免费网站| 一道本不卡免费视频| 中文字幕无码视频手机免费看 | 99久久精品日本一区二区免费| 亚洲人成毛片线播放| 无码免费午夜福利片在线 | 国产成人免费高清在线观看| 国产成人高清亚洲一区91| 中文字幕亚洲天堂| 久久精品一本到99热免费| 亚洲不卡影院午夜在线观看| 免费亚洲视频在线观看| 怡红院免费的全部视频| 亚洲手机中文字幕| 国产91久久久久久久免费| 亚洲人成人伊人成综合网无码| 在线观看免费大黄网站| 春意影院午夜爽爽爽免费| 国产精品国产亚洲精品看不卡| 2015日韩永久免费视频播放 | 亚洲www77777| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 久久亚洲精品中文字幕无码| rh男男车车的车车免费网站 | 亚洲国产成人99精品激情在线| 免费国产黄网站在线观看 | 一级成人毛片免费观看| 亚洲视频在线视频| 国产成人免费ā片在线观看| 国产色爽免费无码视频| 亚洲性无码一区二区三区| 国产亚洲av片在线观看16女人|