java-通讯stocket插件mina实例
mina是对nio的具体实现。是目前比较高效和流行的nio(非阻塞式I/O)框架
mina主要包括:
其中服务端为:NioSocketAcceptor
客户端为:NioSocketConnector
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.");
}
}
服务端的handler。
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();
}
}
}
客户端handler的实现。
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);
}
}
原文转载
java-通讯stocket插件mina实例的更多相关文章
- redis安装 phpredis Jedis 扩展的实现及注意事项,php,java,python相关插件安装实例代码和文档推荐
redis安装 phpredis Jedis 扩展的实现及注意事项,php,java,python相关插件安装实例代码和文档推荐 1.Redis 官方网站下载: http://redis.io/dow ...
- mina 实例(转载)
mina:http://mina.apache.org/ 原文:http://maosheng.iteye.com/blog/1891665 大并发量socket 通信框架MINA介绍 博客分类: J ...
- Java程序只运行一个实例[转]
如果希望你的Java程序只能存在一个实例,可以参考下面的用法. 原文链接:http://blog.csdn.net/yaerfeng/article/details/7264729 Java没有提供这 ...
- IDEA/Eclipse安装 Alibaba Java Coding Guidelines 插件
为了让开发者更加方便.并且达到快速规范代码格式的目的并实行起来,阿里巴巴基于<阿里巴巴Java开发规约>手册内容,研发了一套自动化的IDE检测插件(IDEA.Eclipse).它就是Ali ...
- Java中间件之RMI及实例介绍 · zijian's blog
RMI介绍 远程方法调用(Remote Method Invocation)是Sun公司规定的允许在不同的JAVA虚拟机之间进行对象间通信的一种规范.在RMI中,JVM可以位于一个或多个计算机上, ...
- 【转】Eclipse Class Decompiler——Java反编译插件
闲暇之余,写了一个Eclipse下的Java反编译插件:Eclipse Class Decompiler,整合了目前最好的2个Java反编译工具Jad和JD-Core,并且和Eclipse Class ...
- Java学习-019-Properties 文件读取实例源代码
在这几天的学习过程中,有开发的朋友告知我,每个编程语言基本都有相应的配置文件支持类,像 Python 编程语言中支持的 ini 文件及其对应的配置文件读取类 ConfigParse,通过这个类,用户可 ...
- Java学习-018-EXCEL 文件写入实例源代码
众所周知,EXCEL 也是软件测试开发过程中,常用的数据文件导入导出时的类型文件之一,此文主要讲述如何通过 EXCEL 文件中 Sheet 的索引(index)或者 Sheet 名称获取文件中对应 S ...
- Java学习-017-EXCEL 文件读取实例源代码
众所周知,EXCEL 也是软件测试开发过程中,常用的数据文件导入导出时的类型文件之一,此文主要讲述如何通过 EXCEL 文件中 Sheet 的索引(index)或者 Sheet 名称获取文件中对应 S ...
随机推荐
- C#类型转换运算符之 explicit implicit
类型转换运算符 explicit和implicit用于声明用户定义的类型转换运算符,如果可以确保转换过程不会造成数据丢失,则可使用这两个关键字在用户定义的类型和其他类型之间进行转换. explicit ...
- Windows英文版GitHub客户端使用操作流程图文攻略教程现没中文版
Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理.作为一个程序员,我们需要掌握其用法. 作为开源代码库以及版本控制系统,Github目前拥有140 ...
- BigDecimal.ROUND_HALF_XXX的各种用法
在银行.帐户.计费等领域,BigDecimal提供了精确的数值计算.其中8种舍入方式值得掌握. 1.ROUND_UP 舍入远离零的舍入模式. 在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数 ...
- luogu1328[NOIP2014 T1]生活大爆炸版石头剪刀布
题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的升级版游戏. 升级版游戏在传统的 ...
- ExcelHelper
NPOI下载:http://pan.baidu.com/s/1JNAGm 最新封装类: 2016-03-14 1.添加对OleConn的读 private static string connstri ...
- Oracle Update 语句语法与性能分析 - 多表关联
Oracle Update 语句语法与性能分析 - 多表关联 为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在某个业务受理子系统BSS中, SQL 代码 --客户资料表 create ...
- Centos下Tomcat 安装Apache Portable Runtime
APR(Apache Portable Runtime)是一个高可移植库,它是Apache HTTP Server 2.x的核心. APR有很多用途,包括访问高级IO功能(例如sendfile,epo ...
- 046医疗项目-模块四:采购单模块—采购单审核(Dao,Service,Action三层)
当医院把采购单提交之后,由监管单位进行采购单审核,由卫生院及卫生局进行审核.卫生局可以审核所有医院创建的采购单,卫生院只审核本辖区医院创建的采购单. 操作流程: 点击"采购单审核" ...
- jQuery的prop和attr方法之间区别
JQuery.attr(): Get the value of an attribute for the first element in the set of matched elements. J ...
- QT 对话框一
标准文件对话框 其函数形式如下:: QString QFileDialog::getOpenFileName ( QWidget * parent=, const QString &capti ...