- 浏览: 1017764 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (826)
- 硬件 (8)
- 软件 (24)
- 软件工程 (34)
- JAVA (229)
- C/C++/C# (77)
- JavaScript (8)
- PHP (1)
- Ruby (3)
- MySQL (14)
- 数据库 (19)
- 心情记事 (12)
- 团队管理 (19)
- Hadoop (1)
- spring (22)
- mybatis(ibatis) (7)
- tomcat (16)
- velocity (0)
- 系统架构 (6)
- JMX (8)
- proxool (1)
- 开发工具 (16)
- python (10)
- JVM (27)
- servlet (5)
- JMS (26)
- ant (2)
- 设计模式 (5)
- 智力题 (2)
- 面试题收集 (1)
- 孙子兵法 (16)
- 测试 (1)
- 数据结构 (7)
- 算法 (22)
- Android (11)
- 汽车驾驶 (1)
- lucene (1)
- memcache (12)
- 技术架构 (7)
- OTP-Erlang (7)
- memcached (17)
- redis (20)
- 浏览器插件 (3)
- sqlite (3)
- Heritrix (9)
- Java线程 (1)
- scala (0)
- Mina (6)
- 汇编 (2)
- Netty (15)
- libevent (0)
- CentOS (12)
- mongod (5)
- mac os (0)
最新评论
-
kingasdfg:
你这里面存在一个错误添加多个任务 应该是这样的 /** * ...
Quartz的任务的临时启动和暂停和恢复【转】 -
kyzeng:
纠正一个错误,long型对应的符号是J,不是L。
Jni中C++和Java的参数传递 -
zhaohaolin:
抱歉,兄弟,只是留下作记录,方便学习,如果觉得资料不好,可以到 ...
netty的个人使用心得【转】 -
cccoooccooco:
谢谢!自己一直以为虚机得使用网线才可以与主机连接呢。。
主机网卡无网线连接与虚拟机通信 -
yuqilin001:
要转别人的东西,请转清楚点嘛,少了这么多类,误人子弟
netty的个人使用心得【转】
项目结构图如下:
说明:
com.test.server包下是mina的服务端程序, MinaServer_Unuse.java 类就是一般的mina服务端主类, 但这里不用它来启动, 而是通过applicationContext-minaServer.xml 来启动.
但这个spring配置文件不会自己启动,所以用到 com.test.action包下的 InitListener.java来调用这个spring配置文件, 达到启动的目的.
com.test.client包是个普通的mina客户端类, 这里主要用来检查与spring结合后的mina服务端运行是否正常.
项目会发布到tomcat进行测试.
注: 本文基本不会讲解mina如何使用, 这种文章很多. 所有代码复制过去即可观察效果
InitListener.java:
package com.test.action;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class InitListener implements ServletContextListener {
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
}
public void contextInitialized(ServletContextEvent sce) {
new ClassPathXmlApplicationContext("applicationContext-minaServer.xml");
//在tomcat的启动过程中,会看到控制台打印此语句.
System.out.println("********mina server 启动完毕*********");
}
}
SomeServer:
package com.test.action;
/** 这个类主要是通过spring注入给MinaServerHandler用的,表示: mina在接收到信息后,该由主要业务类来处理了. 仅作演示用 */
public class SomeServer {
public void doSome(){
System.out.println("someServer todo something!");
}
}
MinaClient:
package com.test.client;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
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.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
/**
* 客户端
* @author yan
*/
public class MinaClient {
public void start() throws IOException{
NioSocketConnector connector = new NioSocketConnector();
// connector.getFilterChain().addLast( "logger", new LoggingFilter() );
//设置编码过滤器
connector.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));
connector.setConnectTimeoutMillis(10000);
connector.setHandler(new MinaClientHandler());
ConnectFuture cf = connector.connect(new InetSocketAddress("192.168.1.83",10000));
//等待连接创建完成
cf.awaitUninterruptibly();
IoSession session = cf.getSession();
System.out.println("客户端准备完毕");
//以下是等待控制台的输入
while(true){
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String line = in.readLine();
try {
if(!"".equals(line)){
session.write(line);
} else if("quit".equals(line)){
break;
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("服务端关闭了连接");
}
}
session.getCloseFuture().awaitUninterruptibly();
connector.dispose();
}
public static void main(String[] args) {
try {
new MinaClient().start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
MinaClientHandler:
package com.test.client;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
/**
* 客户端事件处理类
* @author yan
*/
public class MinaClientHandler extends IoHandlerAdapter {
@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
System.out.println("服务端关闭了连接");
}
@Override
public void messageReceived(IoSession session, Object message)throws Exception {
System.out.println("客户端接收到的消息: "+message);
}
@Override
public void sessionCreated(IoSession session) throws Exception {
System.out.println("客户端连接上服务器");
}
}
MinaServerHandler:
package com.test.server;
import java.net.InetSocketAddress;
import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import com.test.action.SomeServer;
/**
* mina服务端的的事件处理类
* @author yan
*/
public class MinaServerHandler extends IoHandlerAdapter {
private SomeServer someServer;
public void setSomeServer(SomeServer someServer) {
this.someServer = someServer;
}
@Override
public void exceptionCaught(IoSession session, Throwable cause){
try {
System.out.println("客户端 "+session.getRemoteAddress()+" 关闭了连接");
} catch (Exception e) {
// TODO: handle exception
}
}
/**
* 服务端接收消息
*/
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
someServer.doSome();
String msg = message.toString();
if("quit".equals(msg)){
session.close(false);
return;
}
//对客户端做出的响应
for (Iterator<String> it = sessions.keySet().iterator(); it.hasNext();) {
IoSession ss = sessions.get(it.next());
ss.write( "message from server:: "+session.getRemoteAddress()+" 说: " + msg );//返回客户端发送过来的消息
}
}
/**
* 客户端连接的会话创建
*/
@Override
public void sessionCreated(IoSession session) throws Exception {
InetSocketAddress isa = (InetSocketAddress)session.getRemoteAddress();
System.out.println("客户端:"+isa.getAddress().getHostAddress()+":"+isa.getPort()+" 连接进来了");
sessions.put(session.getRemoteAddress().toString(), session);
}
private ConcurrentMap<String, IoSession> sessions=new ConcurrentHashMap<String, IoSession>();
}
MiniServer_Unuse:
package com.test.server;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* mina服务端. 这个类不会用,除非你要手动来启动.
* @author yan
*
*/
public class MiniServer_Unuse {
private static final int port = 10000;
public void start() throws IOException {
// 用于创建服务端的监听
IoAcceptor acceptor = new NioSocketAcceptor();
// acceptor.getFilterChain().addLast("logger", new LoggingFilter() );
// 编码过滤器
// acceptor.getFilterChain().addLast("encode", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
acceptor.getFilterChain().addLast("encode",new ProtocolCodecFilter(new MyCodecFactory()));
// 设置事件处理类\
acceptor.setHandler(new MinaServerHandler());
// 设置地址和端口
acceptor.setDefaultLocalAddress(new InetSocketAddress("192.168.1.100",port));
acceptor.bind();
System.out.println("服务端准备完毕");
}
public static void main(String[] args) {
new ClassPathXmlApplicationContext("applicationContext.xml");
try {
new MiniServer_Unuse().start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
MyCodecFactory:
package com.test.server;
import java.nio.charset.Charset;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
package com.test.server;
import java.nio.charset.Charset;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
/**
* <style type="text/css">body{background:#C7EDCC;}</style>
* 这个类集成自TextLineCodecFactory, 表示对mina的数据的解析方式.
* 本来可以直接用TextLineCodecFactory的, 但这个类的目的是表示我们可以有自己的方式来解析.
* MyCodecFactory.java
* @author yan
*/
public class MyCodecFactory extends TextLineCodecFactory {
public MyCodecFactory(){
super(Charset.forName("UTF-8"));
}
}
public class MyCodecFactory extends TextLineCodecFactory {
public MyCodecFactory(){
super(Charset.forName("UTF-8"));
}
}
applicationContext-minaServer.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans
"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
">
<!-- 这里是那个自定义的类 -->
<bean id="someServer" class="com.test.action.SomeServer"></bean>
<!-- 自定义的serverHandler -->
<bean id="serverHandler" class="com.test.server.MinaServerHandler">
<property name="someServer" ref="someServer"></property>
</bean>
<!-- 自定义的编码过滤器 -->
<bean id="myCodecFilter" class="org.apache.mina.filter.codec.ProtocolCodecFilter">
<constructor-arg>
<bean class="com.test.server.MyCodecFactory" />
</constructor-arg>
</bean>
<!-- 指定服务端地址和端口 -->
<bean id="address" class="java.net.InetSocketAddress">
<constructor-arg index="0" value="192.168.1.100"/>
<constructor-arg index="1" value="10000"/>
</bean>
<!-- 日志filter -->
<bean id="loggingFilter" class="org.apache.mina.filter.logging.LoggingFilter" />
<!--
<bean id="executorFilter" class="org.apache.mina.filter.executor.ExecutorFilter" />
<bean id="mdcInjectionFilter" class="org.apache.mina.filter.logging.MdcInjectionFilter">
<constructor-arg value="remoteAddress" />
</bean> -->
<bean id="codecFilter" class="org.apache.mina.filter.codec.ProtocolCodecFilter">
<constructor-arg>
<!-- <bean class="org.apache.mina.filter.codec.textline.TextLineCodecFactory" /> -->
<!-- 自定义的字符编码类 -->
<bean class="com.test.server.MyCodecFactory"></bean>
</constructor-arg>
</bean>
<!-- 过滤器链 -->
<bean id="filterChainBuilder" class="org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder">
<property name="filters">
<map>
<!--
<entry key="executor" value-ref="executorFilter" />
<entry key="mdcInjectionFilter" value-ref="mdcInjectionFilter" />
-->
<entry key="codecFilter" value-ref="codecFilter" />
<!-- <entry key="loggingFilter" value-ref="loggingFilter" /> -->
</map>
</property>
</bean>
<!-- 开始运行socket服务 -->
<bean id="ioAcceptor" class="org.apache.mina.transport.socket.nio.NioSocketAcceptor"
init-method="bind" destroy-method="unbind">
<property name="defaultLocalAddress" ref="address" />
<property name="handler" ref="serverHandler" />
<property name="filterChainBuilder" ref="filterChainBuilder" />
<property name="reuseAddress" value="true" />
</bean>
</beans>
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee
"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd
">
<listener>
<listener-class>com.test.action.InitListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
部署, 启动(如下图):
F11运行MinaClient.java, 并在控制台输入一些话, 会看到服务端的返回信息(如下图).
在切换回tomcat的控制台视图, 观察服务端部分的打印(如下图):
发表评论
-
调试jdk中的源码,查看jdk局部变量
2013-06-15 23:30 1055调试jdk中的源码,查看jdk局部变量 2012-04 ... -
Eclipse快捷键 10个最有用的快捷键<转>
2013-04-11 23:28 1082Eclipse中10个最有用的快捷键组合 一个Eclip ... -
Lucene 3.6 中文分词、分页查询、高亮显示等
2012-12-09 23:35 18241、准备工作 下载lucene 3.6.1 : htt ... -
Maven实战(九)——打包的技巧(转)
2012-10-12 00:41 941“打包“这个词听起 ... -
基于Maven的web工程如何配置嵌入式Jetty Server开发调试环境(转)
2012-10-12 00:28 9421、首先在web工程的POM文件里添加依赖jar包如下: ... -
轻轻松松学Solr(1)--概述及安装[转]
2012-09-18 14:59 998概述 这段时间对企 ... -
分析Netty工作流程[转]
2012-09-04 19:02 893下面以Netty中Echo的例 ... -
让eclipse在ubuntu下面好看一点
2012-03-27 10:17 925<p> </p> <h1 cla ... -
zookeeper安装和应用场合(名字,配置,锁,队列,集群管理)[转]
2012-01-12 17:59 1653安装和配置详解 本文 ... -
Jakarta-Common-BeanUtils使用笔记[转]
2012-01-10 14:13 1160Jakarta-Common-BeanUtils ... -
一个关于Java Thread wait(),notify()的实用例【转】
2012-01-07 16:05 1024///// // ProducerConsume ... -
Java基础:Java中的 assert 关键字解析【转】
2012-01-06 19:50 1066J2SE 1.4在语言上提供了 ... -
一篇不错的讲解Java异常的文章(转载)----感觉很不错,读了以后很有启发[转]
2012-01-06 15:02 1272六种异常处理的陋习 ... -
如何解决HP QC(Quality Center)在Windows 7下不能工作的问题
2011-12-26 10:48 1588HP QC(Quantity Center) 是一款不错的测 ... -
JAVA读写文件,中文乱码 【转】
2011-12-19 23:43 2123最近在做HTML静态生成,需要从硬盘上把模版文件的内容读出来。 ... -
Java 6 JVM参数选项大全(中文版)【转】
2011-12-19 19:51 974Java 6 JVM参数选项大全(中文版) 作者 ... -
使用assembly plugin实现自定义打包【转】
2011-12-13 01:58 975在上一篇文章中,讨论到在对maven的机制不熟悉的情况下,为了 ... -
使用maven ant task实现非标准打包[转]
2011-12-13 01:56 1050maven很强大,但是总有些事情干起来不是得心应手,没有使用a ... -
Java日期转换SimpleDateFormat格式大全【转】
2011-12-08 20:22 131924小时制时间 显示: public clas ... -
使用Spring的表单标签库
2011-11-22 20:08 107813.9. 使用Spring的 ...
相关推荐
- 首先,引入Mina2和Spring的相关依赖库到项目中,如`lib`目录下的JAR文件。 - 在`src`目录下创建Spring的配置文件,定义Bean,包括Mina的ServerBootstrap、Acceptor、ProtocolDecoder和Encoder等。 - 创建Mina的...
Spring Boot和Mina是两个在Java开发中广泛使用的框架,它们在构建高性能网络应用时有着重要作用。Spring Boot简化了Spring应用程序的配置和启动过程,而Apache Mina则是一个高效的网络通信框架,它提供了多种网络...
标题中的"SSI+Mina2(Struts2+Spring4+Mybatis3+Mina2)集成发布就可运行"指的是一个基于Java的Web应用程序开发框架的整合,它结合了多种技术来构建高效、灵活和可扩展的网络应用。这个集成方案主要包括以下组件: 1....
在这个"apache mina-spring 服务端程序"项目中,Mina和Spring被整合在一起,创建了一个高效的服务端程序。这样的整合允许开发者利用Spring的强大功能来管理服务端的生命周期,配置网络连接,以及处理业务逻辑。...
在Spring框架的支持下,Mina的使用变得更加便捷,能够更好地融入到Spring的IoC(Inversion of Control)和AOP(Aspect-Oriented Programming)体系中,从而实现服务的灵活配置和管理。 **1. Mina框架的核心组件** ...
Spring通过HibernateTemplate或JpaTemplate提供了一套便捷的数据库操作接口,封装了Hibernate的操作,使得在Spring应用中使用Hibernate变得简单。同时,Spring还支持基于注解的事务管理,可以无缝地与Hibernate配合...
在结合Spring进行开发时,我们可以通过Spring的配置文件定义IoFilter,这些IoFilter在数据传递过程中处理包头,如解析包头信息、校验包头等。 以下是结合Spring和MINA进行开发的一些关键知识点: 1. **集成MINA到...
4. **在Spring Boot应用中使用** 在Spring Boot的主类或者服务类中,我们可以注入`MinaSerialHandler`实例,然后调用`sendData()`方法来发送数据,或者在其他地方监听`messageReceived()`方法来处理接收到的数据。 ...
Spring 和 Mina 结合使用可以构建高性能的网络通信应用,而Spring MVC 是Spring 框架的一个模块,专门用于处理Web请求。在这个"spring+mina实现http接口服务端通信客户端"的项目中,我们将深入探讨如何整合这两个...
该项目是本人真实项目中使用到的mina + spring+struts2 + mybatis框架,里面有详细的注释说明,以及一个完整的接收消息、入库、返回例子。对需要真实项目开发的人员来说,可以直接使用。 另外,如果需要更加详细的...
5. **MinaExample项目**:这个项目可能包含了一个或多个示例,演示了如何在Spring环境中配置和启动一个MINA服务器,以及如何创建MINA客户端。可能涉及的文件包括配置文件(如`applicationContext.xml`),MINA的服务...
【标题】"maven_spring mvc_mina dome" 涉及到的是一个整合了Maven、Spring MVC和Mina的示例项目,旨在帮助初学者理解和掌握如何在实际开发中结合这三个技术栈。 【Spring MVC】是Spring框架的一部分,它是一个用于...
这个主题探讨的是如何通过Mina和Spring结合实现文件和文本的双向传输。 **描述解读:**"用一个监听既可以传文件又可以传文本" 这里的描述表明我们将构建一个监听器,该监听器能够同时处理文件和文本数据的发送与...
要将Spring Boot与Mina整合,首先我们需要在`pom.xml`文件中添加Mina和Spring Boot的相关依赖。接着,在Spring Boot应用中创建一个Mina服务器,这通常涉及以下步骤: - **创建Mina配置类**:定义Mina服务器的配置,...
spring结合Mina的配置文件,设计到spring构造 属性编辑器
在项目中使用Hibernate,可以极大地提高开发效率,同时降低数据库操作的错误率。 整合这三个框架,通常的步骤如下: - 首先,添加所有必要的jar包到项目类路径。压缩包中的jar包可能包括MINA的核心库,Spring的...
总之,结合Mina的网络通信能力与Spring的控制层设计,我们可以在非Web环境下构建类似Web项目的开发模式,满足移动终端的需求。这种集成方式不仅提高了开发效率,也降低了系统复杂性,为开发者提供了更灵活的解决方案...
在构建多人聊天室程序时,首先我们需要在Spring配置文件中定义Mina的相关bean,包括ServerSocketConnector、ProtocolDecoder和ProtocolEncoder等。这些bean负责监听客户端连接、解析接收到的数据以及编码发送给...
在"Spring-mybaits-mina三大框架的整合"中,我们将看到如何将这三大框架集成到一个项目中,以实现更高效、更灵活的网络服务和数据访问。首先,Spring作为整体架构的基石,它的依赖注入特性使得我们可以方便地管理...
这个"spring mina"的示例项目很可能是为了演示如何在Spring框架中集成Mina,以便构建服务器端和客户端的网络通信应用。让我们深入探讨Spring Mina的关键概念和应用场景。 1. **Spring Mina简介** Spring Mina是...