Apache Mina 2.0.x 入门 (1)

在pycharm2021.2中学习opencv图像处理,基于python3.9.7、pycharm完成配置 在pycharm中学习opencv图像处理安装python下载python安装包开始安装安装pycharm社区版下载pycharm开始安装如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 安装python 使用pycharm学习opencv应该是最简单的了,对新手比较友好, 阅读详情
Apache Mina ,一个高性能 Java 异步并发网络通讯框架。利用 Mina 可以高效地完成以下任务:
  • TCP/IP 和 UDP/IP 通讯
  • 串口通讯
  • VM 间的管道通讯
  • SSL/TLS
  • JXM 集成
  • IoC 容器集成( Spring 、 Pico 等)
  • 状态机

Mina 的 API 当前主要有三个分支,分别是:

  • 2.0.x 目前处于 SVN trunk 上的版本, Mina 社区对该版本的 API 进行了全新的设计
  • 1.1.x 为当前用于产品开发的版本,适用于 5.0 以上的 JDK ,最新版本为 1.1.5
  • 1.0.x 是 1.1.x 的 JDK 1.4 的兼容版本,最新版本为 1.0.8

这里将要介绍的是 2.0.x 版。虽然当前的稳定版本还是 1.1.x ,但是按照 Mina 团队之前的开发计划, 2.0.x 即将在 08 年夏季正式发布,并且在 2.0.x 中对 Spring 等 IoC 的集成进行了简化,添加了基于 OGNL 的 JMX 远程管理支持,使用基于 Java Annotation 的全新 API 大大简化了状态机编程,新的基于 Apache APR 的基础 I/O 组件促进了进一步的效率提升(据官方评测, APR 的效率较之 Sun NIO 要高出约 10%)。由于这一系列的重大改进,使得 2.0.x 成为十分令人期待的一个版本,无论是 Mina 新手还是老用户,如果你对这个项目抱有兴趣,便很有必要提前对这个版本进行一些了解。

首先让我们对异步 I/O 做一些基本的了解。异步 I/O 模型大体上可以分为两种,反应式( Reactive )模型和前摄式( Proactive )模型:

传统的 select / epoll / kqueue 模型,以及 Java NIO 模型,都是典型的反应式模型,即应用代码对 I/O 描述符进行注册,然后等待 I/O 事件。当某个或某些 I/O 描述符所对应的 I/O 设备上产生 I/O 事件(可读、可写、异常等)时,系统将发出通知,于是应用便有机会进行 I/O 操作并避免阻塞。由于在反应式模型中应用代码需要根据相应的事件类型采取不同的动作,最常见的结构便是嵌套的 if {...} else {...}  或 switch ,并常常需要结合状态机来完成复杂的逻辑。

前摄式模型则恰恰相反。在前摄式模型中,应用代码主动地投递异步操作而不管 I/O 设备当前是否可读或可写。投递的异步 I/O 操作被系统接管,应用代码也并不阻塞在该操作上,而是指定一个回调函数并继续自己的应用逻辑。当该异步操作完成时,系统将发起通知并调用应用代码指定的回调函数。在前摄式模型中,程序逻辑由各个回调函数串联起来:异步操作 A 的回调发起异步操作 B ,B 的回调再发起异步操作 C ,以此往复。 Mina 便是一个前摄式的异步 I/O 框架。

前摄式模型相较于反射式模型往往更加难以编程。然而在具有原生异步 I/O 支持的操作系统中(例如支持 IO Completion Port 的 Win32 系统),采用前摄式模型往往可以取得比反应式模型更佳的效率。在没有原生异步 I/O 支持的系统中,也可以使用传统的反应式 API 对前摄式模型予以模拟。在现代的软硬件系统中,使用 epoll 和 kqueue 的前摄式模型实现同样可以轻松解决 C10K 问题。前摄式模型的一个显著优势是在实现复杂逻辑的时候不需要借助于状态机。因为状态机已经隐含在由回调串联起来的异步操作链当中了。如果上述内容难以理解,可以参考 Boost.Asio ,这是一个相当优秀的跨平台 C++ 前摄式 I/O 模型实现。

