您的位置:首页 > 编程语言

关于mina的文件上传代码示例

2014-06-12 23:26 363 查看
http://it.chinawin.net/softwaredev/article-1a111.html

mina传输对象已经不是什么难事,一般啃半天代码就能搞定,但是传输文件似乎不是很容易,之前在论坛上求助过但是没有解决,还是靠自己啃代码解决了文件的上传和下载,以下只是随便测试写的代码供学习用(只是有很多朋友发邮件求代码思路这里我也就公布了,之前一直没有办法上网实在不好意思之前发邮件到qyhdt@sina.com邮箱求解的朋友们,我在这里给你们答案了实在不好意思),希望与大家一起探讨mina更多的强大功能。对于mina我也是个初学者。

首先我们创建一个上传下载公共文件流线程类

package com.rose.common.frame.mina;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

/**
* 用于mina 服务器上传下载

* 流处理线程公共类

* @author qiuy

*
*/
public class IoStreamThreadWork extends Thread{

public static final int BUFFER_SIZE = 1024*2;

private BufferedInputStream bis;

private BufferedOutputStream bos;

public BufferedInputStream getBis() {

return bis;

}
public void setBis(BufferedInputStream bis) {

this.bis = bis;

}
public BufferedOutputStream getBos() {

return bos;

}
public void setBos(BufferedOutputStream bos) {

this.bos = bos;

}
public IoStreamThreadWork(InputStream in, OutputStream os){

bis = new BufferedInputStream(in);

bos = new BufferedOutputStream(os);

}
public synchronized void run() {

byte[] bufferByte = new byte[BUFFER_SIZE];

int tempData = 0;

try {
while((tempData = bis.read(bufferByte)) != -1 ){

bos.write(bufferByte, 0, tempData);

}
try {
bos.flush();

} catch (IOException e) {

e.printStackTrace();

}
} catch (IOException e) {

e.printStackTrace();

}finally{

try {
bos.close();

bis.close();

} catch (IOException e) {

e.printStackTrace();

}
}
}
}


写一个服务器端

package com.rose.common.frame.mina;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.InetSocketAddress;

import java.util.concurrent.ArrayBlockingQueue;

import java.util.concurrent.ThreadPoolExecutor;

import java.util.concurrent.TimeUnit;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;

import org.apache.mina.core.session.IoSession;

import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;

import org.apache.mina.filter.logging.LoggingFilter;

import org.apache.mina.handler.stream.StreamIoHandler;

import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

/**
* @author qiuy

* 文件传输服务器

*/
public class MinaFileServer extends StreamIoHandler{

public static final int PORT = 8888;

@Override

public void sessionOpened(IoSession session) {

System.out.println("客户端连接了:"+session.getRemoteAddress());

super.sessionOpened(session);

}
protected void processStreamIo(IoSession session, InputStream in,OutputStream out) {

//设定一个线程池

//参数说明:最少数量3,最大数量6 空闲时间 3秒

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(3, 6, 3,TimeUnit.SECONDS,

//缓冲队列为3
new ArrayBlockingQueue<Runnable>(3),

//抛弃旧的任务
new ThreadPoolExecutor.DiscardOldestPolicy());

FileOutputStream fos = null;

File receiveFile = new File("e:\\test.pdf");

try {
fos = new FileOutputStream(receiveFile);

} catch (FileNotFoundException e1) {

e1.printStackTrace();

}
//将线程放入线程池 当连接很多时候可以通过线程池处理

threadPool.execute(new IoStreamThreadWork(in,fos));

//直接启动线程 连接很少可以选用下面

//		new IoStreamThreadWork(in,fos).start();

}
public void createServerStream(){

//建立一个无阻塞服务端socket 用nio

NioSocketAcceptor acceptor = new NioSocketAcceptor();

//创建接收过滤器 也就是你要传送对象的类型

DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();

//===========过滤器创建好了就开始设定============

//设定 对象传输工厂

ObjectSerializationCodecFactory factory = new ObjectSerializationCodecFactory();

//设定传输最大值

factory.setDecoderMaxObjectSize(Integer.MAX_VALUE);// 设定后服务器可以接收大数据

factory.setEncoderMaxObjectSize(Integer.MAX_VALUE);

chain.addLast("logging", new LoggingFilter());//这个用于打印日志 可以不写

//设定服务端消息处理器

acceptor.setHandler(new MinaFileServer());

InetSocketAddress inetSocketAddress = null;

try {
inetSocketAddress = new InetSocketAddress(8888);

acceptor.bind(inetSocketAddress);

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}
System.out.println("文件服务器已经开启:"+8888);

}
public static void main(String[] args) {

MinaFileServer server = new MinaFileServer();

server.createServerStream();

}
}


再写一个客户端

package com.rose.common.frame.mina;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.InputStream;

import java.io.OutputStream;

import java.net.InetSocketAddress;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;

import org.apache.mina.core.future.ConnectFuture;

import org.apache.mina.core.session.IoSession;

import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;

import org.apache.mina.filter.logging.LoggingFilter;

import org.apache.mina.handler.stream.StreamIoHandler;

import org.apache.mina.transport.socket.nio.NioSocketConnector;

/**
* @author qiuy

* 文件传输客户端

*/
public class MinaFileClient extends StreamIoHandler{

IoSession session;

public void setSession(IoSession session) {

this.session = session;

}
public IoSession getSession() {

return session;

}
@Override

protected void processStreamIo(IoSession session, InputStream in,

OutputStream out) {

//客户端发送文件

File sendFile = new File("F:\\ttt.pdf");

FileInputStream fis = null;

try {
fis = new FileInputStream(sendFile);

} catch (FileNotFoundException e) {

e.printStackTrace();

}
//放入线程让其执行

//客户端一般都用一个线程实现即可 不用线程池

new IoStreamThreadWork(fis,out).start();

return;
}

public void createClienStream(){

int port = 8888;

String local = "127.0.0.1";

NioSocketConnector connector = new NioSocketConnector();

DefaultIoFilterChainBuilder chain = connector.getFilterChain();

ObjectSerializationCodecFactory factory = new ObjectSerializationCodecFactory();

factory.setDecoderMaxObjectSize(Integer.MAX_VALUE);

factory.setEncoderMaxObjectSize(Integer.MAX_VALUE);

chain.addLast("logging", new LoggingFilter());//用于打印日志可以不写

connector.setHandler(new MinaFileClient());

ConnectFuture connectFuture = connector.connect(new InetSocketAddress(local,port));

connectFuture.awaitUninterruptibly();//写上这句为了得到下面的session 意思是等待连接创建完成 让创建连接由异步变同步

//后来表明我开始的想法不行 动态依旧不能做到

//		@SuppressWarnings("unused")

//		IoSession session = connectFuture.getSession();

//		setSession(session);

}
public static void main(String[] args) {

MinaFileClient client = new MinaFileClient();

client.createClienStream();

}
}


ok以上就可以实现客户端上传文件到服务器端 要是读者朋友想看看效果

代码拷贝后 在自己的f盘下放一个ttt.pdf然后运行服务器端,再运行客户端这样在你的e盘下会多出一个叫test.pdf文件。如果要用到具体工程中请自行封装一下代码。

参考:mina的API,网上相关资料。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: