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

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

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

    當(dāng)柳上原的風(fēng)吹向天際的時候...

    真正的快樂來源于創(chuàng)造

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks
    注意:
    1.NIO主要用于服務(wù)端,若用來客戶端相對于它帶來的額外復(fù)雜性有點不值得。
    2.用于編碼解碼字符集請根據(jù)您的機器缺省字符集進行調(diào)整,如GB2312,GBK,UTF-8,UTF-16等,若出現(xiàn)亂碼請更換之。
    3.BufferSize請根據(jù)您可能發(fā)送接收的最大字符串長度進行相應(yīng)調(diào)整。

    代碼:
    package com.heyang.biz.server.test.nio;

    import java.net.InetSocketAddress;
    import java.nio.ByteBuffer;
    import java.nio.channels.SelectionKey;
    import java.nio.channels.Selector;
    import java.nio.channels.ServerSocketChannel;
    import java.nio.channels.SocketChannel;
    import java.nio.charset.Charset;
    import java.util.Iterator;


    /**
     * NIO 服務(wù)器
     * 說明:
     * 作者:何楊(heyang78@gmail.com)
     * 創(chuàng)建時間:2011-1-3 下午12:09:02
     * 修改時間:2011-1-3 下午12:09:02
     
    */
    public class NIOServer{
        
    // 本地字符集
        private static final String LocalCharsetName = "gb2312";

        
    // 本地服務(wù)器監(jiān)聽的端口
        private static final int Listenning_Port=8888;
        
        
    // 緩沖區(qū)大小
        private static final int Buffer_Size=1024;
        
        
    // 超時時間,單位毫秒
        private static final int TimeOut=3000;
        
        
    public static void main(String[] args) throws Exception{
            
    // 創(chuàng)建一個在本地端口進行監(jiān)聽的服務(wù)Socket信道.并設(shè)置為非阻塞方式
            ServerSocketChannel serverChannel=ServerSocketChannel.open();
            serverChannel.socket().bind(
    new InetSocketAddress(Listenning_Port));
            serverChannel.configureBlocking(
    false);
            
            
    // 創(chuàng)建一個選擇器并將serverChannel注冊到它上面
            Selector selector=Selector.open();
            serverChannel.register(selector, SelectionKey.OP_ACCEPT);
            
            
    while(true){
                
    // 等待某個信道就緒
                if(selector.select(TimeOut)==0){
                    System.out.println(
    ".");
                    
    continue;
                }
                
                
    // 獲得就緒信道的鍵迭代器
                Iterator<SelectionKey> keyIter=selector.selectedKeys().iterator();
                
                
    // 使用迭代器進行遍歷就緒信道
                while(keyIter.hasNext()){
                    SelectionKey key
    =keyIter.next();
                    
                    
    // 這種情況是有客戶端連接過來,準備一個clientChannel與之通信
                    if(key.isAcceptable()){
                        SocketChannel clientChannel
    =((ServerSocketChannel)key.channel()).accept();
                        clientChannel.configureBlocking(
    false);
                        clientChannel.register(key.selector(), SelectionKey.OP_READ,ByteBuffer.allocate(Buffer_Size));
                    }
                    
                    
    // 客戶端有寫入時
                    if(key.isReadable()){
                        
    // 獲得與客戶端通信的信道
                        SocketChannel clientChannel=(SocketChannel)key.channel();
                        
                        
    // 得到并重置緩沖區(qū)的主要索引值
                        ByteBuffer buffer=(ByteBuffer)key.attachment();
                        buffer.clear();
                        
                        
    // 讀取信息獲得讀取的字節(jié)數(shù)
                        long bytesRead=clientChannel.read(buffer);
                        
                        
    if(bytesRead==-1){
                          
    // 沒有讀取到內(nèi)容的情況
                          clientChannel.close();
                        }
                        
    else{
                          
    // 將緩沖區(qū)準備為數(shù)據(jù)傳出狀態(tài)
                          buffer.flip();
                          
                          
    // 將獲得字節(jié)字符串(使用Charset進行解碼)   
                          String receivedString=Charset.forName(LocalCharsetName).newDecoder().decode(buffer).toString();
                          
                          
    // 控制臺打印出來
                          System.out.println("接收到信息:"+receivedString);
                          
                          
    // 準備發(fā)送的文本
                          String sendString="你好,客戶端. 已經(jīng)收到你的信息"+receivedString;
                          
                          
    // 將要發(fā)送的字符串編碼(使用Charset進行編碼)后再進行包裝
                          buffer=ByteBuffer.wrap(sendString.getBytes(LocalCharsetName));
                          
                          
    // 發(fā)送回去
                          clientChannel.write(buffer);
                          
                          
    // 設(shè)置為下一次讀取或是寫入做準備
                          key.interestOps(SelectionKey.OP_READ | SelectionKey.OP_WRITE);
                        }
                    }
                    
                    keyIter.remove();
                }
            }
            
        }
    }

    與之配合的客戶端代碼,沒有采用NIO方式。
    package com.heyang.biz.server.test.nio;

    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.util.Scanner;



    public class TestClient{
        
    public static void main(String[] args) throws Exception{
            Socket s
    =new Socket("127.0.0.1",8888);
            
            InputStream  inStram
    =s.getInputStream();
            OutputStream outStream
    =s.getOutputStream();
            
            
    // 輸出
            PrintWriter out=new PrintWriter(outStream,true);
            
            out.print(
    "getPublicKey你好!");
            out.flush();

            s.shutdownOutput();
    // 輸出結(jié)束
            
            
    // 輸入
            Scanner in=new Scanner(inStram);
            StringBuilder sb
    =new StringBuilder();
            
    while(in.hasNextLine()){
                String line
    =in.nextLine();
                sb.append(line);
            }
            String response
    =sb.toString();
            System.out.println(
    "response="+response);
        }
    }

    服務(wù)器端的輸出:
    .
    接收到信息:getPublicKey你好!
    .

    客戶端的輸出:
    response=你好,客戶端. 已經(jīng)收到你的信息getPublicKey你好!
    posted on 2011-01-03 14:36 何楊 閱讀(4710) 評論(0)  編輯  收藏

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲一级毛片免费在线观看| 三级黄色片免费看| 国产一精品一AV一免费孕妇| 亚洲人成黄网在线观看| 在线看免费观看AV深夜影院| 亚洲日本人成中文字幕| 青苹果乐园免费高清在线| 亚洲色一区二区三区四区| 日韩免费一级毛片| 免费一级毛suv好看的国产网站| 亚洲欧洲国产成人综合在线观看 | 亚洲欧洲春色校园另类小说| 最近免费中文字幕大全高清大全1| 亚洲avav天堂av在线网毛片| 久久精品国产亚洲77777| 嫩草在线视频www免费看| 亚洲va中文字幕无码久久| a级毛片高清免费视频就| 无码乱人伦一区二区亚洲| 69av免费观看| 亚洲色大成网站WWW国产| 国产成人免费a在线资源| 一区二区在线视频免费观看| 久久精品国产精品亚洲艾| 免费H网站在线观看的| 亚洲大码熟女在线观看| 亚洲国产电影av在线网址| 女同免费毛片在线播放| 久久久久se色偷偷亚洲精品av| 国产又大又长又粗又硬的免费视频| 一级毛片a免费播放王色| 久久久久久亚洲精品中文字幕| 中文字幕无码免费久久99| 特级毛片A级毛片免费播放| 久久久精品国产亚洲成人满18免费网站 | 久久影视综合亚洲| 亚洲香蕉免费有线视频| 国产精品亚洲综合一区在线观看| 亚洲AV综合色区无码一区| 免费鲁丝片一级观看| 中文字幕无码一区二区免费|