当然,对于程序员来说,还是直接看代码来得最为直接: Show me the code! 好,以下我们以官方文档上的一个简单的 TCP Time Server 为示例对 Mina 的基本服务器编程予以剖析。该服务器的功能是监听本地所有接口的 8150 端口,当有客户端连接建立时便向客户端以文本方式发送当前时间,并关闭连接。使用 Time Server 的目的在于

  • 逻辑简单(更甚于 Unix Network Programming 中的 Echo Server ),易于实现
  • 只需实现服务器端代码,客户端可有普通 telnet 程序代替
  • 使用文本协议,可利用 Mina 内置的 TextLineCodecFactory 来作为协议解析器

Time Server 源码分析

以下便是完整的服务端代码,稍后再逐行进行分析:

 1 package test.mina.time.server;
2
3 import java.io.IOException;
4 import java.net.InetSocketAddress;
5 import java.util.Date;
6
7 import org.apache.commons.logging.Log;
8 import org.apache.commons.logging.LogFactory;
9 import org.apache.mina.common.IoAcceptor;
10 import org.apache.mina.common.IoHandlerAdapter;
11 import org.apache.mina.common.IoSession;
12 import org.apache.mina.filter.codec.ProtocolCodecFilter;
13 import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
14 import org.apache.mina.filter.logging.LoggingFilter;
15 import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
16
17 public class TimeServer {
18
19 static Log log = LogFactory.getLog(
TimeServer.class );
20
21 public static void main( final String[] args ) {
22 final IoAcceptor acceptor = new NioSocketAcceptor();
23
24 acceptor.setHandler( new IoHandlerAdapter() {
25
26 @Override
27 public void messageSent( final IoSession session,
28 final Object message )
29 throws Exception {
30 session.close();
31 }
32
33 @Override
34 public void sessionOpened( final IoSession session )
35 throws Exception {
36 session.write( new Date() );
37 }
38
39 } );
40
41 acceptor.getFilterChain().addLast( "codec",
42 new ProtocolCodecFilter( new TextLineCodecFactory() ) );
43 acceptor.getFilterChain().addLast( "logging", new LoggingFilter() );
44
45 try {
46 acceptor.bind( new InetSocketAddress( 8150 ) );
47 }
48 catch( final IOException e ) {
49 log.error( "Bind error: ", e );
50 }
51 }
52
53 }

建立监听器

22         final IoAcceptor acceptor = new NioSocketAcceptor();

在传统服务端编程中,对于一个 TCP 服务器,我们需要先建立一个监听套接字。在 Mina 中,我们创建的并不是一个监听套接字,而是一个监听套接字工厂,或者称之为“监听器( acceptor )”。该概念映射到 Mina API 中,就是 IoAcceptor 接口及其各个实现类。

传统的 BSD Socket API 中的监听套接字以及其在 Java 中的对等物 java.net.ServerSocket 都是套接字工厂,其任务是在某个本地地址上进行监听,并在有客户端连接到来时产生一个与客户端进行通信的套接字。而 Mina  的 IoAcceptor 作为监听套接字的工厂可以接受一个包含多个本地地址的集合, IoAcceptor 会自行针对这个集合中的每个本地地址分别创建监听套接字并进行监听,并且在监听器销毁时进行适当的资源清理。这样便省去了我们建立自行维护多个监听套接字的麻烦。

监听套接字由 IoAcceptor 来接管,那么服务端接受客户端连接后产生的套接字又由谁接管呢?在 Mina 的术语中,一个 TCP 连接被称作一个“会话( session )”,对应的 Mina API 是 IoSession 接口。每当服务端接受一个客户端连接,便会创建出一个新的 IoSession 对象,通过该对象就可以对新建立的 TCP 连接进行各种操作。

在这个示例中,我们选用基于 Java NIO 的监听器实现 NioSocketAcceptor 。之后,每当服务器接受一个客户端连接, IoAccetpor 都会产生一个代表客户端和服务器 TCP 连接的 IoSession 对象。

设置事件回调

24         acceptor.setHandler( new IoHandlerAdapter() {
25
26 @Override
27 public void messageSent( final IoSession session,
28 final Object message )
29 throws Exception {
30 session.close();
31 }
32
33 @Override
34 public void sessionOpened( final IoSession session )
35 throws Exception {
36 session.write( new Date() );
37 }
38
39 } );

