<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()) { // 接收請(qǐng)求  
                    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();  
                        
    //注冊(cè)連接服務(wù)端socket動(dòng)作  
                        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) 評(píng)論(0)  編輯  收藏 所屬分類: J2SE性能優(yōu)化

    主站蜘蛛池模板: 亚洲日韩中文字幕在线播放| 成年女人免费视频播放体验区| 亚洲成年人啊啊aa在线观看| 国产午夜亚洲精品国产| 希望影院高清免费观看视频| 亚洲毛片免费观看| 无码专区永久免费AV网站| 亚洲国产日韩精品| 成年性生交大片免费看| 亚洲爆乳无码专区www| 国产一级淫片a视频免费观看| 偷自拍亚洲视频在线观看99| 免费在线观看黄网| 你是我的城池营垒免费看| 国产亚洲精品福利在线无卡一| 一个人晚上在线观看的免费视频| 亚洲精品国产精品乱码不卞| 二个人看的www免费视频| 亚洲三级电影网址| 成年在线观看网站免费| 性色av极品无码专区亚洲| 亚洲国产精品日韩专区AV| 暖暖日本免费中文字幕| 亚洲免费闲人蜜桃| avtt亚洲天堂| 日日麻批免费40分钟无码| 国产成人亚洲综合一区 | 亚欧在线精品免费观看一区| 亚洲一区中文字幕在线电影网| 女人张开腿给人桶免费视频| 亚欧国产一级在线免费| 亚洲午夜久久久精品影院| 女人被免费视频网站| 99在线免费观看| 亚洲色大成网站WWW国产| 国产亚洲精品免费视频播放| 免费观看无遮挡www的小视频| 亚洲avav天堂av在线网毛片| 久久亚洲精品中文字幕无码| 嫩草视频在线免费观看| 最近免费mv在线观看动漫|