- 浏览: 370458 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
xujishen:
新入职 写道还是没很明白~~这个BigDecimal.ROUN ...
BigDecimal带精度的运算 -
542348257:
数字为long型的时候 好像处理有点问题
【无聊的笔记】将数字转换为中文读法 -
陈小妞:
当你输入100003980的时候在万位会多一个万字
【无聊的笔记】将数字转换为中文读法 -
stranger520:
可能有问题吧,举个例子: pacage1/User.class ...
java读取指定package下的所有class -
springdata_springmvc:
java程序语言学习教程 地址http://www.zuida ...
java学习——mina篇
mina是对nio的具体实现。是目前比较高效和流行的nio框架了。
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.");
}
}
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.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");
}
}
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;
}
}
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import nio.upload.server.FileUploadRequest;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.session.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();
}
}
}
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.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);
}
}
评论
while (fis.read(a, 0, a.length) != -1) { request.setFileContent(a); session.write(request); }
改为
int len; while ( (len = fis.read(a, 0, a.length)) != -1) { request.setFileContent(Arrays.copyOf(a, len)); session.write(request); }
就可以了。
非常好!
原因:out.close(); 之后没有置空(out = null;),
会导致out.write(request.getFileContent());报以上错误,
置空之后就没问题了。
原因:out.close(); 之后没用置空(out = null;),
会导致out.write(request.getFileContent());报以上错误,
置空之后就没问题了。
while (fis.read(a, 0, a.length) != -1) { request.setFileContent(a); session.write(request); }
改为
int len; while ( (len = fis.read(a, 0, a.length)) != -1) { request.setFileContent(Arrays.copyOf(a, len)); session.write(request); }
就可以了。
你有没有发现,传文件的速度很慢,如果是这样的速度还不如用最原始的socket。
有没有处理方案!
hi,你看下这里:
http://guoliangqi.iteye.com/blog/986781
你有没有发现,传文件的速度很慢,如果是这样的速度还不如用最原始的socket。
有没有处理方案!
提高单个文件的传输速度,并不是nio的特性。
nio重点解决的是无阻赛IO。
在io等待的时候能够让cpu做别的事情。
你提到说 速度很慢?
会很慢啊? 我试试看。稍后咱们再讨论下哈,
谢谢回复!~ ^_^
你有没有发现,传文件的速度很慢,如果是这样的速度还不如用最原始的socket。
有没有处理方案!
发表评论
-
2013年技术愿望目标
2013-01-07 23:25 0一: 读源码 1:jetty 2:webx,spr ... -
jetty的http协议解析
2012-07-31 23:59 0上篇文章讲到:jetty的connection解析到hand ... -
jetty源码阅读之connection解析到handler调用
2012-07-29 21:58 0前言: 想要处理用户发出的http请求,首先得获得连接 ... -
jetty源码阅读之connector
2012-07-29 14:56 0AbstractConnector @Overr ... -
定时执行Timer的源码阅读
2012-02-22 18:51 1725Timer的实现原理: 1:timer简介; ... -
jetty翻译
2011-09-06 23:50 0异步等待 异 ... -
【转】mysql Host is blocked error错误解决方案
2011-08-01 14:40 2961Host is blocked because of ma ... -
java按值传递
2011-06-28 23:13 0来看看代码 packag ... -
【无聊的笔记】将数字转换为中文读法
2011-06-05 15:43 6295将阿拉伯数字的数变成我们常用的中文读法, 比如说: 1 ... -
用mina网络传输使用ObjectSerializationCodecFactory一个小注意点
2011-04-05 18:18 8728背景: 之前的 一篇介绍mina的博客中,提到通过mi ... -
jboss下的war包的context映射配置
2011-02-10 17:19 0一般web容器都可以在 deploy 目录下放多个war包, ... -
maven war plugin 的filter 配置。
2011-02-10 17:14 0具体可以参考,maven的官方配置。 http://m ... -
【why系列】内部类为什么访问外围内需要用final
2011-01-10 13:16 011111111111111 -
java命令行知多少(反正我知道的比较少)
2010-12-29 17:11 3881打开 %java_home%\bin 下面,看一堆的命令 ... -
【why系列】为什么序列化要实现一个空接口Serializable
2010-12-25 22:16 0啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 -
【why系列】为什么说java是不可变的对象
2010-12-25 22:15 0啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 package ... -
java线程总结
2010-12-23 15:25 01:java启动一个线程,会为每一个线程,分配一个 ... -
【监控】通过jmx获得系统的gc,内存情况
2010-11-27 21:52 6259通过jmx访问jvm知道的Mbean的一些信息,可以取得系统运 ... -
自动动手写原生态jmx,MbeanInfo,invoke
2010-11-16 22:07 2057使用jmx的东东主要包括下面几个步骤了: 发布j ... -
用spring连接jmx
2010-11-14 18:20 1824接着上一篇 “原生态连接jmx”的例子。 上一篇中,发 ...
相关推荐
这篇博客“Java学习之IO总结及mina和netty”探讨了Java IO的基础知识,并深入到两个高级网络通信框架——Mina和Netty。Mina和Netty都是基于NIO(非阻塞IO)的高性能网络应用框架,它们简化了复杂网络编程的实现。 *...
6. **Nio**与**Aio**:Mina2支持两种不同的I/O模型——NIO(非阻塞I/O)和AIO(异步I/O)。NIO适用于高并发场景,而AIO在低延迟和高吞吐量的应用中表现出色。 通过深入研究Mina2的源码,我们可以了解到如何优化网络...
解压后,可以通过阅读代码和文档来了解具体实现细节,以便于理解和学习如何在实际项目中运用Mina实现长连接的客户端和服务端。 总的来说,Mina提供了一个强大而灵活的框架,使得开发者能够专注于业务逻辑,而不是...
**描述:**该案例是关于Java网络编程中使用的异步传输框架——Mina 2.0的实践应用,包括了服务端(server)和客户端(client)的实现。 **知识点详解:** 1. **Mina 2.0框架**:Mina(Minimum Asynchronous ...
标题中的“给予mina协议进行大数据传输”指的是一种基于Java的网络通信框架——Apache MINA(Model-View-Controller for Network Applications)。MINA是Apache软件基金会的一个项目,它提供了一个高度可扩展和高...
标题"mina高性能Java网络框架 v2.2.1.zip"表明这是Apache MINA框架的一个特定版本——v2.2.1的打包文件,通常包含源代码、文档和其他相关资源。这个版本可能包含了性能优化、bug修复以及新功能的引入,适合用于开发...
《mina框架资源包详解——构建即时通讯服务器的关键组件》 Mina框架,全称为Apache Mina,是一款基于Java开发的网络通信应用框架,它提供了一种简单而高性能的方式来构建网络服务,尤其在处理TCP/IP、UDP/IP以及SSL...
在本学习笔记中,我们将专注于MINA的子项目——FtpServer,它是实现FTP服务器功能的一个模块。 FTP(File Transfer Protocol)是一种广泛使用的互联网协议,用于在不同主机之间传输文件。Apache MINA FtpServer提供...
这个“MINA加jar打包文件”包含了MINA框架的一个特定版本——2.0.0-M4,以及相关的beans整合模块。 mina-integration-beans-2.0.0-M4.jar是MINA框架与Spring框架集成的模块,它允许开发者利用Spring的IoC...
《TCP通讯框架——深入理解Mina》 在IT行业中,TCP通讯框架是构建高效、可靠的网络应用程序的关键组件。其中,Mina作为一个强大的通讯框架,深受Java开发者们的喜爱。本资源包专注于TCP通讯框架,特别是Mina框架的...
Apache Mina是一个高性能、异步事件驱动的网络应用程序框架,主要用Java编写,用于简化开发各种网络协议服务器和客户端。Mina2.0版本在前一版本...学习和理解Mina的基本概念和机制,将有助于提高你的Java网络编程能力。
在Java开发中,Mina(Java Minimal Asynchronous Network Engine)是一个强大的网络编程框架,用于构建高性能、高可用性的网络应用程序,如服务器。本实例主要关注的是Mina在处理网络通信时遇到的两个常见问题——...
本篇文章将深入探讨Mina2.0的一个核心应用场景——HttpServer,通过分析其源码,帮助读者更好地理解和运用这一工具。 Apache Mina是一个Java框架,它简化了开发高性能和高并发网络应用程序的工作。Mina提供了一种...
为了帮助读者快速理解如何使用 Mina 2.0 开发简单的网络服务,下面提供了一个基于时间服务器的例子——`MinaTimeServer.java`。 ```java package com.vista; import java.io.IOException; import java.net....
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个Java框架,主要设计用于开发高性能、高可用性的网络应用程序。MINA提供了一种与传输协议无关的抽象层,使得开发者可以轻松地构建基于TCP...
在这个压缩包中,包含了Mina框架的核心组件——`mina-core-2.0.0.jar`,这是Mina的核心库,提供了I/O处理、编码解码、协议处理等功能。它支持多种传输层协议,如TCP、UDP、本地套接字等,通过简单的API,开发者可以...
接下来是创建一个简单的服务器端示例——`Demo1Server`。该类中包含了创建服务器的基本步骤,具体实现如下: ```java package test.service; import java.net.InetSocketAddress; import java.nio.charset.Charset...
1. **Mina架构**:Mina采用了事件驱动和异步I/O模型,基于Java NIO(非阻塞I/O)库。它的核心组件包括Acceptor(监听器)、Session(会话)和Filter(过滤器)。Acceptor负责接收连接请求,Session代表每个独立的...
### Mina2源码分析——核心模块解析 #### 概述 Mina2是一个高性能、可扩展的网络应用框架,支持多种传输协议如TCP、UDP等,并提供了丰富的API供开发者使用。本文旨在深入剖析Mina2的核心部分,帮助读者更好地理解和...
《MINA使用札记——CumulativeProtocolDecoder使用详解》 MINA(Java Multithreaded Network Application Framework)是一个强大的、高性能的Java网络应用框架,它主要用于构建可伸缩的、高性能的服务端应用,如...