然后,我们要让这个 IoAcceptor 创建出的 IoSession 对象知道在各种事件发生时应该如何进行处理。这实际上就是文章开头所描述的反应式模型的应用层接口。只是反应式模型中的事件分支判断部分被 Mina 封装了起来,只暴露出包含了各种事件回调的 IoHandler 接口。可供处理的事件回调包括:

  • sessionCreated(IoSession)

IoSession 对象被创建时的回调,一般用于进行会话初始化操作。注意,与 sessionOpened(IoSession) 回调不同, IoSession 对象的创建并不意味着对应的底层 TCP 连接的建立,而仅仅代表它的字面意思:一个 IoSession 对象被创建出来了。

  • sessionOpened(IoSession)

IoSession 对象被打开时的回调。在 TCP 中,该事件是在 TCP 连接建立时触发的,一般可用于发起连接建立后的握手、认证等操作。

  • sessionClosed(IoSession)

IoSession 对象被关闭时的回调。在 TCP 中,该事件是在 TCP 连接断开时触发的。一般可用于会话资源的清理等操作。

  • sessionIdle(IoSession, IdleStatus)

IoSession 对象超时时的回调。当一个 IoSession 对象在指定的超时时长内没有读写事件发生,就会触发该事件,一般可用于通知服务器断开长时间闲置的连接等处理。具体的超时设置可由 IoService.setWriteIdleTime(int) 、 IoService.setReadIdleTime(int) 和 IoService.setBothIdleTime(int) 设置。

  • messageReceived(IoSession, Object)

当接收到 IoSession 对端发送的数据时的回调。

  • messageSent(IoSession, Object)

当发送给 IoSession 对端的数据发送成功时的回调。

  • exceptionCaught(IoSession, Throwable)

当会话过程中出现异常时的回调。通常用于错误处理。

然而,并非每个应用都对所有这些事件感兴趣,要实现所有这些方法未免繁琐,因此 Mina 提供了抽象类 IoHandlerAdapter ,它实现了各个事件的默认处理——也就是不处理。因此,通常我们只需要继承 IoHandlerAdapter 并覆盖需要处理的事件回调就可以了。在 Timer Server 示例中,回想一下我们设计的功能——当有客户端连接建立时便向客户端以文本方式发送当前时间,并关闭连接。为了实现这个功能,我们需要实现两个事件回调:首先,在 sessionOpened(IoSession) 事件回调中向对端发送当前日期,其次,在 messageSent(IoSession, Object) 事件回调中关闭连接。以上便是第 24 至 39 行所创建的匿名类完成的事情。

需要注意的是 sessionOpened 方法中的这一行:

36                 session.write( new Date() );


这里的 IoSession.write(Object) 方法便是一个异步方法。对该方法的调用并不会阻塞,而是向 Mina 投递了一个异步写操作,并返回一个可用于对已投递异步写操作进行控制的 WriteFuture 对象。例如,通过调用 WriteFuture 的 await 方法或 awaitUninterruptibly() ,我们就可以同步等待该异步操作的完成。

配置过滤器链

41         acceptor.getFilterChain().addLast( "codec",
42 new ProtocolCodecFilter( new TextLineCodecFactory() ) );
43 acceptor.getFilterChain().addLast( "logging", new LoggingFilter() );

接下来,是对过滤器链的配置。过滤器链可以被当作一条两端分别连接服务器和客户端的管道,管道中首尾相接地装上零个或多个过滤器。每个过滤器都可对通过的数据进行任意的操作,包括增加、删除、更新、类型转换等。先装上的过滤器更靠近远程端点(客户端),后装上的更靠近本地端点(服务器)。 41 至 43 行先后向 IoAcceptor 的过滤器链中添加了两个过滤器,分别名为“ codec ”和“ logging ”。后者很好理解,其作用就是对 IoSession 对象上发生的各种事件进行日志记录。而前者就要多费一些口舌来解释了。

协议编解码器

