设为首页 收藏本站
查看: 648|回复: 0

[经验分享] Apache Mina: StreamIoHandler传输文件处理

[复制链接]

尚未签到

发表于 2017-1-8 08:49:25 | 显示全部楼层 |阅读模式
通过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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-325336-1-1.html 上篇帖子: apache上传大文件的配置 下篇帖子: java 使用apache POI 解析读取 Excel
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表