最近使用 Mina 开发一个 Java 的 NIO 服务端程序,因此也特意学习了 Apache 的这个 Mina 框架。
首先,Mina 是个什么东西?看下官方网站 (http://mina.apache.org/) 对它的解释:
Apache 的 Mina(Multipurpose Infrastructure Networked Applications) 是一个网络应用框架,可以帮助用户开发高性能和高扩展性的网络应用程序;它提供了一个抽象的、事件驱动的异步 API,使 Java NIO 在各种传输协议(如TCP/IP,UDP/IP协议等)下快速高效开发。
Apache Mina也称为:
- NIO框架
- 客户端/服务端框架(典型的C/S架构)
- 网络套接字(networking socket)类库
总之:我们简单理解它是一个封装底层IO操作,提供高级操作API的通讯框架!
(本文所有内容仅针对Mina2.0在TCP/IP协议下的应用开发)
无需解释,大家看上面的注释也许就了解一二了。
注意:创建服务端最主要的就是绑定服务端的消息编码解码过滤器和业务逻辑处理器:
什么是编码与解码哪?大家知道,网络传输的数据都是二进制数据,而我们的程序不可能直接去操作二进制数据;这时候我们就需要来把接收到的字节数组转换为字符串,当然完全可以转换为任何一个java基本数据类型或对象,这就是解码!而编码恰好相反,就是把要传输的字符串转换为字节!
比如上面使用的 Mina 自带的根据文本换行符编解码的 TextLineCodec 过滤器 ------ 指定参数为根据 windows 的换行符编解码,遇到客户端发送来的消息,看到 windows 换行符( )就认为是一个消息了,而发送给客户端的消息,都会在消息末尾添加上 文本换行符;
业务逻辑处理器是 Demo1ServerHandler,看它的具体实现:
自定义的业务逻辑处理器继承了 IoHandlerAdapter 类,它默认覆盖了父类的 7 个方法,其实我们最关心最常用的只有一个方法:messageReceived() ---- 服务端接收到一个消息后进行业务处理的方法;看代码:
接受到客户端信息,并返回给客户端一个日期;如果客户端传递的消息为 bye,就是客户端告诉服务端,可以终止通话了,关闭与客户端的连接。
使用命令行的 telnet 来测试下服务端程序!
2.1 telnet 测试
(1) Windows 下开始菜单 -> 运行 -> 输入 cmd
(2) 输入 telnet 127.0.0.1 3005 回车
(3) 连接成功后,服务端程序的后台会打印如下信息:
(4) telnet 中随便输入一个字符串,回车;则可以看到返回的日期
(5) 输入 bye,回车,提示服务端断开连接
Mina 能做服务端程序,自然也可以做客户端程度啦。最重要的是,客户端程序和服务端程序写法基本一致,很简单的。
和服务端代码极其相似,不同的是服务端是创建 NioSocketAcceptor 对象,而客户端是创建 NioSocketConnector 对象,同样需要添加编码解码过滤器和业务逻辑过滤器;
业务逻辑过滤器代码:
它和服务端的业务逻辑处理类一样,继承了 IoHandlerAdapter 类,因此同样可以覆盖父类的7个方法,同样最关心 messageReceived 方法,这里的处理是接收打印了服务端返回的信息;另一个覆盖的方法是异常信息捕获的方法;
测试服务端与客户端程序!
上面的案例是一个典型的长连接,与长连接相对应的是短连接,比如常说的请求/响应模式(HTTP协议)。客户端向服务端发送一个请求,建立连接后,服务端处理并响应成功,此时就主动断开连接了!
短连接是一个简单而有效的处理方式,也是应用最广的。问题是哪一方先断开连接呢?可以在服务端,也可以在客户端,但是提倡在服务端主动断开;
Mina 的服务端业务逻辑处理类中有一个方法 messageSent,他是在服务端发送信息成功后调用的:
修改后为:
这时候客户端与服务端就是典型的短连接了;再次测试,会发现客户端发送请求,接收成功后就自动关闭了,进程只剩下服务端了!
到此为止,我们已经可以运行一个完整的基于 TCP/IP 协议的应用程序啦!
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/java-jiao-cheng/16611.html