mina例子

网上找的,自己做个整理,原例子有问题,没有指定JAR包,自己肯定没有跑过。

包层次

代码

 

package com.dong.study.mina;

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;
	 }

}


package com.dong.study.mina;

import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.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);
		 }

}


package com.dong.study.mina;

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.mina.common.IoHandlerAdapter;
import org.apache.mina.common.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");
	 }

}


package com.dong.study.mina;

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."); 
	 }

}


package com.dong.study.mina;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.InetSocketAddress;

import org.apache.mina.common.ConnectFuture;
import org.apache.mina.common.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();
	  }
	 }

}


 

log4j.rootLogger=debug, stdout, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%p %d %t %c - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=c:/example.log
log4j.appender.R.MaxFileSize= 100KB

# Keep one backup file
log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %d %t %c - %m%n     

依赖包见我的资源
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值