我们知道, TCP 本身只是一个可靠字节流协议, TCP 层面上的二进制数据流不具备任何的边界和结构,只是纯粹的字节流。而在应用层面上,我们在不同通讯节点间处理和交换的——也就是应用构建人员直接关心的——是应用域对象(application domain object)。这就产生了矛盾:应用构建人员需要具有特定类型的域对象来适应具体问题域的需求,而在 TCP 层面,我们手里只有一股股死板的二进制数据流。为了解决这种矛盾,为底层的二进制流赋予个性,向上层应用提供鲜活的域对象,我们就需要将二者互相转换。于是就引入了一对自古以来就繁琐乏味的工作:打包和拆包。

打包,就是将域对象转换为二进制数据包,各个数据包首尾相接,形成二进制数据流;拆包,就是从无包边界的二进制数据流中将数据包一个个拆分出来并转换成相应的域对象。由于 TCP 没有包边界,相对于打包而言,拆包的工作尤其乏味和易错。为了对这些操作进行适度的封装以便重用, Mina 提供了一个有力的工具——协议编解码器( protocol codec )。简而言之,协议编解码器的职责,就是打包和拆包。针对一种类型的域对象,我们需要编写一个编码器( encoder )和一个解码器( decoder ),分别用于打包和拆包。将这对编码器和解码器通过一个 ProtocolCodecFactory 包装起来,就组成了一个协议编解码器。最后,再用一个 ProtocolCodecFilter 将这个协议编解码器包装成一个过滤器,就可以将之插入过滤器链中,来实现二进制 TCP 数据流与应用域对象的自动转换了。

解释完了原理,我们再回到 Time Server 的示例中来。我们的 Time Server 很简单,但是麻雀虽小五脏俱全,这里也同样存在着打包和拆包的问题。首先我们来确定一下域对象。仔细观察一下 24 至 39 行中构造的 IoHandlerAdapter 匿名子类,我们就可以发现,在整个客户端服务器会话过程中,除了 TCP 建立和断开过程中的握手消息以外,唯一的数据 I/O 就是在 sessionOpened(IoSession) 事件回调中由服务器向客户端发送的 Date 对象。但是,为了利用 Mina 本身提供的 TextLineCodecFactory ,我们并不采用 Date 作为域对象类型,而采用 String ,借助于 Date.toString() 方法,这个选择并不会导致什么问题。 TextLineCodecFactory 提供了一套面向字符串文本行的协议编解码器。它将每个传入编码器的字符串作为单独的一行文本打包进 TCP 流,并通过解码器将 TCP 流中的文本以行尾单位转换为 String 对象。这样,就方便地实现了 Time Server 的打包和拆包。

至此,我们已经完成了 Time Server 的大部分编码工作:我们通过 IoAcceptor 创建了监听套接字,为后续将要产生的 IoSession 对象设置了相应的事件回调处理,还配置了过滤器链,并在过滤器链中嵌入了 TextLineCodecFactory 协议编解码器。图 1 描述出了 Time Server 的结构与数据流向:

图 1. Apache Mina 2.0.x Time Server

绑定监听套接字
45         try {
46 acceptor.bind( new InetSocketAddress( 8150 ) );
47 }
48 catch( final IOException e ) {
49 log.error( "Bind error: ", e );
50 }

好了,万事俱备只欠东风。最后,我们只需要打开监听端口,就万事大吉了。上文中我们提到过可以为 IoAcceptor 设置多个监听地址,但这里我们只需要监听通配地址 0.0.0.0 上的 8150 端口就可以了,因此直接在 IoAcceptor.bind(SocketAddress) 中指定该监听地址即可。

IoAcceptor.bind(SocketAddress) 并不仅仅是传统 BSD Socket API 中的 socket / bind / listen / accept 经典操作序列中的 bind ,而是集四者于一身,以达到简化编程的目的。

Run!

编译后,一个热腾腾的 Time Server 就新鲜出炉了!让我们来跑跑看。首先配置一下日志策略,将日志输出指向标准输出, log4j.xml 内容如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" >
3 <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
4 <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
5 <layout class="org.apache.log4j.PatternLayout">
6 <param name="ConversionPattern" value="%p - %c{1} - %m%n" />
7 </layout>
8 </appender>
9 <root>
10 <level value="info" />
11 <appender-ref ref="stdout" />
12 </root>
13 </log4j:configuration>

现在运行服务器,再打开终端,用 telnet 连接服务器:

$ telnet localhost 8150

