在spring和mina集成的时候,要十分注意一个问题:版本。

这是一个非常严重的问题,mina官网的demo没错,网上很多网友总结的代码也是对的,但是很多人将mina集成到spring中的时候,总是会发现有个问题:

java.lang.IllegalArgumentException: Cannot convert value of type [org.apache.mina.integration.beans.InetSocketAddressEditor] to required

type [java.lang.Class]for property 'customEditors[java.net.SocketAddress]': PropertyEditor .....

类型不匹配。估计很多人按照网上的demo来做的话,都会遇到这个错误(除非spring是用的2.5或者之前的版本)。这是因为新版的spring有改动:

将一个PropertyEditor 实例传入CustomEditorConfigurer 已经被废除了

所以很多人会遇到这个错误。笔者也是查了N久资料,发现某位学php的牛人解决了该问题。是对spring的配置文件做一点修改:

将原来的:

改成:

这样,这个问题就解决了。想想原本的项目中,用的spring+mina没出现问题,真是个侥幸。。。

好了,下面把整合的写一下。

首先是用到的包,这里使用maven,pom.xml:

4.0.0

mymina

MyMina

0.0.1-SNAPSHOT

jar

MyMina

http://maven.apache.org

UTF-8

org.apache.felix

maven-bundle-plugin

true

org.slf4j

slf4j-jdk14

1.7.7

org.apache.mina

mina-integration-beans

2.0.7

org.springframework

spring-beans

4.0.6.RELEASE

org.apache.mina

mina-core

2.0.4

bundle

compile

org.apache.mina

mina-integration-spring

1.1.7

junit

junit

3.8.1

test

org.springframework

spring-context

4.0.6.RELEASE

org.slf4j

slf4j-log4j12

1.3.0

这里面有几个配置是比较讲究的,包括那个plugin和mina-core中的配置,配置有点差别,会报一个bundle的错误。

因为用maven,会方便很多,找包的时候,知道依赖就可以了。这里有个网站,可以查找自己需要的依赖包:http://mvnrepository.com/ ,这个网站很不错,类似以前的findjar.com。

然后是spring整合的配置:

http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

这里需要注意的问题,前面已经有写。

再者就是服务端和客户端的代码编写,服务端已经和spring整合了,里面配置了服务端的handler,所以这里主要是服务端的handler:

packagecn.org.handler;importorg.apache.mina.core.service.IoHandlerAdapter;importorg.apache.mina.core.session.IdleStatus;importorg.apache.mina.core.session.IoSession;public class HandlerTwo extendsIoHandlerAdapter {

@Overridepublic voidmessageReceived(IoSession session, Object message)throwsException {//TODO Auto-generated method stub//super.messageReceived(session, message);

System.out.println("received message :"+message);

}

@Overridepublic void sessionClosed(IoSession session) throwsException {//TODO Auto-generated method stub

super.sessionClosed(session);

}

@Overridepublic voidsessionIdle(IoSession session, IdleStatus status)throwsException {//TODO Auto-generated method stub

super.sessionIdle(session, status);

}

}

写一个启动入口:

packagecn.org.test;importorg.springframework.context.support.ClassPathXmlApplicationContext;public classTest {/***@paramargs*/

public static voidmain(String[] args) {

ClassPathXmlApplicationContext ct= new ClassPathXmlApplicationContext("applicationContext-mina.xml");

}

}

还缺少一个服务端的编码过滤器:

packagecn.org.handler;importjava.nio.charset.Charset;importorg.apache.mina.core.session.IoSession;importorg.apache.mina.filter.codec.ProtocolCodecFactory;importorg.apache.mina.filter.codec.ProtocolDecoder;importorg.apache.mina.filter.codec.ProtocolEncoder;importorg.apache.mina.filter.codec.textline.LineDelimiter;importorg.apache.mina.filter.codec.textline.TextLineDecoder;importorg.apache.mina.filter.codec.textline.TextLineEncoder;public class MyCodeFactory implementsProtocolCodecFactory {private finalTextLineEncoder encoder;private finalTextLineDecoder decoder;/*final static char endchar = 0x1a;*/

final static char endchar = 0x0d;publicMyCodeFactory() {this(Charset.forName("gb2312"));

}publicMyCodeFactory(Charset charset) {

encoder= newTextLineEncoder(charset, LineDelimiter.UNIX);

decoder= newTextLineDecoder(charset, LineDelimiter.AUTO);

}public ProtocolDecoder getDecoder(IoSession session) throwsException {//TODO Auto-generated method stub

returndecoder;

}public ProtocolEncoder getEncoder(IoSession session) throwsException {//TODO Auto-generated method stub

returnencoder;

}public intgetEncoderMaxLineLength() {returnencoder.getMaxLineLength();

}public void setEncoderMaxLineLength(intmaxLineLength) {

encoder.setMaxLineLength(maxLineLength);

}public intgetDecoderMaxLineLength() {returndecoder.getMaxLineLength();

}public void setDecoderMaxLineLength(intmaxLineLength) {

decoder.setMaxLineLength(maxLineLength);

}

}

