Java——基于java自身包实现消息系统间的通信(TCP/IP+NIO)

简介: /** * Created by LiuHuiChao on 2016/11/15. * description:based on TCP/IP+NIO to deliver the message */public class TCP_IP_NIO { @Test ...


/**
 * Created by LiuHuiChao on 2016/11/15.
 * description:based on TCP/IP+NIO to deliver the message
 */
public class TCP_IP_NIO {

    @Test
    public void clientStart() throws IOException {
        SocketChannel channel=SocketChannel.open();
        channel.configureBlocking(false);//设置为非阻塞方式
        SocketAddress remote=new InetSocketAddress("127.0.0.1",8888);
        channel.connect(remote);
        Selector selector= Selector.open();
        channel.register(selector, SelectionKey.OP_CONNECT);
        /**阻塞至有感兴趣的IO事件发生,或到达超时时间,如果希望一直等至有感兴趣的IO事件发生,可调用无参数select方法,
         * 如果希望不阻塞直接返回目前是否有感兴趣的事件发生,可以调用selectNow方法
         * */
        int nkeys=selector.select();//如果nkeys大于0,说明有感兴趣的IO事件发生
        SelectionKey selectionKey=null;
        if(nkeys>0){
            Set<SelectionKey> keys=selector.selectedKeys();
            for(SelectionKey key : keys){
                //对于发生连接的事件
                if(key.isConnectable()){
                    SocketChannel sc= (SocketChannel) key.channel();
                    sc.configureBlocking(false);
                    /**注册感兴趣的IO读事件,通常不直接注册写事件,在发送缓冲区未满的情况下,一直是可写的,
                     * 因此,如注册了写事件,而又不用写数据,很容易造成CUP消耗100%的情况;
                     * */
                    selectionKey=sc.register(selector,SelectionKey.OP_READ);
                    sc.finishConnect();
                }else if(key.isReadable()){/**有流可读*/
                    ByteBuffer byteBuffer=ByteBuffer.allocate(1024);
                    SocketChannel sc= (SocketChannel) key.channel();
                    int readBytes=0;
                    try{
                        int ret=0;
                        try{
                            /**读取目前可读的流,sc.read返回的为成功复制到bytebuffer中的字节数;
                             * 此步骤为阻塞操作,值可能为0;当已经是流的结尾时,返回-1
                             * */
                            while((ret=sc.read(byteBuffer))>0){
                                readBytes+=ret;
                            }
                        }finally{
                            byteBuffer.flip();
                        }
                    }finally{
                        if(byteBuffer!=null){
                            byteBuffer.clear();
                        }
                    }
                }else if(key.isWritable()){/**可写入流*/
                    //取消对OP_WRITE事件的注册
                    key.interestOps(key.interestOps()&(~selectionKey.OP_WRITE));
                    SocketChannel sc= (SocketChannel) key.channel();
                    /**此步骤为阻塞操作,直到写入操作系统发送缓冲区或网路IO出现异常,返回的为成功写入的字节数,当操作系统的发送缓冲区已满,此处返回0*/
                    ByteBuffer byteBuffer=ByteBuffer.allocate(1024);
                    sc.read(byteBuffer);
                    int writtenedSize=sc.write(byteBuffer);
                    //如未写入,则继续注册感兴趣的OP_WRITE事件
                    if(writtenedSize==0){
                        key.interestOps(key.interestOps() | selectionKey.OP_WRITE);
                    }
                }
            }
            selector.selectedKeys().clear();
        }




    }

    @Test
    public void serverStart() throws IOException {
        ServerSocketChannel ssc=ServerSocketChannel.open();
        ServerSocket serverSocket=ssc.socket();
        //绑定要监听的端口
        serverSocket.bind(new InetSocketAddress(8888));
        ssc.configureBlocking(false);
        Selector selector= Selector.open();
        //注册感兴趣的事件连接
        ssc.register(selector,SelectionKey.OP_ACCEPT);
        /**
         * 之后采取和客户端相同的方式对selector.select进行轮询。。。但是要增加一个key.isAcceptable的处理。。。
         * */


    }
}






目录
相关文章
|
4天前
|
JavaScript Java BI
Java毕设之新生报到系统的设计与实现
Java毕设之新生报到系统的设计与实现
11 3
|
16天前
|
机器学习/深度学习 人工智能 网络协议
TCP/IP五层(或四层)模型,IP和TCP到底在哪层?
TCP/IP五层(或四层)模型,IP和TCP到底在哪层?
28 4
|
1天前
|
数据采集 前端开发 Java
Java医院绩效考核系统源码maven+Visual Studio Code一体化人力资源saas平台系统源码
医院绩效解决方案包括医院绩效管理(BSC)、综合奖金核算(RBRVS),涵盖从绩效方案的咨询与定制、数据采集、绩效考核及反馈、绩效奖金核算到科到组、分配到员工个人全流程绩效管理;将医院、科室、医护人员利益绑定;全面激活人才活力;兼顾质量和效益、长期与短期利益;助力医院降本增效,持续改善、优化收入、成本结构。
4 0
|
1天前
|
Java
排课系统【JSP+Servlet+JavaBean】(Java课设)
排课系统【JSP+Servlet+JavaBean】(Java课设)
13 5
|
2天前
|
存储 Java API
java对接IPFS系统-以nft.storage为列
java对接IPFS系统-以nft.storage为列
11 2
|
2天前
|
监控 前端开发 Java
Java基于B/S医院绩效考核管理平台系统源码 医院智慧绩效管理系统源码
医院绩效考核系统是一个关键的管理工具,旨在评估和优化医院内部各部门、科室和员工的绩效。一个有效的绩效考核系统不仅能帮助医院实现其战略目标,还能提升医疗服务质量,增强患者满意度,并促进员工的专业成长
9 0
|
2天前
|
网络协议 算法 Java
【Java网络编程】网络编程概述、UDP通信(DatagramPacket 与 DatagramSocket)
【Java网络编程】网络编程概述、UDP通信(DatagramPacket 与 DatagramSocket)
15 3
|
2天前
|
Java 云计算
Java智能区域医院云HIS系统SaaS源码
云HIS提供标准化、信息化、可共享的医疗信息管理系统,实现医患事务管理和临床诊疗管理等标准医疗管理信息系统的功能。优化就医、管理流程,提升患者满意度、基层首诊率,通过信息共享、辅助诊疗等手段,提高基层医生的服务能力构建和谐的基层医患关系。
16 2
|
3天前
|
前端开发 Java 关系型数据库
Java医院绩效考核系统源码B/S架构+springboot三级公立医院绩效考核系统源码 医院综合绩效核算系统源码
作为医院用综合绩效核算系统,系统需要和his系统进行对接,按照设定周期,从his系统获取医院科室和医生、护士、其他人员工作量,对没有录入信息化系统的工作量,绩效考核系统设有手工录入功能(可以批量导入),对获取的数据系统按照设定的公式进行汇算,且设置审核机制,可以退回修正,系统功能强大,完全模拟医院实际绩效核算过程,且每步核算都可以进行调整和参数设置,能适应医院多种绩效核算方式。
22 2
|
4天前
|
JavaScript 小程序 Java
基于java的少儿编程网上报名系统
基于java的少儿编程网上报名系统
11 2