`
jean7155
  • 浏览: 62924 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

Apache Mina: StreamIoHandler传输文件处理

阅读更多
通过StreamIoHandler来进行文件的传输

1. 创建通过接收的BufferedInputStream写输出BufferedOutputStream的方法
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();  
            }  
        }  
    }  

}


2. 创建Server端服务及其StreamIoHandler
Server.java
public class Server {
	
	public Server(){
		
	}
	
	public void init() throws IOException{
		IoAcceptor acceptor = new NioSocketAcceptor();
		
        ObjectSerializationCodecFactory factory = new ObjectSerializationCodecFactory();
        factory.setDecoderMaxObjectSize(Integer.MAX_VALUE);  
        factory.setEncoderMaxObjectSize(Integer.MAX_VALUE);
		
		acceptor.getFilterChain().addLast("logger", new LoggingFilter());
	
        acceptor.setHandler(new MyStreamIoHandler());
		acceptor.getSessionConfig().setReadBufferSize(2048);
		acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);

        acceptor.setDefaultLocalAddress(new InetSocketAddress(Constants.PORT));
        acceptor.bind();// 启动监听  
	}

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		Server server = new Server();
		server.init();

	}

}


MyStreamIoHandler.java
public class MyStreamIoHandler extends StreamIoHandler {
	
	

	@Override
	public void sessionOpened(IoSession session) {
		System.out.println("客户端连接了:"+session.getRemoteAddress());  
		super.sessionOpened(session);
	}

	@Override
	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:\\hello.doc");  
        try {  
            fos = new FileOutputStream(receiveFile);  
        } catch (FileNotFoundException e1) {  
            e1.printStackTrace();  
        }  
        //将线程放入线程池 当连接很多时候可以通过线程池处理  
        threadPool.execute(new IoStreamThreadWork(in,fos));  
	}
}


3. 创建Client端连接机器StreamIoHandler
Client.java
public class Client {
	
	public Client(){
		super();
	}
	public void connect() throws InterruptedException{
		NioSocketConnector connector = new NioSocketConnector();
		
	    ObjectSerializationCodecFactory factory = new ObjectSerializationCodecFactory();  
	    factory.setDecoderMaxObjectSize(Integer.MAX_VALUE);  
	    factory.setEncoderMaxObjectSize(Integer.MAX_VALUE);  

        // Configure the service.
        connector.setConnectTimeoutMillis(Constants.CONNECT_TIMEOUT);
        //connector.getFilterChain().addLast("codec",new ProtocolCodecFilter(factory));
        connector.getFilterChain().addLast("logger", new LoggingFilter());

        connector.setHandler(new ClientStreamIoHandler());
        

        IoSession session;
        for (;;) {
            try {
                ConnectFuture future = connector.connect(new InetSocketAddress(Constants.HOSTNAME, Constants.PORT));
                future.awaitUninterruptibly();
                session = future.getSession();
                break;
            } catch (RuntimeIoException e) {
                System.err.println("Failed to connect.");
                e.printStackTrace();
                Thread.sleep(5000);
            }
        }

        // wait until the summation is done
        session.getCloseFuture().awaitUninterruptibly();
        
        connector.dispose();
	}

	/**
	 * @param args
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws InterruptedException {
		Client client = new Client();
		client.connect();

	}

}


ClientStreamIoHandler.java
public class ClientStreamIoHandler extends StreamIoHandler {

	@Override
	protected void processStreamIo(IoSession session, InputStream in,
			OutputStream out) {
		
        //客户端发送文件  
        File sendFile = new File("D:\\ttt.doc");  
        FileInputStream fis = null;  
        try {  
            fis = new FileInputStream(sendFile);  
              
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        }  
        //放入线程让其执行  
         //客户端一般都用一个线程实现即可 不用线程池  
        new IoStreamThreadWork(fis,out).start();  
        return;  

	}

}
分享到:
评论
1 楼 u014549257 2014-08-15  

相关推荐

    apache-mina-2.0.4.rar_apache mina_mina

    Apache Mina是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个"apache-mina-2.0.4.rar"压缩包包含的是Apache Mina 2.0.4版本的源代码,是深入理解和定制Mina的...

    Apache Mina核心jar包:mina-core-2.0.7

    Apache MINA是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。 当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版...

    Apache Mina: 自定义codec

    NULL 博文链接:https://jean7155.iteye.com/blog/1954890

    apache-mina-2.0.16

    7. **LICENSE** 和 **NOTICE**:Apache软件基金会的许可文件,详细说明了软件的使用、分发和修改权限。 Apache MINA的核心特性包括: 1. **异步I/O**:基于Java NIO(非阻塞I/O)实现,提供高性能的网络通信。 2. *...

    apache-mina-2.0.4架包及源码各pdf学习教程

    apache-mina-2.0.4 架包 源码 学习教程.apache mina是Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序...

    Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)

    Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)

    apache Mina的完整学习资料

    3. **Protocol Codec**:Apache Mina提供了多种编码器和解码器,如ByteToMessageDecoder和MessageToByteEncoder,用于处理不同协议的数据格式转换。 4. **NIO(Non-blocking I/O)**:Mina利用Java的NIO库,实现高效...

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

    总的来说,Apache Mina是一个强大的工具,适合构建复杂的网络服务,特别是当需要高效处理大量并发连接和传输各种类型的数据时。通过深入理解并熟练运用Mina的高级特性,我们可以构建出高效、可靠的网络应用。

    Apache Mina 入门Demo

    1. **Mina架构**:Apache Mina的核心设计基于事件驱动和非阻塞I/O模型,这种模型特别适合处理大量并发连接。它将网络通信层抽象为一组服务,如TCP/IP协议栈,让你专注于业务逻辑而不是底层细节。 2. **IoSession...

    apache mina实例免费下载

    在实际应用中,Apache MINA常用于构建服务器端应用,如聊天服务器、游戏服务器、文件传输服务等。通过MINA提供的API,开发者可以轻松创建出处理大量并发连接的服务。MINA实例通常包含以下部分: 1. **Acceptor**:...

    Apache Mina帮助文档

    Apache Mina是一个高度可扩展的网络通信框架,主要用于构建高性能、高效率的服务端应用程序。它提供了事件驱动、异步I/O处理模型,使得开发者能够更专注于业务逻辑,而不是底层网络编程的复杂性。Mina主要应用于Java...

    apache mina 学习笔记三(子项目FtpServer)

    MINA FtpServer使用MINA的核心I/O抽象来处理数据连接,支持主动和被动模式的数据传输。在主动模式下,服务器主动建立数据连接;而在被动模式下,客户端发起数据连接。开发者可以通过`DataConnectionConfiguration`来...

    关于apache Mina Server

    深入理解Apache_Mina_(1)----_Mina的几个类 深入理解Apache_Mina_(2)----_与IoFilter相关的几个类 深入理解Apache_Mina_(3)----_与IoHandler相关的几个类 深入理解Apache_Mina_(4)----_IoFilter和IoHandler的区别和...

    Apache MINA 线程模型配置

    ### Apache MINA线程模型配置详解 #### 一、线程模型配置介绍 Apache MINA 是一个用于构建网络应用程序的高性能、高可靠性的框架。它提供了丰富的功能来简化网络编程,包括TCP/IP 和 UDP/IP 协议的支持。线程模型...

    apache mina-spring 服务端程序

    Apache Mina是一个高度可扩展的网络通信框架,主要用于构建高性能、高并发的网络应用程序,如服务器端应用。它提供了一种简单而强大的编程模型,使得开发者可以专注于业务逻辑,而不是底层的网络通信细节。Spring...

    Apache mina2学习笔记DEMO

    Apache MINA(Multipurpose Infrastructure for Network Applications)是一个Java框架,专为高性能、异步网络应用程序设计。MINA 提供了一套高级的网络通信抽象层,简化了开发过程,特别是对于处理TCP/IP和UDP/IP...

    Apache MINA 2.0 用户指南( 缺第一章节)

    - **多线程处理**:为了提高性能和响应能力,服务器端通常采用多线程模型来处理连接请求和数据传输。 #### 客户端架构简介 客户端架构主要涉及连接服务器、发送请求和接收响应的过程。与服务器端类似,客户端也需要...

    Apache Mina Server 2.0 抢鲜体验

    4. **IoFilter**:过滤器机制是Mina的另一个亮点,它允许在数据传输前对其进行预处理,或在传输后进行后处理。开发者可以自定义过滤器来实现数据编码、解码、安全加密等功能,提高了代码的复用性和模块化。 5. **...

    一个Apache MINA使用案例源代码ApacheMina

    这个框架提供了一种抽象层,允许开发者使用相同的API处理多种不同的传输协议,如TCP/IP、UDP/IP以及SSL/TLS等。在Android平台上,尽管MINA并不常见,但在某些需要进行复杂网络通信或跨平台的项目中,它可能会被采用...

    Apache MINA框架相关资料

    源码分析文档通常由经验丰富的开发者编写,通过深入剖析MINA的源代码,揭示其内部工作原理,帮助开发者理解MINA如何实现非阻塞I/O,以及如何高效地处理网络连接和数据传输。这对于想要优化MINA性能或者进行二次开发...

Global site tag (gtag.js) - Google Analytics