zoukankan      html  css  js  c++  java
  • Java NIO 聊天室实例

    最近写了个Java NIO聊天室聊天的程序,NIO学习起来比较困难的,我的代码能给大家起到一个抛砖引玉的作用!

    服务端:

    package test.javanio;  
    
    /**  
     * @author   
     * @version   
     * CreateTime:2010-12-1 下午05:12:11  
     * Description:  
     */ 
    import java.io.IOException;  
    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.util.Date;  
    import java.util.Iterator;  
    import java.util.logging.Level;  
    import java.util.logging.Logger;  
    
    public class MySocketServer implements Runnable {  
    
        private boolean running;  
    
        private Selector selector;  
        String writeMsg;  
        StringBuffer sb = new StringBuffer();  
        SelectionKey ssckey;  
    
        public MySocketServer() {  
    
            running = true;  
    
        }  
    
        public void init() {  
            try {  
                selector = Selector.open();  
                ServerSocketChannel ssc = ServerSocketChannel.open();  
                ssc.configureBlocking(false);  
                ssc.socket().bind(new InetSocketAddress(2345));  
                ssckey = ssc.register(selector, SelectionKey.OP_ACCEPT);  
                System.out.println("server is starting..." + new Date());  
            } catch (IOException ex) {  
                Logger.getLogger(MySocketServer.class.getName()).log(Level.SEVERE,  
                        null, ex);  
            }  
        }  
    
        public static void main(String[] args) {  
            MySocketServer server = new MySocketServer();  
            new Thread(server).start();  
    
        }  
    
        public void execute() {  
            try {  
                while (running) {  
                    int num = selector.select();  
                    if (num > 0) {  
                        Iterator<SelectionKey> it = selector.selectedKeys()  
                                .iterator();  
                        while (it.hasNext()) {  
                            SelectionKey key = it.next();  
                            it.remove();  
                            if (!key.isValid())  
                                continue;  
                            if (key.isAcceptable()) {  
                                System.out.println("isAcceptable");  
                                getConn(key);  
                            } else if (key.isReadable()) {  
                                System.out.println("isReadable");  
                                readMsg(key);  
                            }  
    
                            else if (key.isValid() && key.isWritable()) {  
                                if (writeMsg != null) {  
                                    System.out.println("isWritable");  
                                    writeMsg(key);  
                                }  
    
                            }  
    
                            else 
                                break;  
    
                        }  
    
                    }  
                    Thread.yield();  
                }  
    
            } catch (IOException ex) {  
                Logger.getLogger(MySocketServer.class.getName()).log(Level.SEVERE,  
                        null, ex);  
            }  
        }  
    
        private void getConn(SelectionKey key) throws IOException {  
            ServerSocketChannel ssc = (ServerSocketChannel) key.channel();  
            SocketChannel sc = ssc.accept();  
            sc.configureBlocking(false);  
            sc.register(selector, SelectionKey.OP_READ);  
            System.out.println("build connection :" 
                    + sc.socket().getRemoteSocketAddress());  
        }  
    
        private void readMsg(SelectionKey key) throws IOException {  
            sb.delete(0, sb.length());  
            SocketChannel sc = (SocketChannel) key.channel();  
            System.out.print(sc.socket().getRemoteSocketAddress() + " ");  
            ByteBuffer buffer = ByteBuffer.allocate(1024);  
            buffer.clear();  
            int len = 0;  
            StringBuffer sb = new StringBuffer();  
            while ((len = sc.read(buffer)) > 0) {  
                buffer.flip();  
                sb.append(new String(buffer.array(), 0, len));  
            }  
            if (sb.length() > 0)  
                System.out.println("get from client:" + sb.toString());  
            if (sb.toString().trim().toLowerCase().equals("quit")) {  
                sc.write(ByteBuffer.wrap("BYE".getBytes()));  
                System.out.println("client is closed " 
                        + sc.socket().getRemoteSocketAddress());  
                key.cancel();  
                sc.close();  
                sc.socket().close();  
    
            } else {  
                String toMsg = sc.socket().getRemoteSocketAddress() + "said:" 
                        + sb.toString();  
                System.out.println(toMsg);  
    
                writeMsg = toMsg;  
    
                /*  
                 * Iterator<SelectionKey> it=key.selector().keys().iterator();  
                 *   
                 * while(it.hasNext()){ SelectionKey skey=it.next();  
                 * if(skey!=key&&skey!=ssckey){ SocketChannel client=(SocketChannel)  
                 * skey.channel(); client.write(ByteBuffer.wrap(toMsg.getBytes()));  
                 * }  
                 *   
                 * }  
                 */ 
    
                /*  
                 *   
                 * key.attach(toMsg);  
                 * key.interestOps(key.interestOps()|SelectionKey.OP_WRITE);  
                 */ 
                Iterator<SelectionKey> it = key.selector().keys().iterator();  
    
                while (it.hasNext()) {  
                    SelectionKey skey = it.next();  
                    if (skey != key && skey != ssckey) {  
                        if (skey.attachment() != null) {  
                            String str = (String) skey.attachment();  
                            skey.attach(str + toMsg);  
                        } else {  
                            skey.attach(toMsg);  
                        }  
                        skey  
                                .interestOps(skey.interestOps()  
                                        | SelectionKey.OP_WRITE);  
                    }  
    
                }  
                selector.wakeup();// 可有可无  
    
            }  
    
        }  
    
        public void run() {  
            init();  
            execute();  
        }  
    
        private void writeMsg(SelectionKey key) throws IOException {  
    
            System.out.println("++++enter write+++");  
            SocketChannel sc = (SocketChannel) key.channel();  
            String str = (String) key.attachment();  
    
            sc.write(ByteBuffer.wrap(str.getBytes()));  
            key.interestOps(SelectionKey.OP_READ);  
        }  
    } 

    客户端:

    package test.javanio;  
    
    /**  
     * @author   
     * @version   
     * CreateTime:2010-12-1 下午05:12:46  
     * Description:  
     */ 
    import java.io.BufferedReader;  
    import java.io.IOException;  
    import java.io.InputStreamReader;  
    import java.net.InetSocketAddress;  
    import java.nio.ByteBuffer;  
    import java.nio.channels.Selector;  
    import java.nio.channels.SocketChannel;  
    import java.util.logging.Level;  
    import java.util.logging.Logger;  
    import java.util.Currency.*;  
    
    public class MySocketClient implements Runnable {  
        Selector selector;  
    
        boolean running;  
    
        SocketChannel sc;  
    
        public MySocketClient() {  
            running = true;  
    
        }  
    
        public void init() {  
            try {  
                sc = SocketChannel.open();  
                sc.configureBlocking(false);  
                sc.connect(new InetSocketAddress("localhost", 2345));  
    
            } catch (IOException ex) {  
                Logger.getLogger(MySocketClient.class.getName()).log(Level.SEVERE,  
                        null, ex);  
            }  
        }  
    
        public static void main(String[] args) {  
    
            MySocketClient client = new MySocketClient();  
            new Thread(client).start();  
        }  
    
        public void execute() {  
    
            int num = 0;  
            try {  
                while (!sc.finishConnect()) {  
                }  
            } catch (IOException ex) {  
                Logger.getLogger(MySocketClient.class.getName()).log(Level.SEVERE,  
                        null, ex);  
            }  
    
            ReadKeyBoard rkb = new ReadKeyBoard();  
            new Thread(rkb).start();  
            while (running) {  
                try {  
    
                    ByteBuffer buffer = ByteBuffer.allocate(1024);  
                    buffer.clear();  
    
                    StringBuffer sb = new StringBuffer();  
                    Thread.sleep(500);  
    
                    while ((num = sc.read(buffer)) > 0) {  
                        sb.append(new String(buffer.array(), 0, num));  
                        buffer.clear();  
                    }  
                    if (sb.length() > 0)  
                        System.out.println(sb.toString());  
                    if (sb.toString().toLowerCase().trim().equals("bye")) {  
                        System.out.println("closed....");  
    
                        sc.close();  
                        sc.socket().close();  
                        rkb.close();  
                        running = false;  
                    }  
                } catch (InterruptedException ex) {  
                    Logger.getLogger(MySocketClient.class.getName()).log(  
                            Level.SEVERE, null, ex);  
                } catch (IOException ex) {  
                    Logger.getLogger(MySocketClient.class.getName()).log(  
                            Level.SEVERE, null, ex);  
                }  
            }  
    
        }  
    
        public void run() {  
            init();  
            execute();  
        }  
    
        class ReadKeyBoard implements Runnable {  
    
            boolean running2 = true;  
    
            public ReadKeyBoard() {  
    
            }  
    
            public void close() {  
                running2 = false;  
            }  
    
            public void run() {  
                BufferedReader reader = new BufferedReader(new InputStreamReader(  
                        System.in));  
                while (running2) {  
                    try {  
                        System.out.println("enter some commands:");  
                        String str = reader.readLine();  
                        sc.write(ByteBuffer.wrap(str.getBytes()));  
    
                    } catch (IOException ex) {  
                        Logger.getLogger(ReadKeyBoard.class.getName()).log(  
                                Level.SEVERE, null, ex);  
                    }  
                }  
    
            }  
    
        }  
    } 

    原文地址:http://gcguchao8888-sina-com.iteye.com/blog/839021

  • 相关阅读:
    [HAOI2015][bzoj 4033]树上染色(树dp+复杂度分析)
    20190716NOIP模拟赛T1 礼物(概率dp+状压)
    20190716NOIP模拟赛T2 通讯(tarjan缩点+贪心)
    延迟载入Dll(动态载入Dll)
    Dll重定向(尚存否?)
    delete和delete[] 区别
    06 序列号保护 学习分析(字符串)
    05 初识加壳脱壳
    04 复制删除行为IDA反汇编
    03 复制行为动态分析
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6468381.html
Copyright © 2011-2022 走看看