标签:style http color io os ar 使用 java sp
mina是对nio的具体实现。是目前比较高效和流行的nio框架了。
下面是对使用mina进行通讯的一个简单demo,后面再用mina写一个RPC的简单框架。
mina主要包括:
(使用的mina版本为2.0.0.M4 core,具体可见
官方网站 )
mina也分服务端和客户端(这是肯定的...)
其中服务端为:NioSocketAcceptor
客户端为:NioSocketConnector
类似于Socket的服务端跟客户端Socket。除了这些用来基本通讯的之外,还有一些可以用来处理通讯中的操作类。就是在客户端和服务端的一个个filter。这些filter可以用来进行解码,编码,可以配置日志信息,可以设定序列化类型,等等。
另外为客户端和服务端都可以绑定一个IoHnadler,用来处理连接session在打开,收到信息,关闭等状态时候可以进行的动作。
现在就来使用mina进行一个简单的客户端上传文件的demo的实现:
demo实现的思想为:
客
户端跟服务端建立起来连接,客户端每次想服务端传输一定大小的文件内容。(byte的方式),然后服务端接收这些byte,将其output出来,形成文
件。客户端发送完毕后,传递一个完毕的标志,这里可以传个字符串”finish“,然后服务器收到这个结束标志,在写文件结束后,再传输个成功的标志给客
户端,(字符串”success“)然后客户端关闭连接。
服务端:
代码比较简单。
- import java.net.InetSocketAddress;
- import org.apache.mina.filter.codec.ProtocolCodecFilter;
- import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
- import org.apache.mina.filter.logging.LoggingFilter;
- import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
-
-
- public class Main {
- private static final int PORT = 8080;
-
- public static void main(String[] args) throws Exception {
-
- NioSocketAcceptor accept=new NioSocketAcceptor();
-
- accept.getFilterChain().addLast("codec",
- new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
-
- accept.getFilterChain().addLast("logging", new LoggingFilter());
-
- accept.setHandler(new FileUploadHandler());
-
- accept.bind(new InetSocketAddress(PORT));
-
- System.out.println("upload server started.");
- }
- }
就这样简单的完成了服务端的实现,其实可以复杂一些,其中的log跟code都可以根据需要自己来写和生成,这里只使用mina自带的。
然后是服务端的handler。
- import java.io.BufferedOutputStream;
- import java.io.File;
- import java.io.FileOutputStream;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import org.apache.mina.core.service.IoHandlerAdapter;
- import org.apache.mina.core.session.IoSession;
-
- public class FileUploadHandler extends IoHandlerAdapter {
-
- private BufferedOutputStream out;
-
- private int count;
-
- private String fileName = "D:/log/test.jpg";
-
- private static final Log log = LogFactory.getLog(FileUploadHandler.class);
-
-
- public void sessionOpened(IoSession session) throws Exception {
- System.out.println("server open");
- }
-
- public void exceptionCaught(IoSession session, Throwable cause)
- throws Exception {
- System.out.println("exception");
- session.close(true);
- super.exceptionCaught(session, cause);
- }
-
- public void messageReceived(IoSession session, Object message) {
- System.out.println("server received");
-
- try {
- if (message instanceof FileUploadRequest) {
-
- FileUploadRequest request = (FileUploadRequest) message;
- System.out.println(request.getFilename());
- if (out == null) {
-
- out = new BufferedOutputStream(new FileOutputStream(
- "D:/log/" + request.getFilename()));
- out.write(request.getFileContent());
- } else {
- out.write(request.getFileContent());
- }
- count += request.getFileContent().length;
-
- } else if (message instanceof String) {
- if (((String)message).equals("finish")) {
- System.out.println("size is"+count);
-
- out.flush();
- out.close();
-
- session.write("success");
- }
- }
-
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- public void sessionClosed(IoSession session) throws Exception {
- System.out.println("server session close");
- }
- }
java-mina(nio 框架)
标签:style http color io os ar 使用 java sp
原文地址:http://www.cnblogs.com/weipeng/p/4042917.html