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端主要有 ...
随机推荐
- javascript 写农场迭代
/** * 农场一头小母牛 * 每年生头小母牛 * 母牛五岁产母牛 * 二十年上多少牛 */ 划分程序,母牛只管自己的年龄能不能产牛仔,母牛是model同时也是工厂 农场只管养牛,收获新牛. 一年一个 ...
- PHP程序缓存之文件缓存处理方式
PHP程序缓存之文件缓存处理方式在开发程序过程中,缓存的设置大大提升程序效率,减小数据库负载.基本配置缓存和常规配置缓存 基本配置缓存在项目开发中类似这样子的格式: 文件:config.php $CF ...
- (转载)EhLib 在 Delphi 7 下的安装方法
EhLib 在 Delphi 7 下的安装方法 1.将 EhLib 解压到一个目录,如:E:\VCL\EhLib: 2.将 EhLib 安装目录下 Common 目录.DataService 目录下的 ...
- Python之路----数据类型
Python的集成开发环境(IDE):pycharm 数据类型 数字 整数int(integer) 浮点数float 布尔型,只有两个值 真:True 假:False 字符串 列表 元组 字典 一.字 ...
- Poco库之XML操作
平台ubuntu14.04LTS Poco版本:Poco1.6.1 #include <Poco/DOM/Text.h>#include <Poco/DOM/Element. ...
- 【C语言】37个关键字
C语言37个关键字 一.相关基础知识 年. 关键字:是由系统定义的,不能重新做其他定义的字符,且每个关键字已经赋予了不同的意义,让编程者能够使用来告诉编译器完成不同的工作PS:C语言严格区分大小写,i ...
- 韦东山教程ARM的时钟设置出现的问题及其解决方法
时钟设置是一个非常重要的环节,如果系统没有合适的时钟,根本无法工作. S3C2440的时钟复杂,分为FCLK,HCLK,PCLK. 在程序测试中,曾出现这样一个错误.系统当前FCLK为400 ...
- .net 反射访问私有变量和私有方法
以下为本次实践代码: using System; using System.Collections.Generic; using System.ComponentModel; using System ...
- Kafka Offset Storage
1.概述 目前,Kafka 官网最新版[0.10.1.1],已默认将消费的 offset 迁入到了 Kafka 一个名为 __consumer_offsets 的Topic中.其实,早在 0.8.2. ...
- html 各个标签初始化
html,body,div,ul,li,ol,h1,h2,h3,h4,h5,h6,span,input{ margin:0;padding:0;}body{font:12px/1.5em " ...