iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >详解Java Socket通信封装MIna框架
  • 535
分享到

详解Java Socket通信封装MIna框架

2024-04-02 19:04:59 535人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

目录核心类各个击破iOServiceioFilterIoHandler总结核心类 IoService :Mina中将服务端和客户端都看成是服务,这里提供统一接口IoService,这

核心类

IoService :Mina中将服务端和客户端都看成是服务,这里提供统一接口IoService,这个接口的作用就是用来处理套接字机制。也正是IoService来监听消息返回消息这些步骤,可以说IoService就是我们Mina中核心

IoProcessor:这个接口在另一个线程上,负责检查是否有数据在通道上读写,也就是说它也拥有自己的Selector,这是与我们使用JAVA NIO 编码时的一个不同之处,通常在JAVA NIO 编码中,我们都是使用一个Selector,也就是不区分IoService与IoProcessor 两个功能接口。另外,IoProcessor 负责调用注册在IoService 上的过滤器,并在过滤器链之后调用IoHandler

IoFilter : 定义了一些拦截器 , 和我们WEB中拦截器一样,用来横向拦截处理一些全局的操作(日志处理,编码处理)。其中我们必须注意的是加解密消息。作为一个好的框架肯定是有默认的拦截器的(TextLineCodecFactory )。默认拦截器可以叫消息强制转换为String类型。毕竟String最通用

IoHandler : 这个是我们处理消息的逻辑,前面的拦截器只是在接受是进行一些验证、翻译的功能。拿到数据之后我们需要做的事情就是在IoHandler中

各个击破

IoService

首先我们已服务端NioSocketAcceptor为列,看看我们的服务类之间的结构依赖关系

IoService是服务的鼻祖,无论在我们看来的服务端还是客户端都得继承它(间接继承)。在IoService中我们会定义我们消息的处理过滤器(上文的拦截器),消息处理的业务类。在上文简介中我们知道,这一步其实是IoProcessor来完成,那么IoProcessor在什么出现呢。比如Mina框架中用来创建服务端类NioSocketAcceptor。他直接继承了AbstractPollingIoAcceptor。而AbstractPollingIoAcceptor类中根据参数创建了我们需要的IoProcessor.从而我们有了IoProcessor就可以执行消息间的通信了。

所以过滤器、处理器实在我们服务启动之前配置好的。一旦启动成功就无法再修改了。我们服务端NioSocketAcceptor通过bind方法就可以绑定到指定端口上。我们这里的绑定实现了多态绑定。我们可以绑定多个服务。



@Override
public final void bind(Iterable<? extends SocketAddress> localAddresses) throws IOException {
    if (isDisposing()) {
        throw new IllegalStateException("The Accpetor disposed is being disposed.");
    }

    if (localAddresses == null) {
        throw new IllegalArgumentException("localAddresses");
    }

    List<SocketAddress> localAddressesCopy = new ArrayList<>();

    for (SocketAddress a : localAddresses) {
        checkAddressType(a);
        localAddressesCopy.add(a);
    }

    if (localAddressesCopy.isEmpty()) {
        throw new IllegalArgumentException("localAddresses is empty.");
    }

    boolean activate = false;
    synchronized (bindLock) {
        synchronized (boundAddresses) {
            if (boundAddresses.isEmpty()) {
                activate = true;
            }
        }

        if (getHandler() == null) {
            throw new IllegalStateException("handler is not set.");
        }

        try {
            Set<SocketAddress> addresses = bindInternal(localAddressesCopy);

            synchronized (boundAddresses) {
                boundAddresses.addAll(addresses);
            }
        } catch (IOException | RuntimeException e) {
            throw e;
        } catch (Exception e) {
            throw new RuntimeIoException("Failed to bind to: " + getLocalAddresses(), e);
        }
    }

    if (activate) {
        getListeners().fireServiceActivated();
    }
}

在上面我们可以看到bind最后是去激活对应的监听器。我们一个IoServer处理一个线程中的消息。我们监听器就是监听线程内的消息。每一次的绑定都会有不同的监听器、ioSession去专门处理消息之间的通信。我们可以通过IoSession设置一些请求数据完成数据的权限验证。

