什么是Mina?
Apache MINA is a network application framework which helps users develop high performance and high scalability network applications easily. It provides an abstract event-driven asynchronous API over various transports such as TCP/IP and UDP/IP via Java NIO.
Apache MINA是一个网络应用框架,可以帮助我们开发高性能和高扩展性的网络应用。它通过封装Java NIO提供了一个支持各种传输协议(如:TCP/IP和UDP/IP)的抽象事件驱动异步API。
NIO framework library,
client server framework library, or
a networking socket libraryMina是对Java NIO框架进行了一层封装的Socket库。
Apache MINA comes with many subprojects :
Asyncweb : An HTTP server build on top of MINA asynchronous framework
FtpServer : A FTP server
SSHd : A Java library supporting the SSH protocol
Vysper : An XMPP serverApache MINA自带了许多子项目:
异步http服务
ftp服务
一个支持ssh协议的java库
XMPP服务
Mina框架主页:
https://mina.apache.org/
Mina框架下载地址:
https://mina.apache.org/downloads-mina.html
为什么使用Mina?
传统socket:阻塞式通信
每建立一个Socket连接时,同时创建一个新线程对该Socket进行单独通信(采用阻塞的方式通信)。这种方式具有很高的响应速度,并且控制起来也很简单,在连接数较少的时候非常有效,但是如果对每一个连接都产生一个线程的无疑是对系统资源的一种浪费,如果连接数较多将会出现资源不足的情况。
nio:非阻塞通信
nio设计背后的基石:反应器模式,用于事件多路分离和分派的体系结构模式。
反应器模式的核心功能如下:
将事件多路分用
将事件分派到各自相应的事件处理程序
NIO 的非阻塞 I/O 机制是围绕 选择器和 通道构建的。Channel 类表示服务器和客户机之间的一种通信机制。Selector 类是 Channel 的多路复用器。 Selector 类将传入客户机请求多路分用并将它们分派到各自的请求处理程序。
通道(Channel 类):表示服务器和客户机之间的一种通信机制。
选择器(Selector类):是 Channel 的多路复用器。
Selector 类将传入的客户机请求多路分用并将它们分派到各自的请求处理程序。
简单的来说:NIO是一个基于事件的IO架构。
最基本的思想就是:有事件我通知你,你再去做你的事情。而且NIO的主线程只有一个,不像传统的模型,需要多个线程以应对客户端请求,也减轻了JVM的工作量。
当Channel注册至Selector以后,经典的调用方法如下:nio中取得事件通知,就是在selector的select事件中完成的。在selector事件时有一个线程向操作系统询问,selector中注册的Channel&&SelectionKey的键值对的各种事件是否有发生,如果有则添加到selector的selectedKeys属性Set中去,并返回本次有多少个感兴趣的事情发生。如果发现这个值>0,表示有事件发生,马上迭代selectedKeys中的SelectionKey,根据Key中的表示的事件,来做相应的处理。实际上,这段说明表明了异步socket的核心,即异步socket不过是将多个socket的调度(或者还有他们的线程调度)全部交给操作系统自己去完成,异步的核心Selector,不过是将这些调度收集、分发而已。
参考文章地址:http://lcllcl987.iteye.com/blog/70703
使用Mina框架实现C/S通讯
Mina快速入门
https://mina.apache.org/mina-project/quick-start-guide.html
Mina API文档
https://mina.apache.org/mina-project/apidocs/index.html
在工程中包含以下两个jar
客户端代码
package linchaolong.mina.client;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
// Client Socket
public class Client {
private boolean _isExit = false;
public static void main(String[] args) {
Client client = new Client();
client.start();
}
private void start() {
BufferedReader in = null;
try {
final Socket socket = new Socket("127.0.0.1", 9999);
final BufferedReader reader = new BufferedReader(
new InputStr