`

Mina解析(一)

阅读更多

        Java NIO是相对于传统的IO操作而言的,因为提出了缓冲池等概念,使它的处理数据的效率大大提高;

多线程是并发处理的明智选择。

        为减少系统开销,线程池是并发应用中是经常使用的技术。

        而异步处理机制可以大大缩短每个请求的响应时间。

        Mina2中就大量使用了这三项技术,使得它成为优秀的网络应用框架。(这一章并非描述Mina的实际应用,而是对它的内部处理机制做分析;我们对Mina的解析也只对服务端而言:因为无论是Mina也好,NIO也好,多线程也好,异步处理机制也好,都是解决高并发问题的;高并发却是对服务端而言的!因此,服务端才是重点。)

一.NIO分析

        Mina是一个Java NIO框架,NIO的基本思想是:服务器程序只需要一个线程就能同时负责接收客户的连接、客户发送的数据,以及向各个客户发送响应数据。服务器程序的处理流程如下:

//阻塞
while(一直等待,直到有接收连接就绪事件、读就绪事件或写就绪事件发生){
        if(有客户连接)
                接收客户的连接;  //非阻塞
        if(某个Socket的输入流中有可读数据)
                从输入流中读数据;  //非阻塞
        if(某个Socket的输出流可以写数据)
                向输出流写数据;  //非阻塞
}

        而传统的并发型服务器则是采用多线程的模式响应用户请求的;

//阻塞
while(一直等待){
        if(有客户连接)
                启动新线程,与客户的通信;  //可能会阻塞
}

        但是,无论如何,服务端共同的结构如下:

        a.Read Request;   接受请求

        b.Decode Request; 请求值解码(读)

        c.Process Service;请求处理

        d.Encode Reply;   响应值编码(写)

        e.Send Reply;     发送响应

        是不是感觉太抽象了?OK,我们从传统的IO模式的并发服务器说起。

1.传统阻塞服务器

        传统的服务端一次只能处理一个请求,其他请求需要排队等待;示例如下:

package com.bijian.study.mina.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

import org.apache.log4j.Logger;

/*
 * 服务端只能一次处理一个客户端的请求
 * 多个请求到达后需要排队
 */
public class EchoServer01 {
	
	private Logger logger = Logger.getLogger(EchoServer01.class);

	private int PORT = 3015;

	private ServerSocket serverSocket;

	public EchoServer01() throws IOException {
		// 请求队列最大长度为5
		serverSocket = new ServerSocket(PORT,5);
		logger.info("服务端启动...   端口号:" + PORT);
	}

	public void service() {
		while (true) { 
			Socket socket = null;
			try {
				socket = serverSocket.accept();
				logger.info("一个新的连接到达,地址为:" + socket.getInetAddress() + ":"
						+ socket.getPort());
				// 获得客户端发送信息的输入流
				InputStream socketIn = socket.getInputStream();
				BufferedReader br = new BufferedReader(new InputStreamReader(
						socketIn));
				// 给客户端响应信息的输出流
				OutputStream socketOut = socket.getOutputStream();
				PrintWriter pw = new PrintWriter(socketOut, true);

				String msg = null;
				while ((msg = br.readLine()) != null) {
					logger.info("服务端接受到的信息为:" + msg);
					pw.println("响应信息:" + new Date().toString());// 给客户端一个日期字符串
					if (msg.equals("bye")) {
						logger.info("客户端请求断开");
						break;
					}
				}
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				try {
					if (socket != null)
						socket.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public static void main(String args[]) throws IOException {
		new EchoServer01().service();
	}
}

        代码就不解释啦,直接看注释吧,没有任何玄妙的地方。我们先用telnet做测试。

a.启动服务端

2016-02-18 23:02:22,832 INFO  EchoServer01  - 服务端启动...   端口号:3015
b.启动,cmd,telnet 127.0.0.1 3015,回车

c.测试,客户端输入

        服务端响应:

2016-02-18 23:04:09,984 INFO  EchoServer01  - 服务端启动...   端口号:3015
2016-02-18 23:04:24,049 INFO  EchoServer01  - 一个新的连接到达,地址为:/127.0.0.1:51937
2016-02-18 23:04:26,907 INFO  EchoServer01  - 服务端接受到的信息为:bijian
2016-02-18 23:04:30,463 INFO  EchoServer01  - 服务端接受到的信息为:test
2016-02-18 23:04:38,055 INFO  EchoServer01  - 服务端接受到的信息为:123
2016-02-18 23:04:39,569 INFO  EchoServer01  - 服务端接受到的信息为:sfas
2016-02-18 23:04:43,409 INFO  EchoServer01  - 服务端接受到的信息为:bye
2016-02-18 23:04:43,409 INFO  EchoServer01  - 客户端请求断开
2016-02-18 23:06:19,021 INFO  EchoServer01  - 一个新的连接到达,地址为:/127.0.0.1:51941
d.使用客户端代码做测试;EchoClient01.java代码如下:
package com.bijian.study.mina.client;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

import org.apache.log4j.Logger;

/*
 * 使用Socket创建客户端请求
 */
public class EchoClient01 {
	
	private Logger logger = Logger.getLogger(EchoClient01.class);

	private String HOST = "localhost";

	private int PORT = 3015;

	private Socket socket;

	public EchoClient01() throws IOException {
		socket = new Socket(HOST, PORT);
	}

	public void talk() throws IOException {
		try {
			// 获得服务端响应信息的输入流
			InputStream socketIn = socket.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(
					socketIn));
			// 给服务端发送信息的输出流
			OutputStream socketOut = socket.getOutputStream();
			PrintWriter pw = new PrintWriter(socketOut, true);
			BufferedReader localReader = new BufferedReader(
					new InputStreamReader(System.in));
			String msg = null;
			while ((msg = localReader.readLine()) != null) {
				pw.println(msg);
				logger.info(br.readLine());
				if (msg.equals("bye"))
					break;
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String args[]) throws IOException {
		new EchoClient01().talk();
	}
}
        先启动服务端,再启动客户端,输入,客户端输出如下:
aaa
2016-02-18 23:30:46,203 INFO  EchoClient01  - response info:Thu Feb 18 23:30:46 CST 2016
bbb
2016-02-18 23:30:47,689 INFO  EchoClient01  - response info:Thu Feb 18 23:30:47 CST 2016
ccc
2016-02-18 23:30:48,783 INFO  EchoClient01  - response info:Thu Feb 18 23:30:48 CST 2016
bye
2016-02-18 23:30:50,361 INFO  EchoClient01  - response info:Thu Feb 18 23:30:50 CST 2016
"bijian" Sid: S-1-5-21-3389202862-2257394754-1792823341-1001
        服务端输出如下:
2016-02-18 23:30:33,401 INFO  EchoServer01  - 服务端启动...   端口号:3015
2016-02-18 23:30:39,045 INFO  EchoServer01  - 一个新的连接到达,地址为:/127.0.0.1:52081
2016-02-18 23:30:46,188 INFO  EchoServer01  - 服务端接受到的信息为:aaa
2016-02-18 23:30:47,689 INFO  EchoServer01  - 服务端接受到的信息为:bbb
2016-02-18 23:30:48,783 INFO  EchoServer01  - 服务端接受到的信息为:ccc
2016-02-18 23:30:50,345 INFO  EchoServer01  - 服务端接受到的信息为:bye
2016-02-18 23:30:50,361 INFO  EchoServer01  - 客户端请求断开
        测试吧无疑是通过的,但是有两个问题出现了:
        a. 当前服务端一下只能处理一个请求;我靠,这还是服务器吗?做web开发的人肯定有这样的想法。
        b. 服务端的请求队列最多只有是5个,也就是一下能连6个请求(1个处理,5个等待),第7个请求到达后会被拒绝。

        注意看,第7个客户端请求是无法成功的,异常信息如下:
Exception in thread "main" java.net.ConnectException: Connection refused: connect
	at java.net.DualStackPlainSocketImpl.connect0(Native Method)
	at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
	at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
	at java.net.Socket.connect(Socket.java:589)
	at java.net.Socket.connect(Socket.java:538)
	at java.net.Socket.<init>(Socket.java:434)
	at java.net.Socket.<init>(Socket.java:211)
	at com.bijian.study.mina.client.EchoClient01.<init>(EchoClient01.java:27)
	at com.bijian.study.mina.client.EchoClient01.main(EchoClient01.java:60)
"bijian" Sid: S-1-5-21-3389202862-2257394754-1792823341-1001
        异常提示也很明确:拒绝连接!因为我们在服务端建立时做了请求队列最大长度的限制。
public EchoServer01() throws IOException {
	// 请求队列最大长度为5
	serverSocket = new ServerSocket(PORT,5);
	logger.info("服务端启动...   端口号:" + PORT);
}
        c.服务端容易阻塞;最显著的阻塞是IO操作,比如客户端与服务端建立连接后,向服务端发送一条消息,客户端因为人为操作很久没有输入结束;此时其他的连接只好等待在队列中。
        这样的服务端我们称之为传统阻塞服务端,大凡Socket的入门示例都是这样的;但是,在实际的生产应用环境中用的非常少(注意:并不是不用哦,在特殊的环境是还是可以使用的,比如手机终端,你接听电话肯定只能一下接受一个请求,其他如短信接收,是要排队等待的)。
 
2.多线程阻塞服务器
        在实际的应用开发中,我们更多采用的是多线程阻塞服务器,即每一个客户端请求到达,就建立一个线程单独的处理它与服务端的通信,如下图所示:

        好处就是可以并发处理每一个到达的请求!服务端代码如下:
package com.bijian.study.mina.server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import org.apache.log4j.Logger;

import com.bijian.study.mina.handler.Server02Handler;

/*
 * 为每个客户端分配一个线程
 * 服务器的主线程负责接收客户的连接
 * 每次接收到一个客户连接,就会创建一个工作线程,由它负责与客户的通信
 */
public class EchoServer02 {
	
	private Logger logger = Logger.getLogger(EchoServer02.class);

	private int PORT = 3015;

	private ServerSocket serverSocket;

	public EchoServer02() throws IOException {
		serverSocket = new ServerSocket(PORT);
		logger.info("服务器端启动....   端口号:" + PORT);
	}

	public void service() {
		while (true) {
			Socket socket = null;
			try {
				socket = serverSocket.accept(); // 请求到达
				Thread workThread = new Thread(new Server02Handler(socket)); // 创建线程
				workThread.start(); // 启动线程
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String args[]) throws IOException {
		new EchoServer02().service();
	}
}
        很明显,每到达一个请求,就交给一个线程单独的处理;处理方法如下:
package com.bijian.study.mina.handler;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Date;

import org.apache.log4j.Logger;

public class Server02Handler implements Runnable {
	
	private Logger logger = Logger.getLogger(Server02Handler.class);

	private Socket socket;

	public Server02Handler(Socket socket) {
		this.socket = socket;
	}

	public void run() {
		try {
			logger.info("一个新的请求达到并创建  " + socket.getInetAddress() + ":"
					+ socket.getPort());
			InputStream socketIn = socket.getInputStream();
			BufferedReader br = new BufferedReader(new InputStreamReader(
					socketIn));
			OutputStream socketOut = socket.getOutputStream();
			PrintWriter pw = new PrintWriter(socketOut, true);

			String msg = null;
			while ((msg = br.readLine()) != null) {
				logger.info("服务端受到的信息为:" + msg);
				pw.println(new Date()); // 给客户端响应日期字符串
				if (msg.equals("bye"))
					break;
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (socket != null)
					socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

        启动服务端,使用EchoClient01客户端测试成功!

虽然它没有了传统阻塞服务端的单处理弊端,但是却有一个致命的危险存在:大量请求到达时,不断的创建线程,很容易耗尽系统资源造成服务器崩溃;而且每个线程的创建与销毁都很浪费资源。

解决的办法就是使用线程池!(是不是很熟悉?我们经常接触的数据库连接池就是这样实现的。)

        服务端代码如下:

package com.bijian.study.mina.server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import org.apache.log4j.Logger;

import com.bijian.study.mina.handler.Server02Handler;
import com.bijian.study.mina.pool.ThreadPool;

/*
 * 自定义线程池
 * 多线程处理客户端请求
 */
public class EchoServer03 {
	
	private Logger logger = Logger.getLogger(EchoServer03.class);

	private int PORT = 3015;

	private ServerSocket serverSocket;

	private ThreadPool threadPool; // 线程池

	private final int POOL_SIZE = 4; // 单个CPU时线程池中的工作线程个数

	public EchoServer03() throws IOException {
		serverSocket = new ServerSocket(PORT);
		// 创建线程池
		// Runtime的availableProcessors()方法返回当前系统的CPU格式
		// 系统的CPU越多,线程池中工作线程的数目也越多
		threadPool = new ThreadPool(Runtime.getRuntime().availableProcessors()
				* POOL_SIZE);
		logger.info("服务端启动....    端口号:" + PORT);
	}

	public void service() {
		while (true) {
			Socket socket = null;
			try {
				socket = serverSocket.accept();
				// 把与客户通信的任务交给线程池
				threadPool.execute(new Server02Handler(socket));
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String args[]) throws IOException {
		new EchoServer03().service();
	}
}

        服务端没有什么可解释的地方,关键是线程池的实现代码:

package com.bijian.study.mina.pool;

import java.util.LinkedList;

import org.apache.log4j.Logger;

/*
 * 自定义线程池
 */
public class ThreadPool extends ThreadGroup {
	
	private Logger logger = Logger.getLogger(ThreadPool.class);

	private boolean isClosed = false; // 线程池是否关闭

	// 将任务放在LinkedList中,LinkedList不支持同步,
	// 所以在添加任务和获取任务的方法声明中必须使用synchronized关键字
	private LinkedList<Runnable> workQueue;// 表示工作队列

	private static int threadPoolID; // 表示线程池ID

	private int threadID; // 表示工作线程ID

	// 构建一个线程组
	public ThreadPool(int poolSize) { // poolSize是指线程池中工作线程的数目
		super("ThreadPool-" + (threadPoolID++)); // 线程组名
		setDaemon(true);
		workQueue = new LinkedList<Runnable>();// 创建工作队列
		for (int i = 0; i < poolSize; i++)
			new WorkThread().start(); // 创建并启动工作线程(如果工作队列为空,则所有工作线程处于阻塞状态)
	}

	// 向工作队列中添加一个任务,由工作线程去执行该任务
	public synchronized void execute(Runnable task) {
		if (isClosed) { // 线程池关闭则抛出IllegalStateException异常
			throw new IllegalStateException();
		}
		if (task != null) {
			workQueue.add(task);
			notify(); // 唤醒正在getTask()方法中等待任务的工作线程
		}
	}

	// 从工作队列中取出一个任务 ----工作线程会调用此方法
	protected synchronized Runnable getTask() throws InterruptedException {
		while (workQueue.size() == 0) {
			if (isClosed)
				return null;
			wait(); // 如果工作队列没有任务,就等待任务
		}
		return workQueue.removeFirst();
	}

	// 关闭线程池
	public synchronized void close() {
		if (!isClosed) {
			isClosed = true;
			workQueue.clear(); // 清空工作队列
			interrupt();// 中断所有工作线程,该方法继承自ThreadGroup类
		}
	}

	// 等待工作线程把所有任务执行完
	public void join() {
		synchronized (this) {
			isClosed = true;
			notifyAll(); // 唤醒还在getTask()方法中等待任务的工作线程
		}
		// activeCount()方法是ThreadGroup类的,获得线程组中当前所有活着的工作线程数目
		Thread[] threads = new Thread[activeCount()];
		// enumerate方法继承自ThreadGroup类,获得线程组中当前所有活着的工作线程
		int count = enumerate(threads);
		for (int i = 0; i < count; i++) {// 等待所有工作线程运行结束
			try {
				threads[i].join(); // 等待工作线程运行结束
			} catch (InterruptedException ex) {
				logger.error("工作线程出错...", ex);
			}
		}
	}

	// 内部类,工作线程
	private class WorkThread extends Thread {
		public WorkThread() {
			// 加入当前的ThreadPool线程组中
			// Thread(ThreadGroup group, String name)
			super(ThreadPool.this, "WorkThread-" + (threadID++));
		}

		public void run() {
			// isInterrupted()方法继承自ThreadGroup类,判断线程是否中断
			while (!isInterrupted()) {
				Runnable task = null;
				try {
					task = getTask(); // 得到任务
				} catch (InterruptedException ex) {
					logger.error("获得任务异常...", ex);
				}
				// 如果getTask()返回null或者线程执行getTask()时被中断,则结束此线程
				if (task == null)
					return;

				try {
					// 运行任务,捕获异常
					task.run(); // 直接调用task的run方法
				} catch (Throwable t) {
					logger.error("任务执行异常...", t);
				}
			}// #while end
		}// #run end
	}// # WorkThread class end
}

        启动服务端,使用EchoClient01客户端测试成功!

很多的服务端程序的实现思想就是基于该理念!

 

3.使用JDK自带线程池的阻塞服务器

        上面那个多线程阻塞服务器使用的是自定义的线程池,但是它的代码可能不是很健壮,在更多的实际开发应用中,我们都是使用JDK自带的线程池的。java.util.concurrent包提供了现成的线程池的实现。


        a.Executor接口表示线程池,它的execute(Runnable task)方法用来执行Runnable类型的任务。Executor的子接口

        b.ExecutorService中声明了管理线程池的一些方法,比如用于关闭线程池的shutdown()方法等。

        c.Executors类中包含一些静态方法,它们负责生成各种类型的线程池ExecutorService实例。

        我们现在使用它来实现一个多线程阻塞服务器,服务端代码如下:

package com.bijian.study.mina.server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.apache.log4j.Logger;

import com.bijian.study.mina.handler.Server02Handler;

/*
 * 使用JDK自带的线程池ExecutorService
 * 多线程处理客户端请求
 */
public class EchoServer04 {
	
	private Logger logger = Logger.getLogger(EchoServer04.class);

	private int PORT = 3015;

	private ServerSocket serverSocket;

	private ExecutorService executorService; // 线程池

	private final int POOL_SIZE = 4; // 单个CPU时线程池中的工作线程个数

	public EchoServer04() throws IOException {
		serverSocket = new ServerSocket(PORT);
		// 创建线程池
		// Runtime的availableProcessors()方法返回当前系统的CPU格式
		// 系统的CPU越多,线程池中工作线程的数目也越多
		executorService = Executors.newFixedThreadPool(Runtime.getRuntime()
				.availableProcessors()
				* POOL_SIZE);
		logger.info("服务端启动....    端口号:" + PORT);
	}

	public void service() {
		while (true) {
			Socket socket = null;
			try {
				socket = serverSocket.accept();
				executorService.execute(new Server02Handler(socket));
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String args[]) throws IOException {
		new EchoServer04().service();
	}
}

        怎么样,代码很简单吧!启动服务端,使用EchoClient01.java客户端测试成功!

        使用线程池时需要遵循以下原则:

        (1)如果任务A在执行过程中需要同步等待任务B的执行结果,那么任务A不适合加入到线程池的工作队列中。

        (2)如果执行某个任务时可能会阻塞,并且是长时间的阻塞,则应该设定超时时间,避免工作线程永久的阻塞下去而导致线程泄漏。

        (3)根据任务的特点,对任务进行分类,然后把不同类型的任务分别加入到不同线程池的工作队列中,这样可以根据任务的特点,分别调整每个线程池。

        (4)调整线程池的大小。线程池的最佳大小主要取决于系统的可用CPU的数目以及工作队列中任务的特点。

        (5)避免任务过载。

        现在基本上可以解决并发处理客户端的问题啦。但是它依然存在不足:

        (1)并发量激增的情况下,一台服务器很难应付海量的多并发;这就需要提高服务器并发处理能力和服务器个数;常见的解决方案是集群。

        (2)服务器的好坏有两个取决因素:一个是并发能力,一个是响应速度;在并发能力有保障的情况下,每个工作线程,大部分的处理时间都浪费在IO操作上,因为CPU的处理能力比IO快太多,而IO却存在太多的局限因素,造成线程阻塞在IO操作上,大大降低了响应速度;而且会造成资源的浪费,就好比两个同学,一个负责烧水,一个负责挑水,烧水的人一直守在炉子前等待水开,一个却一直挑水;虽然烧水的人可以腾出时间帮助挑水的人,但是他却不能这样做,因为他固定的只能负责一个任务。

        对于高并发,我们很有必要提高IO的操作效率,同时也应该改善我们处理每个任务的原则,提高CPU的利用率;Java NIO就是解决方案。

 

学习资料:http://wenku.baidu.com/link?url=VyKQnsn4b0BDJ8cQlLUu9cvpGz-Iou_499U4lJE9I0s5nPPY5kF5BDd8qo1yRMOiqsM8wxDPEL_S0koiFp8v5y36G9OGJydC2C12juo0bTW

  • 大小: 20.2 KB
  • 大小: 19.1 KB
  • 大小: 31.3 KB
  • 大小: 12.8 KB
  • 大小: 31.4 KB
分享到:
评论

相关推荐

    Mina解析(二)

    《Mina解析(二)——深入理解Apache Mina框架》 Apache Mina是一个高度可扩展的网络通信框架,常用于构建高性能、高并发的服务端应用,尤其在处理TCP/IP、UDP等协议时表现出色。本篇文章将深入探讨Mina的核心概念...

    Mina 2.0快速入门与源码解析

    ### Mina 2.0快速入门与源码解析 #### Mina 2.0 快速入门 Mina 2.0 是一个基于Java NIO技术的高效、可伸缩的网络通信框架,广泛应用于服务器端开发。Mina 2.0 的设计目标是为开发者提供一个易于使用的API,使得...

    springboot整合mina

    SpringBoot整合Mina是一个常见的Java开发任务,它涉及到SpringBoot框架与Apache Mina网络通信库的集成。Mina是一个轻量级、高性能的网络应用框架,主要用于构建服务器端的网络应用,如TCP/IP和UDP协议的服务。而...

    Mina源码解析

    Apache Mina是一个开源的网络通信框架,主要用于构建高性能、高可用性的网络应用程序。它提供了高度模块化的设计,允许开发者以简单的方式处理各种网络协议,如TCP/IP、UDP/IP以及SSL/TLS等。在深入解析Mina源码的...

    mina的高级使用,mina文件图片传送,mina发送文件,mina报文处理,mina发送xml和json

    Apache Mina是一个开源的网络通信应用框架,主要应用于Java平台,它为高性能、高可用性的网络应用程序提供了基础架构。在本文中,我们将深入探讨Mina的高级使用,特别是在文件图片传送、文件发送、XML和JSON报文处理...

    Mina 框架源码解析-构建简单通信程序

    本篇文章将深入解析Mina框架的源码,通过构建一个简单的心跳通信程序,来理解其核心机制。 首先,我们来看一下心跳通信的基本概念。在分布式系统中,心跳机制是保持连接状态和检测网络故障的重要手段。心跳包是周期...

    java-mina通信框架详解.docx

    Apache Mina是一个强大的网络通信框架,专为基于TCP/IP和UDP/IP协议栈的应用设计。它提供了JAVA对象的序列化和虚拟机内部通信的功能,使得开发者能够迅速构建高性能、高可扩展性的网络应用。Mina的核心特性是其事件...

    Apache mina源代码框架解析

    Apache Mina是一个用Java编写的网络通信框架,它简化了创建高性能、高可用性的网络服务的过程。Mina的核心思想是提供一个与传输层协议无关的API,使得开发者可以专注于业务逻辑,而不需要关心底层的网络通信细节。在...

    MINA_API+MINA_DOC+mina

    MINA (Java IO Network Application Framework) 是一个由Apache软件基金会开发的开源网络通信框架,主要应用于构建高性能、高可用性的网络服务器。这个压缩包包含了MINA API文档、自学手册以及开发指南,对于学习和...

    Android平台MINA框架使用详细解析

    在Android平台上,MINA(Java Miniature Network Application Framework)是一个高度可扩展的网络应用程序框架,主要用作构建高性能、高效率的服务端和客户端应用程序。它提供了丰富的网络通信API,支持TCP/IP和UDP/...

    mina demo mina jar包

    Apache Mina是一个开源项目,它提供了一个高度可扩展的网络通信框架,用于简化开发高性能、高可用性的网络服务器和客户端应用程序。"Mina demo mina jar包"指的是使用Apache Mina框架创建的一个演示示例,这个示例...

    mina自定义编解码器详解

    本文将深入探讨mina编解码器的工作原理,提供一个典型编解码器的示例,并解析其代码。 1. **mina框架基础** - Mina提供了一个高效的、事件驱动的网络应用程序框架,简化了网络编程,尤其是TCP和UDP通信。 - 它...

    mina.zip内涵所有mina所需jar包

    Apache Mina是一个高度可扩展的Java网络通信框架,它提供了简单而强大的开发接口,用于创建高性能、高效率的网络应用程序。Mina的核心理念是将网络协议处理与业务逻辑分离,使得开发者可以专注于实现应用程序的业务...

    给予mina 协议进行大数据传输

    标题中的“给予mina协议进行大数据传输”指的是一种基于Java的网络通信框架——Apache MINA(Model-View-Controller for Network Applications)。MINA是Apache软件基金会的一个项目,它提供了一个高度可扩展和高...

    springboot 深度整合mina开箱即用

    Mina框架解析** Mina(Minimal Asynchronous Network Library)是Apache软件基金会的一个开源项目,它提供了一个简单、高性能的API来处理网络通信。Mina支持多种协议,如TCP、UDP、HTTP、FTP等,可以用于构建服务器...

    Mina客户端服务器Demo

    **Mina客户端服务器Demo**是基于Apache Mina框架的一个示例项目,主要展示了如何使用Mina进行网络通信的开发。Apache Mina是一个高度可扩展且轻量级的Java框架,主要用于构建高性能、高效率的网络应用程序,如TCP/IP...

    Mina开发实例(服务端、客户端)DEMO

    此外,Mina支持多种编码和解码器,如LineDelimiterFilter(按行分割数据)、ProtobufDecoder(解析Google Protobuf格式数据)等。在实际应用中,根据数据格式选择合适的过滤器,可以有效地处理网络传输中的数据。 ...

    mina2学习笔记

    #### 三、Mina解析 ##### 3.1 NIO分析 - 分析了从传统的阻塞式服务器到多线程阻塞服务器,再到基于NIO的非阻塞服务器的演变过程,以及多线程的NIO服务器的实现方式。 - 强调了NIO相对于传统IO的优势,如更高的并发...

    mina HTTP协议实例

    Apache MINA(Multipurpose Infrastructure for Network Applications)是一个Java框架,它提供了高度可扩展的、高性能的网络应用程序开发工具。本文将深入探讨如何使用MINA实现HTTP协议,以及相关的源码分析和实用...

    mina和protobuf整合教程

    在Java开发领域,MINA(Multi-purpose Infrastructure for Network Applications)是一个功能强大的网络应用框架,而Protocol Buffers是Google推出的一种高效的数据序列化协议。这两者的整合可以为开发者提供高性能...

Global site tag (gtag.js) - Google Analytics