java-mina(nio 框架)
mina是对nio的具体实现。是目前比较高效和流行的nio框架了。
客
户端跟服务端建立起来连接,客户端每次想服务端传输一定大小的文件内容。(byte的方式),然后服务端接收这些byte,将其output出来,形成文
件。客户端发送完毕后,传递一个完毕的标志,这里可以传个字符串”finish“,然后服务器收到这个结束标志,在写文件结束后,再传输个成功的标志给客
户端,(字符串”success“)然后客户端关闭连接。
- 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);
- }
- }
java-mina(nio 框架)的更多相关文章
- Java异步NIO框架Netty实现高性能高并发
原文地址:http://blog.csdn.net/opengl_es/article/details/40979371?utm_source=tuicool&utm_medium=refer ...
- 基于Java Mina 通信框架的JT/T809转发服务器设计
Apache MINA 是 Apache 组织的一个开源项目,为开发高性能和高可用性的网络应用程序提供了非常便利的框架. 也是Java开发者的一个福利(.NET目前还没有类似封装的这么好的基础sock ...
- 基于Java Mina框架的部标808服务器设计和开发
在开发部标GPS平台中,部标808GPS服务器是系统的核心关键,决定了部标平台的稳定性和行那个.Linux服务器是首选,为了跨平台,开发语言选择Java自不待言. 我们为客户开发的部标服务器基于Min ...
- 基于Java Mina框架的部标jt808服务器设计和开发
在开发部标GPS平台中,部标jt808GPS服务器是系统的核心关键,决定了部标平台的稳定性和行那个.Linux服务器是首选,为了跨平台,开发语言选择Java自不待言.需要购买jt808GPS服务器源码 ...
- 少啰嗦!一分钟带你读懂Java的NIO和经典IO的区别
1.引言 很多初涉网络编程的程序员,在研究Java NIO(即异步IO)和经典IO(也就是常说的阻塞式IO)的API时,很快就会发现一个问题:我什么时候应该使用经典IO,什么时候应该使用NIO? 在本 ...
- NIO框架Mina学习
前言: 找了篇文章看了看,nio框架数Mina用的最多! 代码: 服务端: package com.mina; import java.net.InetSocketAddress; import ja ...
- 几种Java NIO框架的比较(zz)
问题:生活中工作中,会有人问我javaNIO框架里面 Netty Mina xSocket Grizzly 等等哪个比较好? 在这里写一下自己的感受,也算是总结一下吧 在我的印象中.不管是什么NIO ...
- 关于Java的一些NIO框架的一点想法
闲着有点无聊想写点东西. 问题:生活中工作中,会有人问我javaNIO框架里面 Netty Mina xSocket Grizzly 等等哪个比较好? 在这里写一下自己的感受,也算是总结一下吧 在我 ...
- Getty – Java NIO 框架设计与实现
前言 Getty是我为了学习 Java NIO 所写的一个 NIO 框架,实现过程中参考了 Netty 的设计,同时使用 Groovy 来实现.虽然只是玩具,但是麻雀虽小,五脏俱全,在实现过程中,不仅 ...
- NIO框架之MINA源代码解析(二):mina核心引擎
NIO框架之MINA源代码解析(一):背景 MINA的底层还是利用了jdk提供了nio功能,mina仅仅是对nio进行封装.包含MINA用的线程池都是jdk直接提供的. MINA的server端主要有 ...
随机推荐
- spring mvc 和mybatis整合 的异常处理
1.自定义异常信息类 通过构造函数来实现异常信息的接收 public class CustomException extends Exception { //异常信息 private String m ...
- mysql开启日志记录慢查询
1.查看mysql配置 2.利用set (variables)命令设置变量 set global log_slow_queries = ON;/*(必须带上global)*/ set global s ...
- php最短的HTTP响应代码
刚刚发现在CodeProject给我推送了一篇文章叫:the Shortest PHP code for Returning HTTP Response Code 翻译过来就是(PHP最短的HTTP ...
- 10分钟进阶Nuget
nuget是什么 .net版的maven(java)? 如果你用过windows的chocolatey,mac的homebrew或许更容易理解他,先来回顾下以前我们是如何处理或者碰到过的问题. 1.假 ...
- 基于ARM-LINUX的温度传感器驱动(DS18B20) .
DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等.主要根据应用场合的不同而改变其外观.封装 ...
- 使用 windows 计划任务播放音乐文件
这个问题网上可以搜到很多答案,但都有一些小细节没有交代,而我平时又很少使用计划任务,所以配置中出了点问题,特此备注. 1.播放器 检查当前系统下目标文件的默认播放器是什么,并且确保可以运行. 比如首次 ...
- myeclipse启动项目时报:An internal error occurred during: "Launching TestSpring on Tomcat 7.x". java.lang.NullPointerException 解决方法
如果出现了上述的错误按照如下的3个步骤解决: 1.首先关闭MyEclipse工作空间. 2.然后删除工作空间下的 “/.metadata/.plugins/org.eclipse.core.runti ...
- BZOJ 1707: [Usaco2007 Nov]tanning分配防晒霜
Description 奶牛们计划着去海滩上享受日光浴.为了避免皮肤被阳光灼伤,所有C(1 <= C <= 2500)头奶牛必须在出门之前在身上抹防晒霜.第i头奶牛适合的最小和最 大的SP ...
- 【SGU 390】Tickets (数位DP)
Tickets Description Conductor is quite a boring profession, as all you have to do is just to sell ...
- 使用HttpClient向服务器发送restful post请求
直接上代码: public class RestClient { public static void main(String[] args) { String url = "http:// ...