一切正常的话,将获得类似如下的输出:

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Tue Jan 15 15:50:38 CST 2008
Connection closed by foreign host.

标注出的这行,就是服务器发送过来的当前服务器时间。同时,服务器端将在标准输出上有类似如下的日志输出:

INFO - LoggingFilter - [/127.0.0.1:3080] CREATED
INFO - LoggingFilter - [/127.0.0.1:3080] OPENED
INFO - LoggingFilter - [/127.0.0.1:3080] SENT: Tue Jan 15 15:50:38 CST 2008
INFO - LoggingFilter - [/127.0.0.1:3080] CLOSED

可以看到标注出的与客户端输出对应的日志输出行。

我们还可以做一个小小的改动来详细地看一下协议编解码器的工作过程:将两个过滤器的添加顺序对掉一下。对掉之前,日志过滤器在协议编解码过滤器之上(见图 1 ),因此,在日志中输出的是 Date 对象,更具体的说,是 Date.toString() 的结果。对掉之后,日志过滤器位于协议编解码过滤器之下,我们便可以看到由编码器编码后的日期字符串的字节序列(对应的时间字符串是“ Tue Jan 15 16:34:36 CST 2008 ”):

INFO - LoggingFilter - [/192.168.80.180:60144] CREATED
INFO - LoggingFilter - [/192.168.80.180:60144] OPENED
INFO - LoggingFilter - [/192.168.80.180:60144] SENT: HeapBuffer[pos=0 lim=29 cap=32: 54 75 65 20 4A 61 6E 20 31 35 20 31 36 3A 33 34...]
INFO - LoggingFilter - [/192.168.80.180:60144] SENT: HeapBuffer[pos=0 lim=0 cap=0: empty]
INFO - LoggingFilter - [/192.168.80.180:60144] CLOSED

小结

区区 53 行代码,我们便用 Mina 实现了一个全功能的并发网络时间服务器。值得注意的是,这并不是一个如同 UNP 中的第一个 Echo Server 示例那样的以同步方式串行处理客户端请求的迭代式服务器,而是一个基于 Java NIO 多路复用机制的高性能异步并发服务器。

Time Server 在并发策略上采用的是默认的单线程策略。我们可以通过在过滤器链中插入一个 ExecutorFilter 来启用线程池来完成 IoHandler 中定义的事件回调操作。当在事件处理过程中存在文件 I/O 或数据库操作等耗时较长的同步阻塞操作时,采用多线程的并发策略可以获取更高的并发度。在 Mina 1.1.x 中,除了 ExecutorFilter 的方式,每个 IoService (各种 IoAcceptor 和以后将要介绍的 IoConnector 都是 IoService 的一种)具备一个 ThreadModel 域,可以使用特定的线程模型来制定并发策略。然而这种方式增加了编程的复杂度,因此在 2.0.x 中被去除了。

在后续的文章中,还将对 Mina 的客户端编程、 SSL/TLS 编程以及 Spring 、 JMX 集成等内容进行介绍。

保姆级教程:在Ubuntu 20.04上搞定PX4飞控与T265的视觉定位(附避坑指南) 本文提供在Ubuntu 20.04上配置PX4飞控与T265视觉定位系统的详细教程,涵盖驱动安装、ROS与MAVROS桥接、PX4参数调优及故障排查。通过实测验证的步骤和避坑指南,帮助开发者实现厘米级精度的视觉定位,特别适合室内无人机应用。 阅读详情

相关推荐

基于Java+SpringBoot+Vue的中小企业设备管理系统的设计与开发(源码+lw+部署文档+讲解等)

💗博主介绍:✌新人博主,工作经验两年+、专注于Java、小程序技术领域和毕业项目实战✌💗🌟文末获取源码+数据库🌟

2301_76502068的博客 1383

spring Mina 整合,多端口绑定spring.xml配置

-->                                                                              1000                               1800                                  -->

龙慧空羽 2646

【工具使用】Keil常用的调试操作整理介绍