这样,运行入口程序,服务端就启动了。除了入口,在spring中都有配置,包括端口这些。

然后写一个客户端:

客户端的handler:

packagecn.org.handler;importorg.apache.mina.core.service.IoHandlerAdapter;importorg.apache.mina.core.session.IdleStatus;importorg.apache.mina.core.session.IoSession;public class HandlerOne extendsIoHandlerAdapter {

@Overridepublic voidmessageReceived(IoSession session, Object message)throwsException {//TODO Auto-generated method stub//super.messageReceived(session, message);

System.out.println("message :"+message);

}

@Overridepublic void sessionClosed(IoSession session) throwsException {//TODO Auto-generated method stub

super.sessionClosed(session);

}

@Overridepublic voidsessionIdle(IoSession session, IdleStatus status)throwsException {//TODO Auto-generated method stub

super.sessionIdle(session, status);

}

@Overridepublic void messageSent(IoSession session, Object message) throwsException {

System.out.println("发送的消息是:"+message.toString());//super.messageSent(session, message);

}

@Overridepublic void sessionCreated(IoSession session) throwsException {super.sessionCreated(session);

}

@Overridepublic void sessionOpened(IoSession session) throwsException {super.sessionOpened(session);

}

}

客户端的入口:

packagecn.org.test;importjava.net.InetSocketAddress;importjava.nio.charset.Charset;importorg.apache.mina.core.future.ConnectFuture;importorg.apache.mina.filter.codec.ProtocolCodecFilter;importorg.apache.mina.filter.codec.textline.TextLineCodecFactory;importorg.apache.mina.filter.logging.LoggingFilter;importorg.apache.mina.transport.socket.nio.NioSocketConnector;importcn.org.handler.HandlerOne;public classClintTest {/***@paramargs*/

public static voidmain(String[] args) {//创建客户端连接器.

NioSocketConnector connector = newNioSocketConnector();

connector.getFilterChain().addLast("logger", newLoggingFilter() );

connector.getFilterChain().addLast("codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "GBK" )))); //设置编码过滤器

connector.setHandler(new HandlerOne());//设置事件处理器

ConnectFuture cf =connector.connect(new InetSocketAddress("127.0.0.1", 8888));//建立连接

cf.awaitUninterruptibly();//等待连接创建完成

cf.getSession().write("知识");//发送消息

cf.getSession().close(true);

cf.getSession().getCloseFuture().awaitUninterruptibly();//等待连接断开

connector.dispose();

}

}

这样,当服务端启动的时候,客户端发送一个信息,服务端就会收到,并作相应的处理。

运行结果

客户端控制台输出:

SLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in [jar:file:/C:/Users/wanglei/.m2/repository/org/slf4j/slf4j-jdk14/1.7.7/slf4j-jdk14-1.7.7.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/C:/Users/wanglei/.m2/repository/org/slf4j/slf4j-log4j12/1.3.0/slf4j-log4j12-1.3.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

SLF4J: Actual binding is of type [org.slf4j.impl.JDK14LoggerFactory]

八月 27, 2014 8:50:10 下午 org.apache.mina.filter.logging.LoggingFilter log

信息: CREATED

八月 27, 2014 8:50:10 下午 org.apache.mina.filter.logging.LoggingFilter log

信息: OPENED

八月 27, 2014 8:50:10 下午 org.apache.mina.filter.logging.LoggingFilter log

信息: SENT: HeapBuffer[pos=0 lim=0 cap=0: empty]

发送的消息是:知识

八月 27, 2014 8:50:10 下午 org.apache.mina.filter.logging.LoggingFilter log

信息: CLOSED

服务端输出:

SLF4J: Found binding in [jar:file:/C:/Users/wanglei/.m2/repository/org/slf4j/slf4j-log4j12/1.3.0/slf4j-log4j12-1.3.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

SLF4J: Actual binding is of type [org.slf4j.impl.JDK14LoggerFactory]

八月 27, 2014 8:50:10 下午 org.apache.mina.filter.logging.LoggingFilter log

信息: CREATED

八月 27, 2014 8:50:10 下午 org.apache.mina.filter.logging.LoggingFilter log

信息: OPENED

八月 27, 2014 8:50:10 下午 org.apache.mina.filter.logging.LoggingFilter log

信息: RECEIVED: 知识

received message :知识

八月 27, 2014 8:50:10 下午 org.apache.mina.filter.logging.LoggingFilter log

信息: CLOSED

java mina spring_Mina入门教程(二)----Spring4 集成Mina相关推荐

  1. Activiti 快速入门教程:SpringBoot 集成 Activiti6 + Activiti Modeler 流程配置可视化

    Activiti 快速入门教程:SpringBoot 集成 Activiti6 + Activiti Modeler 流程配置可视化 7大服务与核心表 23张表概览 7大核心服务(重要) 加依赖 内部 ...

  2. quarkus 入门教程(二) -项目开发模式热更新及项目断点调试方法

    quarkus 入门教程(二) -项目断点调试方法 1.项目热更新 quarkus:dev runs 方式启动,项目会以开发者模式启动,当修改了java文件或者resource文件后,项目会在后台编译 ...

  3. python elasticsearch 入门教程(二) ---全文搜索

    python elasticsearch 入门教程(二) ---全文搜索 截止目前的搜索相对都很简单:单个姓名,通过年龄过滤.现在尝试下稍微高级点儿的全文搜索--一项 传统数据库确实很难搞定的任务. ...

  4. R语言七天入门教程二:认识变量与运算符

    R语言七天入门教程二:认识变量与运算符 一.什么是变量 1.变量 顾名思义,我们可以将变量理解为"可以改变的量",是计算机语言中能储存计算结果或能表示值的抽象概念.这里的值可以是数 ...

  5. (转)tensorflow入门教程(二十六)人脸识别(上)

    https://blog.csdn.net/rookie_wei/article/details/81676177 1.概述 查看全文 http://www.taodudu.cc/news/show- ...

  6. Android WebRTC 入门教程(二) -- 模拟p2p本地视频传输

    Android WebRTC 入门教程(一) – 使用相机 Android WebRTC 入门教程(二) – 模拟p2p本地视频传输 源码工程: https://github.com/LillteZh ...

  7. Java基础小白入门教程-----百知教育java基础学习1---胡鑫喆

    Java基础小白入门教程(胡大大出品,彩蛋请自寻) 胡鑫喆 https://www.bilibili.com/video/BV1wE411V7Zo?from=search&seid=38511 ...

  8. LittleVGL (LVGL)干货入门教程二之LVGL的输入设备(indev)API对接。

    LittleVGL (LVGL)干货入门教程二之LVGL的输入设备(indev)API对接 前言: 阅读前,请确保你拥有以下条件: 你已经完成"显示API"的移植. 你已经实现了一 ...

  9. c语言类似于 n的标识符,C语言快速入门教程(二)

    C语言快速入门教程(二) C语言的基本语法 本节学习路线图: 引言: C语言,顾名思义就是一门语言,可以类比一下英语; 你要说出一个英语的句子需要: 单词 + 语法! 将单词按照一定的语法拼凑起来就成 ...

最新文章

  1. pymsql学习笔记
  2. mysql校对规则_MYSQL校对规则
  3. [CDA数据分析师学习之路] 【CDA就业班独家发布】学习之路
  4. WS-Security:使用BinarySecurityToken进行身份验证
  5. SSL 和 TLS 介绍
  6. 标准C程序设计七---66
  7. java 判断一个词是不是成语_Java 判断字符串a和b是否互为旋转词
  8. 一个 TypeScript keyof 泛型用法
  9. 计算机通信基础ppt,计算机网络第2章 数据通信基础知识要点课件.ppt
  10. static_cast, dynamic_cast, const_cast,reinterpret_cast探讨
  11. linux下main函数的返回值问题
  12. php 微信 token 刷新,自动更新微信access token
  13. 服务器系统小米随身wifi,win8.1系统安装小米随身wifi驱动详细操作步骤【图文教程】...
  14. UVA - 473 Raucous Rocker 多维dp
  15. (转)所谓“降维打击”到底什么意思?
  16. Sql 中text类型字段判断是否为空
  17. 使用N2N搭建虚拟局域网|可用于红警、我的世界联机
  18. SMART目标管理方法
  19. 无忌典藏《生态系列奥赛金奖》百度首发
  20. php获取股票接口数据接口,「股票数据」 使用Sina API获取新浪财经的证券股票数据接口(时价 K线等)...

热门文章

  1. DNS与安全简述(未完成)
  2. 中小企业服务器虚拟化部署方案:规划备份和灾难恢复
  3. Java实现图片文件上传
  4. 【练一下1】糖尿病遗传风险检测挑战赛 【讯飞开放平台】
  5. iOS逆向之某多多App抓包
  6. 删除u盘插拔记录linux,Linux清除U盘(USB)使用记录
  7. mysql cbo_如何使用CBO,CBO与RULE的区别
  8. 图文介绍——NC使用笔记
  9. 如何快速提取音频,无需下载app,简单便捷,快收藏
  10. 基于JAVA大学生规划平台计算机毕业设计源码+系统+lw文档+部署