`
cc_fee100
  • 浏览: 7430 次
社区版块
存档分类
最新评论

MINA传输文件

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






[java] view plaincopyprint?
01.package com.rose.common.frame.mina; 
02. 
03.import java.io.BufferedInputStream; 
04.import java.io.BufferedOutputStream; 
05.import java.io.IOException; 
06.import java.io.InputStream; 
07.import java.io.OutputStream; 
08. 
09./**
10. * 用于mina 服务器上传下载
11. * 流处理线程公共类
12. * @author qiuy
13. *
14. */ 
15.public class IoStreamThreadWork extends Thread{ 
16.    public static final int BUFFER_SIZE = 1024*2; 
17.     
18.    private BufferedInputStream bis; 
19.    private BufferedOutputStream bos; 
20.     
21.     
22.    public BufferedInputStream getBis() { 
23.        return bis; 
24.    } 
25. 
26.    public void setBis(BufferedInputStream bis) { 
27.        this.bis = bis; 
28.    } 
29. 
30.    public BufferedOutputStream getBos() { 
31.        return bos; 
32.    } 
33. 
34.    public void setBos(BufferedOutputStream bos) { 
35.        this.bos = bos; 
36.    } 
37. 
38.    public IoStreamThreadWork(InputStream in, OutputStream os){ 
39.        bis = new BufferedInputStream(in); 
40.        bos = new BufferedOutputStream(os); 
41.    } 
42.    public synchronized void run() { 
43.        byte[] bufferByte = new byte[BUFFER_SIZE]; 
44.        int tempData = 0; 
45.        try { 
46.            while((tempData = bis.read(bufferByte)) != -1 ){ 
47.                bos.write(bufferByte, 0, tempData); 
48.            } 
49.            try { 
50.                bos.flush(); 
51.            } catch (IOException e) { 
52.                e.printStackTrace(); 
53.            } 
54.        } catch (IOException e) { 
55.            e.printStackTrace(); 
56.        }finally{ 
57.            try { 
58.                bos.close(); 
59.                bis.close(); 
60.            } catch (IOException e) { 
61.                e.printStackTrace(); 
62.            } 
63.        } 
64.    } 
65.} 


写一个服务器端




[java] view plaincopyprint?
01.package com.rose.common.frame.mina; 
02. 
03.import java.io.File; 
04.import java.io.FileNotFoundException; 
05.import java.io.FileOutputStream; 
06.import java.io.IOException; 
07.import java.io.InputStream; 
08.import java.io.OutputStream; 
09.import java.net.InetSocketAddress; 
10.import java.util.concurrent.ArrayBlockingQueue; 
11.import java.util.concurrent.ThreadPoolExecutor; 
12.import java.util.concurrent.TimeUnit; 
13. 
14.import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder; 
15.import org.apache.mina.core.session.IoSession; 
16.import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory; 
17.import org.apache.mina.filter.logging.LoggingFilter; 
18.import org.apache.mina.handler.stream.StreamIoHandler; 
19.import org.apache.mina.transport.socket.nio.NioSocketAcceptor; 
20. 
21./**
22. * @author qiuy
23. * 文件传输服务器
24. */ 
25.public class MinaFileServer extends StreamIoHandler{ 
26.    public static final int PORT = 8888; 
27.    @Override 
28.    public void sessionOpened(IoSession session) { 
29.        System.out.println("客户端连接了:"+session.getRemoteAddress()); 
30.        super.sessionOpened(session); 
31.    } 
32. 
33.    protected void processStreamIo(IoSession session, InputStream in,OutputStream out) { 
34.        //设定一个线程池 
35.        //参数说明:最少数量3,最大数量6 空闲时间 3秒 
36.        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(3, 6, 3,TimeUnit.SECONDS,  
37.                //缓冲队列为3 
38.                new ArrayBlockingQueue<Runnable>(3), 
39.                //抛弃旧的任务 
40.                new ThreadPoolExecutor.DiscardOldestPolicy()); 
41.        FileOutputStream fos = null; 
42.        File receiveFile = new File("e:\\test.pdf"); 
43.        try { 
44.            fos = new FileOutputStream(receiveFile); 
45.        } catch (FileNotFoundException e1) { 
46.            e1.printStackTrace(); 
47.        } 
48.        //将线程放入线程池 当连接很多时候可以通过线程池处理 
49.        threadPool.execute(new IoStreamThreadWork(in,fos)); 
50.        //直接启动线程 连接很少可以选用下面 
51.//      new IoStreamThreadWork(in,fos).start(); 
52.    } 
53.     
54.    public void createServerStream(){ 
55.        //建立一个无阻塞服务端socket 用nio 
56.        NioSocketAcceptor acceptor = new NioSocketAcceptor(); 
57.        //创建接收过滤器 也就是你要传送对象的类型 
58.        DefaultIoFilterChainBuilder chain = acceptor.getFilterChain(); 
59.        //===========过滤器创建好了就开始设定============ 
60.         
61.        //设定 对象传输工厂 
62.        ObjectSerializationCodecFactory factory = new ObjectSerializationCodecFactory(); 
63.        //设定传输最大值 
64.        factory.setDecoderMaxObjectSize(Integer.MAX_VALUE);// 设定后服务器可以接收大数据 
65.        factory.setEncoderMaxObjectSize(Integer.MAX_VALUE); 
66.        chain.addLast("logging", new LoggingFilter());//这个用于打印日志 可以不写 
67.        //设定服务端消息处理器 
68.        acceptor.setHandler(new MinaFileServer()); 
69.        InetSocketAddress inetSocketAddress = null; 
70.        try { 
71.            inetSocketAddress = new InetSocketAddress(8888); 
72.            acceptor.bind(inetSocketAddress); 
73.        } catch (IOException e) { 
74.            // TODO Auto-generated catch block 
75.            e.printStackTrace(); 
76.        } 
77.        System.out.println("文件服务器已经开启:"+8888); 
78.    } 
79.    public static void main(String[] args) { 
80.        MinaFileServer server = new MinaFileServer(); 
81.        server.createServerStream(); 
82.    } 
83.} 







[java] view plaincopyprint?
01.package com.rose.common.frame.mina; 
02. 
03.import java.io.File; 
04.import java.io.FileInputStream; 
05.import java.io.FileNotFoundException; 
06.import java.io.InputStream; 
07.import java.io.OutputStream; 
08.import java.net.InetSocketAddress; 
09. 
10.import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder; 
11.import org.apache.mina.core.future.ConnectFuture; 
12.import org.apache.mina.core.session.IoSession; 
13.import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory; 
14.import org.apache.mina.filter.logging.LoggingFilter; 
15.import org.apache.mina.handler.stream.StreamIoHandler; 
16.import org.apache.mina.transport.socket.nio.NioSocketConnector; 
17. 
18. 
19./**
20. * @author qiuy
21. * 文件传输客户端 
22. */ 
23.public class MinaFileClient extends StreamIoHandler{ 
24.    IoSession session; 
25.    public void setSession(IoSession session) { 
26.        this.session = session; 
27.    } 
28.    public IoSession getSession() { 
29.        return session;   
30.    } 
31.    @Override 
32.    protected void processStreamIo(IoSession session, InputStream in, 
33.            OutputStream out) { 
34.        //客户端发送文件 
35.            File sendFile = new File("F:\\ttt.pdf"); 
36.            FileInputStream fis = null; 
37.            try { 
38.                fis = new FileInputStream(sendFile); 
39.                 
40.            } catch (FileNotFoundException e) { 
41.                e.printStackTrace(); 
42.            } 
43.            //放入线程让其执行 
44.             //客户端一般都用一个线程实现即可 不用线程池 
45.            new IoStreamThreadWork(fis,out).start(); 
46.            return; 
47.    } 
48.     
49.    public void createClienStream(){ 
50.        int port = 8888; 
51.        String local = "127.0.0.1"; 
52.         
53.        NioSocketConnector connector = new NioSocketConnector(); 
54.        DefaultIoFilterChainBuilder chain = connector.getFilterChain(); 
55.        ObjectSerializationCodecFactory factory = new ObjectSerializationCodecFactory(); 
56.        factory.setDecoderMaxObjectSize(Integer.MAX_VALUE); 
57.        factory.setEncoderMaxObjectSize(Integer.MAX_VALUE); 
58.        chain.addLast("logging", new LoggingFilter());//用于打印日志可以不写 
59.        connector.setHandler(new MinaFileClient()); 
60.        ConnectFuture connectFuture = connector.connect(new InetSocketAddress(local,port)); 
61.        connectFuture.awaitUninterruptibly();//写上这句为了得到下面的session 意思是等待连接创建完成 让创建连接由异步变同步 
62.        //后来表明我开始的想法不行 动态依旧不能做到 
63.//      @SuppressWarnings("unused") 
64.//      IoSession session = connectFuture.getSession(); 
65.//      setSession(session); 
66.    } 
67.    public static void main(String[] args) { 
68.        MinaFileClient client = new MinaFileClient(); 
69.        client.createClienStream(); 
70.    } 
71.} 



再写一个客户端
ok以上就可以实现客户端上传文件到服务器端 要是读者朋友想看看效果
代码拷贝后 在自己的f盘下放一个ttt.pdf然后运行服务器端,再运行客户端这样在你的e盘下会多出一个叫test.pdf文件。如果要用到具体工程中请自行封装一下代码。
分享到:
评论

相关推荐

    mina的高级使用,mina文件图片传送,mina发送文件,mina报文处理,mina发送xml和json

    同时,Mina提供了进度反馈机制,可以实时监控文件传输进度,确保传输的可靠性。 3. **Mina发送文件** 发送文件的过程与图片类似,但可能需要考虑更多因素,如文件大小、文件类型等。Mina允许开发者自定义编码解码...

    mina传文件案例,客户端加服务端

    《minafileserver:基于Socket与Mina的文件传输实践》 在IT行业中,网络通信是不可或缺的一部分,尤其是在分布式系统和互联网应用中。Apache Mina是一个轻量级、高性能的网络应用框架,它简化了网络编程,尤其是TCP...

    mina文件传输

    在"Mina文件及字符串传输"这个场景中,我们可以理解为利用Mina框架实现了一种服务,允许客户端通过发送字符串请求来获取服务器上的文件。这种功能在分布式系统、文件共享或者远程操作等场景中非常常见。下面我们将...

    mina 集成spring 传输文件和文本

    **描述解读:**"用一个监听既可以传文件又可以传文本" 这里的描述表明我们将构建一个监听器,该监听器能够同时处理文件和文本数据的发送与接收。这意味着我们需要设计一个灵活的协议,能够在同一连接上区分不同类型...

    Mina文件及字符串传输

    标题中的"Mina文件及字符串传输"指的是使用Apache Mina框架进行数据交互的过程,包括发送和接收字符串请求以及传输文件。这一过程通常涉及到网络编程中的TCP/IP协议,因为Mina支持基于TCP的传输层通信。 首先,让...

    mina 上传文件和文件名

    本文将围绕"MINA上传文件和文件名"这一主题,深入探讨MINA的核心特性、文件上传的实现机制以及如何处理文件名。 MINA的核心特性包括非阻塞I/O、事件驱动的架构、多线程模型和丰富的缓冲区管理。非阻塞I/O使得MINA...

    Mina上传文件

    **Mina上传文件详解** Apache Mina(Minimum Asynchronous Network)是一个高度可扩展且轻量级的网络通信框架,主要用于简化开发高性能服务器和客户端应用程序。它提供了基于事件驱动、非阻塞I/O模型的API,这使得...

    mina 上传文件

    4. **数据传输**: 文件数据被分块并通过网络传输,Mina的Filter链在此过程中进行数据的编码和解码。同时,Handler监听Read事件,逐块接收文件内容。 5. **保存文件**: 服务器端Handler接收到每个数据块后,将其累积...

    给予mina 协议进行大数据传输

    在压缩包子文件的文件名“M2M”中,通常M2M代表Machine-to-Machine通信,这可能是指使用MINA来实现设备之间的数据交换,例如在物联网(IoT)环境中。MINA的灵活性和可扩展性使得它适合于处理各种设备间的通信需求,...

    mina传输对象的示例

    在标题和描述中提到的“mina传输对象的示例”指的是如何在Mina框架下处理和传输自定义的数据对象。Mina允许开发者通过事件驱动和异步I/O模型来高效地构建网络服务。 Mina的核心组件包括: 1. **Session**: 表示...

    基于mina的开源文件传输软件

    **基于Mina的开源文件传输软件** Mina(Minimum Asynchronous Network)是一个高度可扩展的、高性能的网络应用开发框架,主要用于构建网络服务,如FTP(文件传输协议)服务器。这个开源项目允许开发者使用Java NIO...

    Mina网络通信传输

    Mina网络通信传输是基于Java开发的一个高性能、可伸缩的网络应用框架,常用于构建服务器和客户端之间的通信系统,尤其适用于即时聊天应用。Mina提供了丰富的API和工具,简化了网络编程的复杂性,使得开发者可以专注...

    MINA_API+MINA_DOC+mina

    同时,MINA支持多种协议,如TCP、UDP、SSL/TLS等,使得它在各种网络通信场景下都具有广泛的应用性,如聊天服务器、文件传输服务、在线游戏服务器等。 总的来说,这个压缩包为初学者提供了一套完整的MINA学习资源,...

    mina连接 mina心跳连接 mina断线重连

    通过分析这些文件,可以更具体地了解如何在实际项目中应用Mina的连接、心跳和断线重连机制。不过,具体的实现细节和优化策略需结合代码来进一步学习和理解。 总结起来,Apache Mina提供了一套强大的网络通信框架,...

    最新 mina框架jar包以及资源文件

    6. **资源文件**:"最新资源文件"可能包含MINA的示例代码、文档、配置模板等,这些资源对于学习和理解MINA框架,以及快速开发基于MINA的应用程序至关重要。 7. **版本更新**:"最新 Apache MINA 2.0.7"表示这是MINA...

    mina.zip内涵所有mina所需jar包

    在使用过程中,你可以利用Mina提供的API来建立服务器,处理客户端连接,定义协议处理逻辑,以及进行数据传输。 总的来说,这个"mina.zip"是一个方便开发和测试Apache Mina应用的资源包,包含了运行Mina所需的所有...

    websocket+java服务器(mina)

    - 安全性:WebSocket连接可以通过SSL/TLS加密,提高数据传输的安全性。 - 负载均衡与集群:如果需要处理大量并发连接,可以考虑使用负载均衡器和集群部署。 - 性能优化:适当调整Mina的线程模型、缓冲区大小等参数,...

    apache-mina-2.1.3所有jar和源文件.7z

    3. **Mina Transport**:实现了各种网络传输层,如TCP、UDP、本地文件系统以及NIO(非阻塞I/O)。 4. **Mina Extras**:可能包含一些额外的模块或工具,用于简化特定任务,如SSL/TLS支持、协议解析等。 5. **...

    mina心跳包机制

    mina心跳包机制是Apache Mina框架中的一个关键特性,它用于维持网络连接的活跃状态,确保数据能够在客户端和服务端之间顺畅地传输。Mina是一个高度可扩展的Java网络应用框架,广泛应用于各种分布式系统和网络服务,...

    mina传递图片实例

    本实例将详细介绍如何利用MINA框架在Android环境中实现图片的传输。 MINA的核心理念是基于事件驱动和非阻塞I/O,这使得它在处理大量并发连接时表现出色。在Android中,虽然原生的Socket编程可以实现数据传输,但...

Global site tag (gtag.js) - Google Analytics