zoukankan      html  css  js  c++  java
  • java 基础之--nio 网络编程

    在传统的Java 网络编程中,对于客户端的每次连接,对于服务器来说,都要创建一个新的线程与客户端进行通讯,这种频繁的线程的创建,对于服务器来说,是一种巨大的损耗,在Java 1.4 引入Java nio 引入了 selector channel buffer 对此操作进行重新的定义:

    服务端:

    package com.java.baseknowledge.net;
    
    import java.io.IOException;
    import java.net.InetAddress;
    import java.net.InetSocketAddress;
    import java.nio.ByteBuffer;
    import java.nio.channels.SelectableChannel;
    import java.nio.channels.SelectionKey;
    import java.nio.channels.Selector;
    import java.nio.channels.ServerSocketChannel;
    import java.nio.channels.SocketChannel;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Random;
    import java.util.Set;
    
    public class NioService {
        //store userMap
        public static  Map<Integer,SocketChannel> userMap =new HashMap<>();
        public static void main(String[] args) throws Exception {
        
            
            //selector object
            Selector selector  =Selector.open();
            //serversocketchannel object is listening client accept
            ServerSocketChannel serverSocket =ServerSocketChannel.open();
            //Adjusts this channel's blocking mode.
            serverSocket.configureBlocking(false);
            
            serverSocket.bind(new InetSocketAddress(9099));
            //在selector中register channel
            serverSocket.register(selector, SelectionKey.OP_ACCEPT);
            
            while(true) {
                //block method event listening,this method is perform when event is touch;
                selector.select();
                //get selection-key set
                Set<SelectionKey> selectedKeys = selector.selectedKeys();
                
                selectedKeys.forEach((keys->{
                    //judge selectionkey mode
                    if(keys.isAcceptable()) {
                        try {
                        ServerSocketChannel channel = (ServerSocketChannel)keys.channel();
                        //obtain socketchannel 
                        SocketChannel accept = channel.accept();
                        accept.configureBlocking(false);
                        //regist selector,listening read event
                        accept.register(selector, SelectionKey.OP_READ);
                        userMap.put(new Random().nextInt()*new Random().nextInt(), accept);
                        
                        }
                        catch(Exception e ) {
                            e.printStackTrace();
                        }
                    }
                    
                    else if(keys.isReadable()) {
                        //obtain socketchannel
                        try {
                        SocketChannel channel = (SocketChannel)keys.channel();
                        System.out.println(channel);
                        ByteBuffer by = ByteBuffer.allocate(2048);
                        channel.read(by);
                        
                        userMap.forEach((k,v)->{
                            
                            by.rewind();
                            if(v!=channel) {
                                try {
                                    v.write(by);
                                } catch (IOException e) {
                                    // TODO Auto-generated catch block
                                    e.printStackTrace();
                                }
                            }
                        });
                        
                        
                        }
                        catch(Exception e) {}
                        
                        
                    }
                    selectedKeys.clear();
                    
                }));
                
                
            }
            
            
            
            
            
        }
    
    }

    客户端:

    package com.java.baseknowledge.net;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.InetSocketAddress;
    import java.nio.ByteBuffer;
    import java.nio.channels.SelectionKey;
    import java.nio.channels.Selector;
    import java.nio.channels.SocketChannel;
    import java.util.Set;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    /**
     * chat  client
     * @author Administrator
     *
     */
    public class JavaNioClient {
        
        
        public static void main(String[] args) throws Exception {
            
            
            //建立Selector
            Selector selector =Selector.open();
            SocketChannel socketChannel=SocketChannel.open();
            //设置非阻塞
            socketChannel.configureBlocking(false);
            
            socketChannel.register(selector, SelectionKey.OP_CONNECT);
            
            socketChannel.connect(new InetSocketAddress("127.0.0.1", 9099));
            
            
            while(true) {
                selector.select();
                
                Set<SelectionKey> setionkey =selector.selectedKeys();
                
                for(SelectionKey kk :setionkey) {
                    if(kk.isConnectable()) {
                        //从selectionkey 获取socketChannel
                        SocketChannel socket=(SocketChannel)kk.channel();
                        //手动建立连接
                        if(socket.isConnectionPending()) {
                            socket.finishConnect();
                            //写数据
                            ByteBuffer byteB = ByteBuffer.allocate(1024);
                            byteB.put((System.currentTimeMillis()+"连接ok").getBytes());
                            byteB.flip();
                            socket.write(byteB);
                            //jdk1.5 线程池
                            ExecutorService exe =Executors.newSingleThreadExecutor(Executors.defaultThreadFactory());
                            
                            exe.submit(new Thread() {
                                
                                @Override
                                public void run() {
                                    while(true) {
                                        String msg=null;
                                    byteB.clear();
                                    //标准键盘输入
                                    BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
                                    try {
                                         msg =br.readLine();
                                         ByteBuffer bytec = ByteBuffer.allocate(1024);
                                         bytec.put(msg.getBytes());
                                         bytec.flip();
                                         socket.write(bytec);
                                    } catch (IOException e) {
                                        
                                        e.printStackTrace();
                                    }
                                    }
                                }
                            });
                        }
                        
                        
                        socket.register(selector, SelectionKey.OP_READ);
                    }
                    else if(kk.isReadable())  {
                        
                        //从selectionkey 获取socketChannel
                        SocketChannel socket=(SocketChannel)kk.channel();
                        ByteBuffer by =ByteBuffer.allocate(1024);
                        int a=socket.read(by);
                        //if(a>0) {
                        String receive =new String(by.array());
                        System.out.println(receive);
                        //}
                    }
                    
                    setionkey.clear();
                }
                
            }
            
            
        }
    
    }
    原创打造,多多指教
  • 相关阅读:
    (原)试问那些不劳而获的人?
    (原)资源互换原则
    (原)关于与人沟通时的几个中文语法
    osgviewer读取dxf文件,拣选高亮功能小结
    qt的OSG视图中拣选对象事件消息
    1)OSG与QT单文档视图的结合
    三维渲染引擎设计与实践(八)
    三维渲染引擎设计与实践(七)
    三维渲染引擎设计与实践(六)
    三维渲染引擎设计与实践(五)
  • 原文地址:https://www.cnblogs.com/iscys/p/9742559.html
Copyright © 2011-2022 走看看