在服务创建的时候我们正常需要设置IoSession的一些配置。通过getSessionConfig方法获取IoSessionConfig。里面设置参数常用如下:

  • setReadBufferSize : 设置读取数据的缓冲区大小
  • setMinReadBufferSize: 设置缓冲区最大值
  • setMaxReadBufferSize: 设置缓冲区最小值
  • setThroughputCalculationInterval: 设置通道计算时间 默认3s
  • setIdleTime(IdleStatus status, int idleTime): status 设置是一方还是双方 , idLetime 是超过多久就会进入空闲状态

IoAcceptor acceptor=new NioSocketAcceptor();    
acceptor.getSessionConfig().setReadBufferSize(2048);    
acceptor.getSessionConfig.setIdleTime(IdleStatus.BOTH_IDLE,10);

IoFilter

在IoService中有获取filter链的一个方法 DefaultIoFilterChainBuilder getFilterChain() , 我们需要做的就是定义过滤器,然后通过该方法获取过滤链加入到请求链上。我们自定义过滤器也很简单,只需要继承IoFilterAdapter这个类就好了。


acceptor.getFilterChain().addLast("codec",  new ProtocolCodecFilter(new TextLineCodecFactory( 
Charset.forName("UTF-8"),LineDelimeter.windows.getValue(),LineDelimiter. WINDOWS.getValue()))    
);    

TextLineCodecFactory 这个类是Mina提供的编解码工厂,这个工厂的特性是以换行符'\r\n'为结束通信的标志。也就是说如果我们传递消息没有换行符,另外一段会继续
接受消息知道接受到'\r\n'才会接受,并把接受到的消息通过编解码器转到IoHandler层供业务层处理。(这里博主被坑在这里了)

IoHandler

到了这一步,我们的通信基本就已经完成了。剩下的事情已经和Mina基本没多大关联了。我们将在这里处理业务逻辑,使用到的就是Handler提供的接收消息和发送消息两个功能。这里我们需要注意的是Handler提供messageReceived和messageSent并不是字面意思。前者就是消息的接受,但是后者并不是消息的发送。我们常用的发送消息是session.write方法。

总结

今天我们了解了Mina工作的流程,主要就是IoFilter和IoHandler实现消息的通信 。 千里之行始于足下,一点一点的进步。下面贴出一份总结的图谱帮助我们理解Mina流程

以上就是详解Java Socket通信封装MIna框架的详细内容,更多关于Java Socket通信封装MIna框架的资料请关注编程网其它相关文章!

--结束END--

本文标题: 详解Java Socket通信封装MIna框架

