<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 李凡 閱讀(296) 評論(0)  編輯  收藏

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


    網站導航:
     
    主站蜘蛛池模板: 在线观看亚洲AV日韩AV| 久久亚洲AV成人无码电影| 亚洲中文字幕不卡无码| 亚洲短视频男人的影院| 亚洲欧洲日产国产最新| 亚洲人成网站色7799| 国产亚洲情侣久久精品| 三年片免费高清版 | 精品无码一区二区三区亚洲桃色| 国产精品免费观看| 成全视频免费观看在线看| 老司机午夜性生免费福利 | 黄色免费网址在线观看| 亚洲日韩AV无码一区二区三区人| 综合久久久久久中文字幕亚洲国产国产综合一区首| a成人毛片免费观看| 亚洲人成网站在线在线观看| 亚洲人成免费网站| 亚洲一区综合在线播放| 亚洲中文字幕无码久久精品1| 免费一区二区视频| 国产精品久久免费视频| 午夜免费不卡毛片完整版| 免费黄色网址入口| 亚洲成a人片在线观看久| 免费观看国产精品| 国产免费131美女视频| 免费无码AV电影在线观看| 国产免费av片在线看| 永久免费无码网站在线观看| 免费无遮挡无码永久在线观看视频| 午夜国产大片免费观看| 4338×亚洲全国最大色成网站| 亚洲精品字幕在线观看| 亚洲AV日韩AV永久无码免下载| 亚洲AV电影院在线观看| 亚洲小视频在线观看| 亚洲综合色7777情网站777| 国产成人精品日本亚洲专区6| 亚洲精华国产精华精华液好用| 亚洲精品无码专区在线播放|