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端主要有 ...
随机推荐
- ubuntu基本操作(2)
查看当前使用那种 shell echo $SHELL 更换 shell 类型:首先检查是否安装了相应的类型 shell开启终端,直接输入相应的 shell 名称如果没有安装,则先安装,否则直接启动此时 ...
- 截获控制台程序关闭事件(SetConsoleCtrlHandler)
最近控制台程序中需要捕获控制台关闭事件,在用户关闭的时候进行某些操作,找了一大圈发现了一个方法,通过调用WIN32 API SetConsoleCtrlHandler方法来实现,具体代码如下: usi ...
- 由css属性:vertial-align想到的。。
我的笔记本:型号 acer4750G-2412g50mnkk 分辨率:1333*768,点距:0.25933mm; 12px下的font-size: 默认line-height减去font-size: ...
- Presto: 可以处理PB级别数据的分布式SQL查询引擎
2012年秋季Facebook启动了Presto,Presto的目的是在几百PB级别数据量上面进行准实时分析.在摒弃了一些外部项目以后,Facebook准备开发他们自己的分布式查询引擎.Presto的 ...
- 缓存 Cache
Controllers层 public class HomeController : Controller { // // GET: /Home/ // ...
- 如何得到django中form表单里的复选框(多选框)的值( MultipleChoiceField )
直接写代码吧 CHECKBOX_CHOICES = ( ('Value1','Value1'), ('Value2','Value2'), ) class EditProfileForm(ModelF ...
- 前后端差异更小了——浅谈ES(ECMAScript)6
2015年6月,ES6正式发布.至今一年多的时间内,各个浏览器也对支持ES6做出了很大的改善,所以同学们无需顾忌你写代码的浏览器不认识~ 这么久的东西一定早有大神剖析过,今天我们以一个后端菜鸟的视角重 ...
- 一些.net开源项目
强大的插件系统,通过Addin构建成一个功能齐全的.net开发IDE.核心是AddInTree.跟随这个项目开发许多有用的组件,比如功能文本编辑器(ICSharpCode.TextEditor),Sh ...
- 结缘PDO
起因 一直没有注意看数据库相关知识 几个月之前,无意打开如下一段代码: 被人吐槽是N年前的写法.后来也是学习需要,单一mysql已经不合适了.于是上网搜了一下好方法,PDO迎面而来. 诱惑 上网浏览时 ...
- IAR Embedded Workbench 破解方法+工具+授权文件
转自IAR Embedded Workbench 破解方法+工具+授权文件 本文重点阐述了如何手动爆破 IAR EWARM 6.x以及生成License,目的一是和大家分享下,二是自己记录下过程,以便 ...