`
Harold_xlp
  • 浏览: 159133 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

spring与mina集成

阅读更多

spring与mina集成可以让WEB用户在线聊天,现在网上的在线与我联系,是客户与后台的人员之间的互动;下面简单的将spring与mina集成的代码分享下:这里只能做在线的互动,但如果有一方不在线的话,需要将信息放到持久成去,等另一方上线后,再将信息发出去,所以后台还需要一个守侯线程来判断当用户上线后,是否有信息需要发送到该用户等;

 

配置文件:

<?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.xsd"
 default-lazy-init="false">

 <!-- This makes it possible to specify java.net.SocketAddress values (e.g.
  :80 below) as Strings. They will be converted into java.net.InetSocketAddress
  objects by Spring. -->
 <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
  <property name="customEditors">
   <map>
    <entry key="java.net.SocketAddress">
     <bean class="org.apache.mina.integration.beans.InetSocketAddressEditor" />
    </entry>
   </map>
  </property>
 </bean>

 <!-- The IoHandler implementation -->
 <bean id="myHandler" class="com.cigna.cmc.spring.socket.Server.MinaProtocolHandler" />

  //executorFilter多线程处理

 <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>

//处理对象流时候用ObjectSerializationCodecFactory
 <bean id="codecFilter" class="org.apache.mina.filter.codec.ProtocolCodecFilter">
  <constructor-arg>
   <bean
    class="org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory" />
  </constructor-arg>
 </bean>
 <bean id="loggingFilter" class="org.apache.mina.filter.logging.LoggingFilter" />

 <!-- The IoAcceptor which binds to port 1235 server side -->
 <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>

 <!-- The IoAcceptor which binds to port 1235 server side -->
 <bean id="minaAcceptor" class="org.apache.mina.transport.socket.nio.NioSocketAcceptor"
  init-method="bind" destroy-method="unbind">
  <property name="defaultLocalAddress" value=":1235" />
  <property name="handler" ref="myHandler" />
  <property name="reuseAddress" value="true" />
  <property name="filterChainBuilder" ref="filterChainBuilder" />
 </bean>
</beans> 

 

服务端的处理:

public class MinaProtocolHandler extends IoHandlerAdapter {
 private final Logger logger = LoggerFactory
   .getLogger(MinaProtocolHandler.class);

 private final Set<IoSession> sessions = Collections
   .synchronizedSet(new HashSet<IoSession>());

 public void sessionCreated(IoSession session) throws Exception {
  // session.write("direct come from server......");
   sessions.add(session);
 }

 // 当接收到客户端的请求信息后触发此方法.
 public void messageReceived(IoSession session, Object message) {
  if (message instanceof EntityTest) {
   if (session.getAttribute(((EntityTest) message).getUserName()) == null) {
    session.setAttribute(((EntityTest) message).getUserName(),
      message);
    sessions.add(session);
   }
  }
  System.out.println("session.getAttribute(userName) messageReceived"
    + session.getAttribute("userName"));
  System.out.println(((InetSocketAddress) session.getRemoteAddress())
    .getAddress().getHostAddress());
  System.out.println(message);
  System.out.println(((EntityTest) message).getUserName());
  System.out.println(((EntityTest) message).getHostName());
  Iterator<?> tempIter = sessions.iterator();
  IoSession tempSession = null;
  while (tempIter.hasNext()) {
   tempSession = (IoSession) tempIter.next();
   StringBuffer sb = new StringBuffer();
   sb.append("hostName="
     + ((InetSocketAddress) tempSession.getRemoteAddress())
       .getAddress()
     + "|port="
     + ((InetSocketAddress) tempSession.getRemoteAddress())
       .getPort());

   System.out.println(sb.toString());
   if (tempSession.getAttribute(((EntityTest) message).getUserName()) != null) {
    session.write("Server Send: " + message);
   }
  }
 }

 // 当信息已经传送给客户端后触发此方法.
 public void messageSent(IoSession session, Object message) throws Exception {

 }

 public void sessionIdle(IoSession session, IdleStatus status) {
  // disconnect an idle client
  session.close();
 }

 public void sessionClosed(IoSession session) throws Exception {
  sessions.remove(session);
 }

 public void exceptionCaught(IoSession session, Throwable cause) {
  logger.warn("Unexpected exception.", cause);
  session.close();
 }

}

 

 

 客户端调用代码:

public class MinaClientSupport {
 private IoHandler handler = null;

 private IoSession session;

 private String host;

 private int port;

 public boolean send(Object message) {
  if (session != null && session.isConnected()) {
   throw new IllegalStateException(
     "Already connected. Disconnect first.");
  }
  SocketAddress address = new InetSocketAddress(host, port);
  NioSocketConnector connector = new NioSocketConnector();
  try {

   connector.getFilterChain().addLast("mdc", new MdcInjectionFilter());

   connector.setHandler(handler);
   ConnectFuture future1 = connector.connect(address);
   future1.awaitUninterruptibly();
   if (!future1.isConnected()) {
    return false;
   }
   session = future1.getSession();

   // session.

   EntityTest et = new EntityTest();
   et.setHostName(((InetSocketAddress) session.getServiceAddress())
     .getHostName());

   et.setPort(((InetSocketAddress) session.getServiceAddress())
     .getPort());
   et.setMsg((String) message);
   et.setUserName("xlp");
   session.write(et);

   // session.wait();
   return true;
  } catch (Exception e) {
   return false;
  }
 }

 public void close() {
  if (session != null) {
   if (session.isConnected()) {
    // Wait until the chat ends.
    session.getCloseFuture().awaitUninterruptibly();
   }
   session.close();
  }
 }

 public String getHost() {
  return host;
 }

 public void setHost(String host) {
  this.host = host;
 }

 public int getPort() {
  return port;
 }

 public void setPort(int port) {
  this.port = port;
 }

 public void setHandler(IoHandler handler) {
  this.handler = handler;
 }

 public static void main(String[] args) {
  System.out.println("---------------------");
  MinaClientSupport client = new MinaClientSupport();
  MinaClientHandler handler = new MinaClientHandler();
  client.setHandler(handler);
  client.setHost("localhost");
  client.setPort(1235);
  
  String msg = "hello world!";
  client.send(msg);
  System.out.println("Client Send: " + msg);
  client.close();
 }

}

客户端的处理:

class MinaClientHandler extends IoHandlerAdapter {

 private static final IoFilter LOGGING_FILTER = new LoggingFilter();
 // ObjectSerializationCodecFactory TextLineCodecFactory
 private static final IoFilter CODEC_FILTER = new ProtocolCodecFilter(
   new ObjectSerializationCodecFactory());

 @Override
 public void sessionCreated(IoSession session) throws Exception {

  session.getFilterChain().addLast("codec", CODEC_FILTER);
  session.getFilterChain().addLast("logger", LOGGING_FILTER);
  // session.setAttribute("userName", "harold");
 }

 @Override
 public void messageReceived(IoSession session, Object message)
   throws Exception {
  String msg = (String) message;
  System.out.println("Client Received: " + msg);
 }

}

分享到:
评论

相关推荐

    基于spring的Mina框架

    Spring与Mina的整合** 在Spring中整合Mina,首先需要在Spring配置文件中声明Mina的相关bean,如Acceptor、ProtocolCodecFactory(编码解码工厂)和FilterChainBuilder(过滤器链构建器)。通过Spring的依赖注入,...

    spring boot 整合mina 串口

    **Spring Boot 整合Mina实现串口通信详解** 在Java开发中,有时我们需要与硬件设备进行串口通信,例如读取传感器数据或控制工业设备。Spring Boot作为一款轻量级的框架,使得快速构建应用变得简单。而Mina则是一款...

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

    3. **集成Mina**:引入Mina的相关依赖,然后在Spring配置中定义Mina的ServerBootstrap,包括Acceptor、ProtocolHandler以及相关的配置。Mina的IoHandler接口需要实现,用于处理接收到的网络事件。 4. **编写...

    mina 集成spring 传输文件和文本

    通过以上这些知识点的深入理解和实践,你可以成功地将Mina与Spring集成,构建一个能够同时处理文件和文本传输的服务。这个过程涉及到了网络通信、协议设计、框架集成等多个层面,对提升你的Java网络编程能力大有裨益...

    Mina例子包含与spring整合

    在这个"Mina例子包含与Spring整合"的项目中,我们将探讨如何将MINA与流行的Java企业级框架Spring进行集成。 1. **Apache MINA**:MINA是基于Java NIO(非阻塞I/O)的网络应用框架,用于构建高性能、跨平台的服务器...

    apache mina-spring 服务端程序

    通过这个项目,开发者可以学习到如何将Mina的异步I/O能力与Spring的容器管理及依赖注入机制结合,构建出健壮且易于维护的网络服务端程序。这包括理解Mina的事件模型、Spring的bean管理和网络编程的最佳实践。同时,...

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

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

    Mina-Spring-Hibernate.rar_mina_mina hibernate_spring mina

    Spring还提供了与各种持久层框架的集成,包括Hibernate。 3. Hibernate介绍 Hibernate是Java领域最流行的ORM框架之一,它提供了一种在Java应用中操作数据库的简便方式。通过映射Java对象到数据库表,Hibernate自动...

    详解spring集成mina实现服务端主动推送(包含心跳检测)

    Spring集成Mina实现服务端主动推送(包含心跳检测) 本篇文章主要介绍了Spring集成Mina实现服务端主动推送(包含心跳检测),具有一定的参考价值,以下是对该知识点的详细解释和总结。 一、Spring集成Mina的配置 ...

    springboot集成mina分布式

    springboot集成mina做分布式的soket服务,思路:用java线性安全的集合存储mina session到本地服务器;同时用redis等nosql缓存mina session存储服务器的ip,session的id等信息到redis上;应用服务器直接用restful等...

    maven_spring mvc_mina dome

    总结来说,这个项目为初学者提供了一个实战案例,让他们能够了解和实践Maven、Spring MVC与Mina的集成,理解它们各自的作用以及如何协同工作,从而提升在分布式系统和高性能网络编程方面的技能。

    springboot整合mina

    SpringBoot整合Mina是一个常见的Java开发任务,它涉及到SpringBoot框架与Apache Mina网络通信库的集成。Mina是一个轻量级、高性能的网络应用框架,主要用于构建服务器端的网络应用,如TCP/IP和UDP协议的服务。而...

    mina+spring+hibernate搭建所需jar包

    在与MINA和Hibernate集成时,Spring可以用来管理服务端的bean,以及数据访问对象(DAO)和事务管理。 3. **Hibernate ORM**: Hibernate是一个强大的ORM框架,能够将Java对象映射到关系数据库中的表,从而减少了...

    springboot 深度整合mina开箱即用

    在本文中,我们将深入探讨如何将Spring Boot与Mina进行深度整合,以便为新手开发者提供一个开箱即用的解决方案。Spring Boot以其简洁的配置和快速的开发体验,已经成为Java领域中的主流微服务框架,而Mina则是一个...

    spring mina

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

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

    标题中的"mina 与spring的结合开发,包头指令"可能是指在使用MINA构建网络服务时,如何利用Spring框架来管理和配置MINA的应用上下文,以及如何通过Spring的配置来定义和处理网络通信中的包头信息。 在MINA中,数据...

    spring boot + mina 项目中copy出来的

    在Spring Boot项目中集成Mina,可以创建出高效、灵活的服务器端应用,比如开发聊天服务、远程控制程序或者是游戏服务器。下面将详细介绍这两个框架的结合使用以及项目实战中的应用。 1. **Spring Boot简介** ...

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

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

    Mina+Struts2+Spring4+Mybatis3组合

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

    mina+spring做的聊天室程序

    《基于Mina与Spring构建的聊天室程序详解》 在当今的互联网世界中,实时通信技术扮演着至关重要的角色,而Mina与Spring框架的结合则为开发高效、稳定的聊天室程序提供了强大的支持。本文将深入探讨如何利用Mina作为...

Global site tag (gtag.js) - Google Analytics