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 ...
随机推荐
- 第一天接触Orchard
第一天接触Orchard 为什么要研究Orchard 呢? 楼主是因为要研究下最新的ASP.NET技术, Orchard 用的人多,历史也比较久,算是老牌了 再就是中文资料比较多,Orchard 有中 ...
- JAVA中的单利
单列:单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种.单例模式有一下特点:1.单例类只能有一个实例.2.单例类必须自己自己创建自己的唯一实例.3.单例类必须给所有其他对象提供这一实例. 一.懒 ...
- 关于PHP上传文件和中文名乱码情况
关于PHP文件上传 在前端HTML页面,表单如下 Upload.html <!doctype html><html lang="en"><head&g ...
- 当手机被PS掉,人们看到的是手中的灵魂
Eric Pickersgill是一名摄影师,最近喜欢拍摄并记录人们使用智能手机的情景,不过不同的是,在最终作品中会将手机从人们手中PS掉,一刹那会进入一个奇怪的世界.黑白照片也极具冲击力. 每个人神 ...
- 使用eclipse进行Android编程发生崩溃的一个问题及解决办法
刚才在使用eclipse的时候发生了vm占用过高而无法使用的问题,最初我以为只要重启eclipse就可以解决,重启之后仍然没有效果.重启PC之后打开eclipse仍然无法打开.eclipse是有自己的 ...
- HTML 学习笔记 JavaScript (函数)
函数是由事件驱动的或者当他被调用时执行的可重复使用的代码块 实例 <!DOCTYPE html> <html> <head> <script> func ...
- Java 集合系列06之 Vector详细介绍(源码解析)和使用示例
概要 学完ArrayList和LinkedList之后,我们接着学习Vector.学习方式还是和之前一样,先对Vector有个整体认识,然后再学习它的源码:最后再通过实例来学会使用它.第1部分 Vec ...
- iOS APNS配置(转)
Introduction To send Push notification to an application/device couple you need an unique device tok ...
- [转]源代码的管理和发布:以SVN为例
FROM : http://ju.outofmemory.cn/entry/47277 前几天在微博吐槽了SVN的几个不爽的地方:.svn文件满天飞.分支管理的麻烦.不爽一般来说都是有过对比后才有如此 ...
- c++游戏服务器编程学习笔记(一)TCP/IP
1. c++游戏服务器编程c++运行效率非常高2. TCP传输控制协议IP网际协议Socket 3.Linux 乌班图开源第三方库BOOST 4.80%游戏服务器端用C++工作量最大的地方是具体的游戏 ...