java-mina(nio 框架)
mina是对nio的具体实现。是目前比较高效和流行的nio框架了。
客
户端跟服务端建立起来连接,客户端每次想服务端传输一定大小的文件内容。(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();
- //添加filter,codec为序列化方式。这里为对象序列化方式,即表示传递的是对象。
- accept.getFilterChain().addLast("codec",
- new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
- //添加filter,日志信息
- accept.getFilterChain().addLast("logging", new LoggingFilter());
- //设置服务端的handler
- accept.setHandler(new FileUploadHandler());
- //绑定ip
- accept.bind(new InetSocketAddress(PORT));
- System.out.println("upload server started.");
- }
- }
- 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 为传递过程中使用的DO。
- FileUploadRequest request = (FileUploadRequest) message;
- System.out.println(request.getFilename());
- if (out == null) {
- //新建一个文件输入对象BufferedOutputStream,随便定义新文件的位置
- 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);
- //这里是进行文件传输后,要进行flush和close否则传递的文件不完整。
- 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");
- }
- }
- import java.io.Serializable;
- public class FileUploadRequest implements Serializable {
- private String hostname;
- private String filename;
- private byte[] fileContent;
- public String getHostname() {
- return hostname;
- }
- public void setHostname(String hostname) {
- this.hostname = hostname;
- }
- public String getFilename() {
- return filename;
- }
- public void setFilename(String filename) {
- this.filename = filename;
- }
- public byte[] getFileContent() {
- return fileContent;
- }
- public void setFileContent(byte[] fileContent) {
- this.fileContent = fileContent;
- }
- }
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.IOException;
- import java.net.InetSocketAddress;
- import nio.upload.server.FileUploadRequest;
- import org.apache.mina.core.future.ConnectFuture;
- import org.apache.mina.core.session.IoSession;
- 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.NioSocketConnector;
- public class MainClient {
- private static final int PORT = 8080;
- /**
- * @param args
- * @throws IOException
- */
- public static void main(String[] args) throws Exception {
- //客户端的实现
- NioSocketConnector connector = new NioSocketConnector();
- connector.getFilterChain().addLast("codec",
- new ProtocolCodecFilter(new ObjectSerializationCodecFactory()));
- connector.getFilterChain().addLast("logging", new LoggingFilter());
- FileUploadClientHandler h = new FileUploadClientHandler();
- connector.setHandler(h);
- //本句需要加上,否则无法调用下面的readFuture来从session中读取到服务端返回的信息。
- connector.getSessionConfig().setUseReadOperation(true);
- ConnectFuture cf = connector.connect(new InetSocketAddress("localhost",
- PORT));
- IoSession session;
- //等待连接成功
- cf.awaitUninterruptibly();
- session = cf.getSession();
- System.out.println("client send begin");
- //传递文件开始
- String fileName = "test.jpg";
- FileInputStream fis = new FileInputStream(new File(fileName));
- byte[] a = new byte[1024 * 4];
- FileUploadRequest request = new FileUploadRequest();
- request.setFilename(fileName);
- request.setHostname("localhost");
- while (fis.read(a, 0, a.length) != -1) {
- request.setFileContent(a);
- //像session中写入信息供服务端获得
- session.write(request);
- }
- //发送完成的标志
- session.write(new String("finish"));
- System.out.println("client send finished and wait success");
- //接上面来取得服务端的信息
- Object result = session.read().awaitUninterruptibly().getMessage();
- if (result.equals("success")) {
- System.out.println("success!");
- //关闭客户端
- connector.dispose();
- }
- }
- }
- import org.apache.mina.core.service.IoHandlerAdapter;
- import org.apache.mina.core.session.IoSession;
- public class FileUploadClientHandler extends IoHandlerAdapter {
- public void sessionOpened(IoSession session) throws Exception {
- System.out.println("client open");
- }
- public void sessionClosed(IoSession session) throws Exception {
- System.out.println("client session close");
- }
- public void messageReceived(IoSession session, Object message)
- throws Exception {
- System.out.println("thr result is" + message);
- }
- }
java-mina(nio 框架)的更多相关文章
- Java异步NIO框架Netty实现高性能高并发
原文地址:http://blog.csdn.net/opengl_es/article/details/40979371?utm_source=tuicool&utm_medium=refer ...
- 基于Java Mina 通信框架的JT/T809转发服务器设计
Apache MINA 是 Apache 组织的一个开源项目,为开发高性能和高可用性的网络应用程序提供了非常便利的框架. 也是Java开发者的一个福利(.NET目前还没有类似封装的这么好的基础sock ...
- 基于Java Mina框架的部标808服务器设计和开发
在开发部标GPS平台中,部标808GPS服务器是系统的核心关键,决定了部标平台的稳定性和行那个.Linux服务器是首选,为了跨平台,开发语言选择Java自不待言. 我们为客户开发的部标服务器基于Min ...
- 基于Java Mina框架的部标jt808服务器设计和开发
在开发部标GPS平台中,部标jt808GPS服务器是系统的核心关键,决定了部标平台的稳定性和行那个.Linux服务器是首选,为了跨平台,开发语言选择Java自不待言.需要购买jt808GPS服务器源码 ...
- 少啰嗦!一分钟带你读懂Java的NIO和经典IO的区别
1.引言 很多初涉网络编程的程序员,在研究Java NIO(即异步IO)和经典IO(也就是常说的阻塞式IO)的API时,很快就会发现一个问题:我什么时候应该使用经典IO,什么时候应该使用NIO? 在本 ...
- NIO框架Mina学习
前言: 找了篇文章看了看,nio框架数Mina用的最多! 代码: 服务端: package com.mina; import java.net.InetSocketAddress; import ja ...
- 几种Java NIO框架的比较(zz)
问题:生活中工作中,会有人问我javaNIO框架里面 Netty Mina xSocket Grizzly 等等哪个比较好? 在这里写一下自己的感受,也算是总结一下吧 在我的印象中.不管是什么NIO ...
- 关于Java的一些NIO框架的一点想法
闲着有点无聊想写点东西. 问题:生活中工作中,会有人问我javaNIO框架里面 Netty Mina xSocket Grizzly 等等哪个比较好? 在这里写一下自己的感受,也算是总结一下吧 在我 ...
- Getty – Java NIO 框架设计与实现
前言 Getty是我为了学习 Java NIO 所写的一个 NIO 框架,实现过程中参考了 Netty 的设计,同时使用 Groovy 来实现.虽然只是玩具,但是麻雀虽小,五脏俱全,在实现过程中,不仅 ...
- NIO框架之MINA源代码解析(二):mina核心引擎
NIO框架之MINA源代码解析(一):背景 MINA的底层还是利用了jdk提供了nio功能,mina仅仅是对nio进行封装.包含MINA用的线程池都是jdk直接提供的. MINA的server端主要有 ...
随机推荐
- slivelight5和数据库交互
最近开始研究sliverlight和数据库交互了,无奈网上资料较少,查阅了大量资料终于成功了,但是我记得还有别的方法,希望大家讨论一下 数据访问层我的用的是ado.net实体数据模型 然后新建了一个w ...
- html多行注释方法
Html单行:<!-- -->多行:<!-- -->javascript单行://多行:/* */Vbscript单行:'多行:'ASP <% %>中: 单行:' ...
- 从小白进阶ubuntu高手的必经之路—命令
精选的十二个ubuntu下的命令,熟记于心,则能甩掉ubuntu小白标签,高手的伟岸形象焕然生发.一.管理员权限绝大部分情况下,命令的行为须要被赋予管理员权限才能执行.命令 sudo 作用:赋予当前命 ...
- 安装app到Simulator
1.安装brew 打开命令行,执行以下命令: ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install ...
- 在Eclipse中搭建C/C++环境
在Eclipse中搭建C/C++环境 本文地址:http://blog.csdn.net/you_and_me12/article/details/7389934 习惯了使用eclipse编程后,现在 ...
- python学习之--内置函数:
Python内置函数: Python内置了很多有用的函数,我们可以直接调用.要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数. 1. 内置函数调用之--abs()函数: ...
- [原博客] BZOJ 2725 : [Violet 6]故乡的梦
这个题在bzoj上好像是个权限题,想做的可以去Vani的博客下载测试数据.这里有题面. 简单叙述一下题意:给你一个n个点.m条边的带权无向图,S点和T点,询问Q次删一条给定的边的S-T最短路. 其中 ...
- 使用 Python 的 SQLite JSON1 和 FTS5 扩展
早在九月份,编程界出现一个名为 json1.c 的文件,此前这个文件一直在 SQLite 的库里面.还有,笔者也曾总结通过使用新的 json1 扩展来编译 pysqlite 的技巧.但现在随着 SQL ...
- 用PYTHON + PYWIN32 + WMI获取WINDOWS系统基本信息
网上原码,去了DECODE编码的问题. PyScripter这个PYTHON的IDE工具在WIN下表现不错哟. 感觉比SPYDER,ERIC,SUBLEME TEXT3之类的好用呀.. #!/usr/ ...
- 常用模式之Command模式入门
package com.zhao.cmd.a; /** * 客户端调用 * 烧烤摊 * * @author LuZhao * */ public class App { public static v ...