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 ...
随机推荐
- UIPanelResetHelper(UIScrollView滚动复位)
原理 如果我们的UI中有滑动列表,并且列表比较长,那么不知道你们是否有这样需求,每次页面打开时,列表的滑动状态都恢复到默认状态. 如果要复位,其实就是修改UIPanel 的属性到初始状态.此组件做的工 ...
- MVC 数据验证【转】
[转自]http://www.cnblogs.com/dozer/archive/2010/04/12/MVC-DataAnnotations.html 作者Dozer 今天在这里给大家介绍一下MVC ...
- .net AES加密解密
using System; using System.Collections.Generic; using System.Text; using System.Secur ...
- 用Myisamchk让MySQL数据表更健康
用Myisamchk让MySQL数据表更健康 2011-03-15 09:15 水太深 ITPUB 字号:T | T 为了让MySQL数据库中的数据表“更健康”,就需要对其进行定期体检.在这里笔者推荐 ...
- 4829 [DP]数字三角形升级版
4829 [DP]数字三角形升级版 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 从数字三角形的顶部(如图, ...
- Apache Rewrite 拟静态配置
1.mod_rewrite 简介和配置 Rewirte主要的功能就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范.平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等 2.mod_ ...
- 华为acl(traffic-filter)和dhcp管理
华为alc配置实例:-traffic-filter # 在VLAN100上配置基于ACL的报文过滤,允许源IP地址为192.168.0.2/32的报文通过,丢弃其他报文. <HUAWEI> ...
- php数组函数,字符串,linux命令
1>> Linux常用命令一. 文件目录操作命令1. ls命令 命令格式:ls [选项] [目录名] 命令功能:列出目标目录中所有的子目录和文件.2. 命令格式:cd [目录名 ...
- node基础06:回调函数
1.Node异步编程 Node.js 异步编程的直接体现就是回调. 异步编程依托于回调来实现,但不能说使用了回调后程序就异步化了. 回调函数在完成任务后就会被调用,Node 使用了大量的回调函数,No ...
- Eclipse调试常用技巧(转)
Eclipse调试常用技巧 转自http://daimojingdeyu.iteye.com/blog/633824 1. 条件断点 断点大家都比较熟悉,在Eclipse Java 编辑区的行头双击就 ...