2、当选择了非0级优化时,调试可能会变得困难,具体表现在断点调试。该按钮是在进入了函数单步调试的时候,有时候你可能不必再执行该函数的剩余部分了,通过该按钮就直接一步执行完函数余下的部分,并跳出函数,回到函数被调用的置。:如果是在C语言窗口中,则是按单条语句执行,与单步调试不同的是,遇到函数不会进入函数内部,而是直接全速运行函数,并跳到下一条语句。但我的Keil软件中无法显示这个视图,并且通过修改系统试图,调试时,点击打开系统视图发生了闪退的现象,目前能想到的原因是:重新安装Keil,安装最新版本。

MEYOU_Cc 不吃香菜! 1万+

MINA 网络库的剖析

MINA  网络库的剖析 一、MINA  概述           Mina是Apache社区维护的一个开源的高性能IO框架,它的底层还是利用了jdk提供了nio功能,mina只是对nio进行封装,包括MINA用的线程池都是jdk直接提供的。 1.1 MINA 的工作流程     Mina的主端由accept、prossser,session 组成其中accept主要负责事件的监听,若有新

Ant_o_Liu的博客 842

从零构建知识图谱:本体工程与知识建模实战指南

本文是一份从零构建知识图谱的实战指南,重点阐述了知识建模与本体工程的核心地位。文章详细介绍了如何使用Protégé工具进行本体设计,包括定义领域、复用现有本体、构建类层次与属性约束,并讲解了如何利用D2RQ工具将关系数据库数据转换为RDF三元组,最终通过Apache Jena Fuseki搭建SPARQL端点进行知识查询与推理,让知识图谱真正“活”起来。

weixin_29057695的博客 570

Java对接快递鸟,查询快递物流信息

根据用户输入的订单号,我们的后台识别订单号并根据快递鸟查询快递API接口,实现自动查询的功能。下面是java版本的根据单号查询物流跟踪信息的详细示例代码。只需要下载就可以运行,(自己需要简单的修改)注:登录快递鸟用户管理后台后获得。登录快递鸟用户管理后台。

Roc的博客 958

Mina IoService讲解及IoAcceptor和IoConnector接口说明

原文地址:Mina IoService介绍(Apache Mina user guide Chapter 3 service) 1.1.1. IoService IoService所处的结构示意图可以从应用架构中查看。基本类支持所有IO 服务操作,无论是服务端还是客户端。它将处理所有与应用程序的交互、与远程对等、发送和接收消息,管理session会话、连接等。 它是一个提供服务端实现IoAcce

纸上得来终觉浅,绝知此事要躬行 5683

详解Agent Skills:让AI拥有更多专业能力(什么是Agent Skills?如何创建?如何使用?如何获取?)

本文分享如何将零散指令沉淀为可复用的 AI 能力模块🧩,介绍什么是Agent Skills?如何创建?如何获取?📚

XiaoqiangClub的博客 1270

mina在spring中的配置多个端口

本次练习中是监听2个端口 applicationContext-mina.xml:   http://www.springframework.org/dtd/spring-beans.dtd ">        class="org.springframework.beans.factory.config.CustomEditorConfigurer">     

血公子的专栏 7105

高频网络协议与编程IO相关面试基本问题和知识点整理

网络IO相关基本高频面试基本问题和知识点整合

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 173万+

微信小程序报错:“errno“:600001,“errMsg“:“uploadFile:fail errcode:-105 cronet_error_code:-105 error_msg:net::

uploadFile:fail errcode:-105 cronet_error_code:-105 error_msg:net::ERR_NAME_NOT_RESOLVED,uniApp微信小程序使用uni.uploadFile出现报错,微信小程序如何解决wx.uploadFile报错,如何解决这个问题,微信小程序真机报错,微信小程序报错"errno":600001,"errMsg":"uploadFile:fail errcode:-105 cronet_error_code:-105 error_m

✅ 精选推荐文章 3827

Apache Mina 2.0.x 入门

<br />Apache Mina ,一个高性能 Java 异步并发网络通讯框架。利用 Mina 可以高效地完成以下任务: <br />TCP/IP 和 UDP/IP 通讯 <br />串口通讯 <br />VM 间的管道通讯 <br />SSL/TLS <br />JXM 集成 <br />IoC 容器集成( Spring 、 Pico 等) <br />状态机<br />Mina 的 API 当前主要有三个分支,分别是:<br />2.0.x 目前处于 SVN trunk 上的版本, Mina 社区对该

