`
zhaohaolin
  • 浏览: 1017764 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Mina2和Spring(2.5)在web项目中的结合使用

    博客分类:
  • JAVA
 
阅读更多

项目结构图如下:

Mina2和Spring(2.5)在web项目中的结合使用 - abjuration - abjuration  

说明: 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>


部署, 启动(如下图):

Mina和Spring(2.5)在web项目中的结合使用 - abjuration - abjuration
看到了打印的信息. 说明启动成功了.


F11运行MinaClient.java, 并在控制台输入一些话, 会看到服务端的返回信息(如下图).

Mina和Spring(2.5)在web项目中的结合使用 - abjuration - abjuration
 

 在切换回tomcat的控制台视图, 观察服务端部分的打印(如下图):

Mina和Spring(2.5)在web项目中的结合使用 - abjuration - abjuration
 
OK, that's all.
分享到:
评论

相关推荐

    mina2+spring结合实例

    - 首先,引入Mina2和Spring的相关依赖库到项目中,如`lib`目录下的JAR文件。 - 在`src`目录下创建Spring的配置文件,定义Bean,包括Mina的ServerBootstrap、Acceptor、ProtocolDecoder和Encoder等。 - 创建Mina的...

    spring boot + mina 项目中copy出来的

    Spring Boot和Mina是两个在Java开发中广泛使用的框架,它们在构建高性能网络应用时有着重要作用。Spring Boot简化了Spring应用程序的配置和启动过程,而Apache Mina则是一个高效的网络通信框架,它提供了多种网络...

    SSI+Mina2(Struts2+Spring4+Mybatis3+Mina2)集成发布就可运行

    标题中的"SSI+Mina2(Struts2+Spring4+Mybatis3+Mina2)集成发布就可运行"指的是一个基于Java的Web应用程序开发框架的整合,它结合了多种技术来构建高效、灵活和可扩展的网络应用。这个集成方案主要包括以下组件: 1....

    apache mina-spring 服务端程序

    在这个"apache mina-spring 服务端程序"项目中,Mina和Spring被整合在一起,创建了一个高效的服务端程序。这样的整合允许开发者利用Spring的强大功能来管理服务端的生命周期,配置网络连接,以及处理业务逻辑。...

    基于spring的Mina框架

    在Spring框架的支持下,Mina的使用变得更加便捷,能够更好地融入到Spring的IoC(Inversion of Control)和AOP(Aspect-Oriented Programming)体系中,从而实现服务的灵活配置和管理。 **1. Mina框架的核心组件** ...

    Mina-Spring-Hibernate.rar_mina_mina hibernate_spring mina

    Spring通过HibernateTemplate或JpaTemplate提供了一套便捷的数据库操作接口,封装了Hibernate的操作,使得在Spring应用中使用Hibernate变得简单。同时,Spring还支持基于注解的事务管理,可以无缝地与Hibernate配合...

    mina 与spring的结合开发,包头指令

    在结合Spring进行开发时,我们可以通过Spring的配置文件定义IoFilter,这些IoFilter在数据传递过程中处理包头,如解析包头信息、校验包头等。 以下是结合Spring和MINA进行开发的一些关键知识点: 1. **集成MINA到...

    spring boot 整合mina 串口

    4. **在Spring Boot应用中使用** 在Spring Boot的主类或者服务类中,我们可以注入`MinaSerialHandler`实例,然后调用`sendData()`方法来发送数据,或者在其他地方监听`messageReceived()`方法来处理接收到的数据。 ...

    spring+mina实现http接口服务端通信客户端

    Spring 和 Mina 结合使用可以构建高性能的网络通信应用,而Spring MVC 是Spring 框架的一个模块,专门用于处理Web请求。在这个"spring+mina实现http接口服务端通信客户端"的项目中,我们将深入探讨如何整合这两个...

    Mina+Struts2+Spring4+Mybatis3组合

    该项目是本人真实项目中使用到的mina + spring+struts2 + mybatis框架,里面有详细的注释说明,以及一个完整的接收消息、入库、返回例子。对需要真实项目开发的人员来说,可以直接使用。 另外,如果需要更加详细的...

    Mina例子包含与spring整合

    5. **MinaExample项目**:这个项目可能包含了一个或多个示例,演示了如何在Spring环境中配置和启动一个MINA服务器,以及如何创建MINA客户端。可能涉及的文件包括配置文件(如`applicationContext.xml`),MINA的服务...

    maven_spring mvc_mina dome

    【标题】"maven_spring mvc_mina dome" 涉及到的是一个整合了Maven、Spring MVC和Mina的示例项目,旨在帮助初学者理解和掌握如何在实际开发中结合这三个技术栈。 【Spring MVC】是Spring框架的一部分,它是一个用于...

    mina 集成spring 传输文件和文本

    这个主题探讨的是如何通过Mina和Spring结合实现文件和文本的双向传输。 **描述解读:**"用一个监听既可以传文件又可以传文本" 这里的描述表明我们将构建一个监听器,该监听器能够同时处理文件和文本数据的发送与...

    springboot 深度整合mina开箱即用

    要将Spring Boot与Mina整合,首先我们需要在`pom.xml`文件中添加Mina和Spring Boot的相关依赖。接着,在Spring Boot应用中创建一个Mina服务器,这通常涉及以下步骤: - **创建Mina配置类**:定义Mina服务器的配置,...

    spring结合Mina

    spring结合Mina的配置文件,设计到spring构造 属性编辑器

    mina+spring+hibernate搭建所需jar包

    在项目中使用Hibernate,可以极大地提高开发效率,同时降低数据库操作的错误率。 整合这三个框架,通常的步骤如下: - 首先,添加所有必要的jar包到项目类路径。压缩包中的jar包可能包括MINA的核心库,Spring的...

    mina_spring模仿springmvc控制器

    总之,结合Mina的网络通信能力与Spring的控制层设计,我们可以在非Web环境下构建类似Web项目的开发模式,满足移动终端的需求。这种集成方式不仅提高了开发效率,也降低了系统复杂性,为开发者提供了更灵活的解决方案...

    mina+spring实现多人聊天室程序

    在构建多人聊天室程序时,首先我们需要在Spring配置文件中定义Mina的相关bean,包括ServerSocketConnector、ProtocolDecoder和ProtocolEncoder等。这些bean负责监听客户端连接、解析接收到的数据以及编码发送给...

    Spring-mybaits-mina三大框架的整合

    在"Spring-mybaits-mina三大框架的整合"中,我们将看到如何将这三大框架集成到一个项目中,以实现更高效、更灵活的网络服务和数据访问。首先,Spring作为整体架构的基石,它的依赖注入特性使得我们可以方便地管理...

    spring mina

    这个"spring mina"的示例项目很可能是为了演示如何在Spring框架中集成Mina,以便构建服务器端和客户端的网络通信应用。让我们深入探讨Spring Mina的关键概念和应用场景。 1. **Spring Mina简介** Spring Mina是...

Global site tag (gtag.js) - Google Analytics