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)  編輯  收藏

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


          網站導航:
           
          主站蜘蛛池模板: 汉沽区| 肇源县| 惠州市| 穆棱市| 罗定市| 股票| 即墨市| 垫江县| 承德县| 芜湖县| 当阳市| 昆明市| 左贡县| 金门县| 永修县| 闽侯县| 常山县| 菏泽市| 同德县| 枣阳市| 孙吴县| 霍城县| 东源县| 温州市| 清河县| 安陆市| 读书| 罗山县| 清苑县| 柳江县| 巴马| 商水县| 叙永县| 灯塔市| 遂宁市| 巫山县| 潼南县| 中卫市| 天水市| 北票市| 武强县|