卷柏人生 2122

YOLOv11 损失函数解析

YOLOv11 在 YOLO 系列的持续演进中,通过 ​多模态损失协同优化、动态任务感知机制 和 ​超轻量化设计,实现了检测精度与推理效率的再突破。其损失函数设计融合了前沿的几何建模、分布学习与自监督技术,显著提升了复杂场景下的鲁棒性。

浩瀚之水的专栏 6702

Apache Mina 2.x 简易入门解析

最近使用Mina开发一个Java的NIO服务端程序,因此也特意学习了Apache的这个Mina框架。   首先,Mina是个什么东西?看下官方网站(http://mina.apache.org/)对它的解释:   Apache的Mina(Multipurpose Infrastructure Networked Applications)是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网

8387

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Apache MINA 快速入门指南-时间服务器

最近用到Socket套接字编程,在服务器监听方面还没有具体思路,朋友推荐了Apahce Mina,就在官方看了一下快速入门文档。原文是英文的,学习之余就将它翻译出来和大家共享!关于Mina的中文简介内容不多就摘抄了一些。     “MINA是一个Socket的网络框架,但是它提供了方便的Protocol支持,通过它的Encoder和Decoder,你将你的应用可以方便的扩展并支持各种基于S

wjp553650958的专栏 1707

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Apache MINA 快速入门指南

from: http://tianting-wx.iteye.com/blog/265539     “MINA是一个Socket的网络框架,但是它提供了方便的Protocol支持,通过它的Encoder和Decoder,你将你的应用可以方便的扩展并支持各种基于Socket的网络协议,比如HTTP服务器、FTP服务器(当然,这很复杂)、Telnet服务器等等。基于MINA用户可以容易地开发高性...

keke_Xin的专栏 209

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Mina入门

自定义一个Mina的客户端,然后向上一节的Mina服务端发送数据。Mina客户端类:MinaClient.java/*** Mina客户端* * 用例:实现MinaServer的telnet程序**//*** IO会话连接器*//*** IO连接会话*//*** 与Mina服务端建立连接** @return 连接结果*/try {//1-NioSocketAcceptor( IO连接器)//2-设置超时时间。......

应无所住而生其心 1099

Apache-mina学习笔记,非常全都资料,附带大量实例

Apache Mina2 学习笔记             目录 引言. 3 一.    Mina入门. 3 第一步.下载使用的Jar包. 3 第二步.工程创建配置. 4 第三步.服务端程序. 4 第四步.使用telnet命令来测试服务端. 6 第五步.客户端程序. 9 第六步.长连接VS短连接. 11 第七步.入门程序0212 第八步.入门程序

有 prepare , No out 1万+

Apache MINA 从1.x到2.x的一些改变

在Apache MINA 2.x中提供了新的API,并且有一部分不能向前兼容,这主要是一些处理复杂的部分,这里只介绍一下不兼容的内容,因为大部分还是兼容的。1 ThreadModel已经被移除ThreadModel最初是为了简化应用预定义的线程模型到IoService的处理的。然而,配置线程模型因为简单而引入很多构造来,这样其产生的混乱多于其易用性了,所以移除。2 IoService配

sdbany的专栏 1399

mina php,Apache Mina简介

简介Apache MINA是一个网络应用程序框架,用来帮助用户简单地开发高性能和高可靠性的网络应用程序。它提供了一个通过Java NIO在不同的传输例如TCP/IP和UDP/IP上抽象的事件驱动的异步API。MINA虽然简单但是仍然提供了全功能的网络应用程序框架:● 为不同的传输类型提供了统一的API:○ 通过Java NIO提供TCP/IP 和 UDP/IP支持○ 通过RXTX提供串口通讯(RS...

weixin_39669701的博客 156

使用 Apache MINA 2 开发网络应用

Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,是用于开发高性能和高可用性的网络应用程序的基础框架。通过使用MINA框架可以可以省下处理底层I/O和线程并发等复杂工作,开发人员能够把更多的精力投入到业务设计和开发当中。   当前发行的 MINA 版本支持基于 Jav

shuhuai007的专栏 1402
上一篇: 位运算符的一些简单应用
下一篇: 服务器设计之SEDA架构
dankes
博客等级 码龄22年 41粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值