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

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

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

    paulwong

    NIO Socket非阻塞模式

    Server socket編程的時(shí)候,一個(gè)SERVER服務(wù)一個(gè)連接的時(shí)候,是阻塞線程的,除非用多線程來處理。

    NIO只使用一條線程即可以處理多個(gè)連接。是基于事件的模式,即產(chǎn)生事件的時(shí)候,通知客戶端處理相應(yīng)的事件。

    1)server端代碼
        /** 
         *  
         * 
    @author Jeff 
         * 
         
    */  
        
    public class HelloWorldServer {  
          
            
    static int BLOCK = 1024;  
            
    static String name = "";  
            
    protected Selector selector;  
            
    protected ByteBuffer clientBuffer = ByteBuffer.allocate(BLOCK);  
            
    protected CharsetDecoder decoder;  
            
    static CharsetEncoder encoder = Charset.forName("GB2312").newEncoder();  
          
            
    public HelloWorldServer(int port) throws IOException {  
                selector 
    = this.getSelector(port);  
                Charset charset 
    = Charset.forName("GB2312");  
                decoder 
    = charset.newDecoder();  
            }  
          
            
    // 獲取Selector  
            protected Selector getSelector(int port) throws IOException {  
                ServerSocketChannel server 
    = ServerSocketChannel.open();  
                Selector sel 
    = Selector.open();  
                server.socket().bind(
    new InetSocketAddress(port));  
                server.configureBlocking(
    false);  
                server.register(sel, SelectionKey.OP_ACCEPT);  
                
    return sel;  
            }  
          
            
    // 監(jiān)聽端口  
            public void listen() {  
                
    try {  
                    
    for (;;) {  
                        selector.select();  
                        Iterator iter 
    = selector.selectedKeys().iterator();  
                        
    while (iter.hasNext()) {  
                            SelectionKey key 
    = (SelectionKey) iter.next();  
                            iter.remove();  
                            process(key);  
                        }  
                    }  
                } 
    catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
          
            
    // 處理事件  
            protected void process(SelectionKey key) throws IOException {  
                
    if (key.isAcceptable()) { // 接收請求  
                    ServerSocketChannel server = (ServerSocketChannel) key.channel();  
                    SocketChannel channel 
    = server.accept();  
                    
    //設(shè)置非阻塞模式  
                    channel.configureBlocking(false);  
                    channel.register(selector, SelectionKey.OP_READ);  
                } 
    else if (key.isReadable()) { // 讀信息  
                    SocketChannel channel = (SocketChannel) key.channel();  
                    
    int count = channel.read(clientBuffer);  
                    
    if (count > 0) {  
                        clientBuffer.flip();  
                        CharBuffer charBuffer 
    = decoder.decode(clientBuffer);  
                        name 
    = charBuffer.toString();  
                        
    // System.out.println(name);  
                        SelectionKey sKey = channel.register(selector,  
                                SelectionKey.OP_WRITE);  
                        sKey.attach(name);  
                    } 
    else {  
                        channel.close();  
                    }  
          
                    clientBuffer.clear();  
                } 
    else if (key.isWritable()) { // 寫事件  
                    SocketChannel channel = (SocketChannel) key.channel();  
                    String name 
    = (String) key.attachment();  
                      
                    ByteBuffer block 
    = encoder.encode(CharBuffer  
                            .wrap(
    "Hello !" + name));  
                      
          
                    channel.write(block);  
          
                    
    //channel.close();  
          
                }  
            }  
          
            
    public static void main(String[] args) {  
                
    int port = 8888;  
                
    try {  
                    HelloWorldServer server 
    = new HelloWorldServer(port);  
                    System.out.println(
    "listening on " + port);  
                      
                    server.listen();  
                      
                } 
    catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }


    server主要是讀取client發(fā)過來的信息,并返回一條信息

    2)client端代碼
        /** 
         *  
         * 
    @author Jeff 
         * 
         
    */  
        
    public class HelloWorldClient {  
          
            
    static int SIZE = 10;  
            
    static InetSocketAddress ip = new InetSocketAddress("localhost"8888);  
            
    static CharsetEncoder encoder = Charset.forName("GB2312").newEncoder();  
          
            
    static class Message implements Runnable {  
                
    protected String name;  
                String msg 
    = "";  
          
                
    public Message(String index) {  
                    
    this.name = index;  
                }  
          
                
    public void run() {  
                    
    try {  
                        
    long start = System.currentTimeMillis();  
                        
    //打開Socket通道  
                        SocketChannel client = SocketChannel.open();  
                        
    //設(shè)置為非阻塞模式  
                        client.configureBlocking(false);  
                        
    //打開選擇器  
                        Selector selector = Selector.open();  
                        
    //注冊連接服務(wù)端socket動作  
                        client.register(selector, SelectionKey.OP_CONNECT);  
                        
    //連接  
                        client.connect(ip);  
                        
    //分配內(nèi)存  
                        ByteBuffer buffer = ByteBuffer.allocate(8 * 1024);  
                        
    int total = 0;  
          
                        _FOR: 
    for (;;) {  
                            selector.select();  
                            Iterator iter 
    = selector.selectedKeys().iterator();  
          
                            
    while (iter.hasNext()) {  
                                SelectionKey key 
    = (SelectionKey) iter.next();  
                                iter.remove();  
                                
    if (key.isConnectable()) {  
                                    SocketChannel channel 
    = (SocketChannel) key  
                                            .channel();  
                                    
    if (channel.isConnectionPending())  
                                        channel.finishConnect();  
                                    channel  
                                            .write(encoder  
                                                    .encode(CharBuffer.wrap(name)));  
          
                                    channel.register(selector, SelectionKey.OP_READ);  
                                } 
    else if (key.isReadable()) {  
                                    SocketChannel channel 
    = (SocketChannel) key  
                                            .channel();  
                                    
    int count = channel.read(buffer);  
                                    
    if (count > 0) {  
                                        total 
    += count;  
                                        buffer.flip();  
          
                                        
    while (buffer.remaining() > 0) {  
                                            
    byte b = buffer.get();  
                                            msg 
    += (char) b;  
                                              
                                        }  
          
                                        buffer.clear();  
                                    } 
    else {  
                                        client.close();  
                                        
    break _FOR;  
                                    }  
                                }  
                            }  
                        }  
                        
    double last = (System.currentTimeMillis() - start) * 1.0 / 1000;  
                        System.out.println(msg 
    + "used time :" + last + "s.");  
                        msg 
    = "";  
                    } 
    catch (IOException e) {  
                        e.printStackTrace();  
                    }  
                }  
            }  
          
            
    public static void main(String[] args) throws IOException {  
              
                String names[] 
    = new String[SIZE];  
          
                
    for (int index = 0; index < SIZE; index++) {  
                    names[index] 
    = "jeff[" + index + "]";  
                    
    new Thread(new Message(names[index])).start();  
                }  
              
            }  
        }




    posted on 2013-03-31 13:38 paulwong 閱讀(356) 評論(0)  編輯  收藏 所屬分類: J2SE性能優(yōu)化

    主站蜘蛛池模板: 亚洲最大中文字幕无码网站| 亚洲成a人片在线观看无码| 国产精品公开免费视频| 婷婷亚洲天堂影院| 亚洲人成人网站色www| 久久亚洲AV成人无码电影| 亚洲一区二区三区四区视频| 亚洲欧美精品午睡沙发| 羞羞视频在线观看免费| 大地资源网高清在线观看免费 | 人妻免费久久久久久久了| 中文在线日本免费永久18近| 久久99精品视免费看| 日本免费网站视频www区| 四虎免费在线观看| 国产国拍亚洲精品福利| 婷婷亚洲综合五月天小说| 亚洲熟妇AV乱码在线观看| 成人a毛片视频免费看| 日本xxxx色视频在线观看免费| 久久精品无码一区二区三区免费| 一本色道久久88亚洲综合| 久久久综合亚洲色一区二区三区| 亚洲国产亚洲片在线观看播放| 久久人午夜亚洲精品无码区| 3344在线看片免费| 最近免费中文字幕4| 亚洲国产成人久久综合野外| 亚洲人成电影福利在线播放| 亚洲丰满熟女一区二区哦| 青青操视频在线免费观看| 女人让男人免费桶爽30分钟| 亚洲人成77777在线播放网站| 亚洲人成77777在线播放网站不卡| 菠萝菠萝蜜在线免费视频| 久久精品毛片免费观看| 又粗又硬又大又爽免费视频播放| 亚洲bt加勒比一区二区| 羞羞漫画页面免费入口欢迎你 | 成人片黄网站色大片免费观看cn | 67194国产精品免费观看|