本文链接: https://www.lsjlt.com/news/127692.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解Java Socket通信封装MIna框架
    目录核心类各个击破IoServiceIoFilterIoHandler总结核心类 IoService :Mina中将服务端和客户端都看成是服务,这里提供统一接口IoService,这...
    99+
    2024-04-02
  • 基于BIO的Java Socket通信详解
    BIO,即阻塞IO,在基于Socket的消息通信过程中,Socket服务端向外部提供服务,而Socket客户端可以建立到Socket服务端的连接,进而发送请求数据,然后等待Socket服务端处理,并返回处理结果(响应)。基于BIO的通信,S...
    99+
    2023-05-30
    bio java socket
  • java通信框架有哪些
    java中的通信框架有:1.MINA,基于TCP和UDP协议栈的通信框架;2.Flask,面向简单需求和小型应用的通信框架;3.QuickServer,免费的开源java库;java中的通信框架有以下几种MINAMINA是一个基于TCP和U...
    99+
    2024-04-02
  • C#基于Socket套接字的网络通信封装
    本文为大家分享了C#基于Socket套接字的网络通信封装代码,供大家参考,具体内容如下 摘要 之所以要进行Socket套接字通信库封装,主要是直接使用套接字进行网络通信编程相对复杂,...
    99+
    2024-04-02
  • 详解Flutter中网络框架dio的二次封装
    其实dio框架已经封装的很好了,但是在实战项目中,为了项目可以统一管理,还是需要对dio框架进行二次封装。 整体思路:一般情况下,后台返回的数据我们可以分为两部分 1.状态数据2.渲...
    99+
    2024-04-02
  • Java框架---Spring详解
    目录一 技术发展二 框架设计Spring Framework 6大模块三 Spring AOP详解AOP两种方式四 Spring Bean核心原理Bean的加载过程五 Spring ...
    99+
    2024-04-02
  • Java使用Socket简单通讯详解
    目录Java实现基于Socket的简单通信 一.ServerSocket1.使用JavaFX写的小界面,方便观察客户端连接情况2.创建ServerSocket并处理客户端连...
    99+
    2024-04-02
  • C#如何实现基于Socket套接字的网络通信封装
    小编给大家分享一下C#如何实现基于Socket套接字的网络通信封装,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!摘要之所以要进行Socket套接字通信库封装,主要...
    99+
    2023-06-21
  • 实时通信Socket io的使用示例详解
    目录引言1、什么是socket.io2、socket.io的使用3、客户端自带事件4、版本问题引言 最近在工作中,遇到了一个需求,需要和后台服务实时通信,获取各种设备的实时状态、以及...
    99+
    2022-11-16
    Socket io实时通信 Socket io
  • Java 封装的使用详解
    目录1. 基本介绍2. 封装介绍3. 封装的理解和好处4. 封装的实现步骤 (三步)5. 快速入门案例6. 将构造器和 setXxx 结合7. 练习1. 基本介绍 面向对象编程有三大...
    99+
    2024-04-02
  • 详解Java基础之封装
    目录Java基础知识(封装)封装封装的目的 封装的好处封装的步骤封装的例子总结Java基础知识(封装) 封装 那封装是什么呢? 在面向对象程式设计方法中,封装(英语:Enc...
    99+
    2024-04-02
  • 高性能跨平台网络通信框架 HP-Socket 5.6.1怎么更新
    今天就跟大家聊聊有关高性能跨平台网络通信框架 HP-Socket 5.6.1怎么更新,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。v5.6.1 更新一、SSL 组件更新所有 SSL ...
    99+
    2023-06-03
  • java缓存框架Caffeine详解
    缓存在日常开发中启动至关重要的作用,基本是存储在内存中,数据的读取速度是非常快的,能大量减少对数据库的访问,减少数据库的压力,本文主要介绍了本地缓存Caffeine基本配置与基本用法,通过阅读本文,你...
    99+
    2023-10-26
    缓存 java
  • Netty框架实现TCP/IP通信的详细过程
    这篇文章主要介绍“Netty框架实现TCP/IP通信的详细过程”,在日常操作中,相信很多人在Netty框架实现TCP/IP通信的详细过程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Netty框架实现TCP/...
    99+
    2023-06-20
  • 详解Java如何通过Socket实现查询IP
    目录背景使用示例应用例子应用服务器获取客户端的IP地址向客户端发送消息测试应用程序建立一个客户端应用程序运行应用程序在后台发生了什么总结在本文中,我们来学习下如何找到连接到服务器的客...
    99+
    2024-04-02
  • Java线程通信之wait-notify通信方式详解
    目录1.线程通信的定义2.为什么需要wait-notify3.wait方法和notify方法1、对象的wait()方法2、对象的notify()方法4.wait方法和notify方法...
    99+
    2024-04-02
  • Java WebService开源框架CXF详解
    目录CXF简介支持多种标准CXF入门案例服务端的实现客户端的实现CXF+Spring整合发布SOAP模式的服务服务端的实现客户端的实现CXF发布REST模式的服务CXF+Spring...
    99+
    2024-04-02
  • Java Executor 框架的实例详解
    Java Executor 框架的实例详解大多数并发都是通过任务执行的方式来实现的。一般有两种方式执行任务:串行和并行。class SingleThreadWebServer { public static void main(String...
    99+
    2023-05-31
    java executor ava
  • Java三大特性之封装详解
    目录封装概述概述原则封装的步骤封装的操作—private关键字private的含义private的使用格式封装优化1—this关键字this的含义this使用...
    99+
    2022-11-13
    Java 特性 封装 Java 封装
  • Java之JSF框架案例详解
    这是一个分为两部分的系列,其中我介绍了JSF 2及其如何适合Java EE生态系统。 在第1部分中,我将介绍JavaServer Pages(JSF)背后的基本思想 ,在第2部分中,...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作