本次练习中是监听2个端口

applicationContext-mina.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//spring//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> 
<beans>

<bean 
  class="org.springframework.beans.factory.config.CustomEditorConfigurer"> 
  <property name="customEditors"> 
   <map> 
    <entry key="Java.net.SocketAddress"> 
     <bean 
      class="org.apache.mina.integration.spring.InetSocketAddressEditor" /> 
    </entry> 
   </map> 
  </property> 
 </bean>

<!--创建服务器-->

<bean id="ioAcceptor" 
  class="org.apache.mina.integration.spring.IoAcceptorFactoryBean"> 
  <property name="target"> 
   <bean 
    class="org.apache.mina.transport.socket.nio.SocketAcceptor" /> 
  </property> 
  <property name="bindings"> 
    <list>//这里是个list 里面可以创建多个监听 
    <bean 
     class="org.apache.mina.integration.spring.Binding"> 
     <property name="address" value=":8888" /> //监听端口:8888 
     <property name="handler" ref="SampleHandler" />// SampleHandler:定义服务器的handler 
     <property name="serviceConfig"> 
      <bean 
       class="org.apache.mina.transport.socket.nio.SocketAcceptorConfig"> 
       <property name="filterChainBuilder "//配置filter 
        ref="filterChainBuilder" /> //指向: filterChainBuilder 
       <property name="reuseAddress" value="true" /> 
      </bean> 
     </property> 
    </bean> 
     
    <bean 
     class="org.apache.mina.integration.spring.Binding"> 
     <property name="address" value=":9999" /> //第二个监听端口:9999 
     <property name="handler" ref="bossSampleHandler" /> //监听该端口的 handler 
     <property name="serviceConfig"> 
      <bean 
       class="org.apache.mina.transport.socket.nio.SocketAcceptorConfig"> 
       <property name="filterChainBuilder" 
        ref="filterChainBuilder" /> 
       <property name="reuseAddress" value="true" /> 
      </bean> 
     </property> 
    </bean> 
     
   </list> 
  </property> 
 </bean> 
 <bean id="SampleHandler" class="cn.org.handler.HandlerTwo" /> 
 <bean id="bossSampleHandler" class="cn.org.handler.HandlerOne" />

//定义filter 
 <bean id="filterChainBuilder" 
  class="org.apache.mina.integration.spring.DefaultIoFilterChainBuilderFactoryBean"> 
  <property name="filters"> 
   <list> 
    <bean 
     class="org.apache.mina.filter.codec.ProtocolCodecFilter"> 
     <constructor-arg> 
        <bean 
       class="org.apache.mina.filter.codec.textline.TextLineCodecFactory" />  //这个是编码格式filter 
     </constructor-arg> 
    </bean> 
    <bean class="org.apache.mina.filter.LoggingFilter" / >//日志的filter 
   </list> 
  </property> 
 </bean> 
</beans>

sprng的简单配置文件就是这样:

然后看 handler:

SampleHandler 和 bossSampleHandler 。我写的都是一样的:

package cn.org.handler;

import org.apache.mina.common.IdleStatus; 
import org.apache.mina.common.IoHandlerAdapter; 
import org.apache.mina.common.IoSession;

public class HandlerOne extends IoHandlerAdapter {

public HandlerOne() { 
  // TODO Auto-generated constructor stub 
 }

@Override 
 public void exceptionCaught(IoSession session, Throwable cause) 
   throws Exception {

}

@Override 
 public void messageReceived(IoSession session, Object message) 
   throws Exception { 
  // TODO Auto-generated method stub 
  System.out.println("收到信息"); 
  System.out.println("message :"+message.toString()); 
 }

@Override 
 public void messageSent(IoSession session, Object message) throws Exception { 
      System.out.println("小心发送"); 
 }

@Override 
 public void sessionClosed(IoSession session) throws Exception { 
  // TODO Auto-generated method stub 
  super.sessionClosed(session); 
 }

@Override 
 public void sessionCreated(IoSession session) throws Exception { 
  System.out.println(session.getRemoteAddress().toString() +"---create");

}

@Override 
 public void sessionIdle(IoSession session, IdleStatus status) 
   throws Exception { 
               System.out.println(session.getServiceAddress() +"IDS"); 
 }

@Override 
 public void sessionOpened(IoSession session) throws Exception { 
     System.out.println("连接打开:"+session.getLocalAddress()); 
 }

}

现在测试:

Test.java

public class Test {

/** 
  * @param args 
  */ 
 public static void main(String[] args) { 
  ClassPathXmlApplicationContext ct =    new ClassPathXmlApplicationContext("applicationContext-mina.xml");

}

}

控制台打印出:

2010-1-16 19:00:51 org.springframework.context.support.AbstractApplicationContext prepareRefresh 
信息: Refreshingorg.springframework.context.support.ClassPathXmlApplicationContext@4b4333: display name [org.springframework.context.support.ClassPathXmlApplicationContext@4b4333]; startup date [Sat Jan 16 19:00:51 CST 2010]; root of context hierarchy 
2010-1-16 19:00:51 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
信息: Loading XML bean definitions from class path resource [applicationContext-mina.xml] 
2010-1-16 19:00:51 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory 
信息: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@4b4333]:org.springframework.beans.factory.support.DefaultListableBeanFactory@1975b59
2010-1-16 19:00:52 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 
信息: Pre-instantiating singletons inorg.springframework.beans.factory.support.DefaultListableBeanFactory@1975b59: defining beans [org.springframework.beans.factory.config.CustomEditorConfigurer#0,ioAcceptor,SampleHandler,bossSampleHandler,filterChainBuilder]; root of factory hierarchy

表明服务器就已经启动了:

现在你可以用telent的方式测试。也可以写个客户端的测试类:

写了个客户端的测试类:Clint.java

public class Clint {

/** 
  * @param args 
  */ 
  
 final static char end = 0x1a; 
  
 public static void main(String[] args) { 
     SocketConnector connector = new SocketConnector(); 
  SocketAddress address = new InetSocketAddress("127.0.0.1", 8888); 
  SocketConnectorConfig config = new SocketConnectorConfig(); 
  config.setConnectTimeout(10);// 秒 
  connector.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "GB2312" )))); //设置编码过滤器  
  connector.getFilterChain().addLast( "logger", new org.apache.mina.filter.LoggingFilter() );

IoSession session =null; 
  ConnectFuture cf = connector.connect(address, new ClintHandler(), 
    config); 
  cf.join(); 
  if (cf.isConnected()) { 
   session = cf.getSession(); 
   System.out.println("连接成功"); 
   session.write("abc"); 
  }else{ 
   System.out.println("连接失败!!!"); 
  }


 }

 
 

mina在spring中的配置多个端口的更多相关文章

  1. Velocity初探小结--Velocity在spring中的配置和使用

    最近正在做的项目前端使用了Velocity进行View层的数据渲染,之前没有接触过,草草过了一遍,就上手开始写,现在又回头细致的看了一遍,做个笔记. velocity是一种基于java的模板引擎技术, ...

  2. C3P0连接池在hibernate和spring中的配置

    首先为什么要使用连接池及为什么要选择C3P0连接池,这里就不多说了,目前C3P0连接池还是比较方便.比较稳定的连接池,能与spring.hibernate等开源框架进行整合. 一.hibernate中 ...

  3. Spring中事务配置以及事务不起作用可能出现的问题

    前言:在Spring中可以通过对方法进行事务的配置,而不是像原来通过手动写代码的方式实现事务的操作,这在很大程度上减少了开发的难度,本文介绍Spring事务配置的两种方式:基于配置文件的方式和基于注解 ...

  4. spring中事务配置

    1 如果在方法.类.接口上使用注解的方式声明事务,需要在配置文件中进行配置,以便通知 Spring 容器对标注 @Transactional 注解的 bean 加工处理. 首先需要引入 tx 命名空间 ...

  5. Spring 中属性配置

    1 注册自定义属性编辑器,方法一.使用BeanFactory, 则用户需要手动调用 registerCustomEditor(Class requiredType, PropertyEditor pr ...

  6. spring中xml配置和autowired混用

    1.类的混用: 配置文件中的配置: <bean id="a" class="com.ab.cc.A" /> 类中的配置 @Autowired A a ...

  7. Druid 在spring中的配置

    Spring配置中dataSource配置 <bean id="dataSource" class="com.alibaba.druid.pool.DruidDat ...

  8. 关于spring中bean配置的几件小事

    一.IOC和DI 1.IOC(Inversion of Control) 其思想是反转资源获取的方向.传统的资源查找方式要求组件向容器发起请求查找资源,作为回应,容器适时的返回资源:而应用了IOC之后 ...

  9. c3p0在spring中的配置

    在大家的开发和学习其中应该经经常使用到数据库的连接和使用,只是连接 的方式就有非常多种方式了,例如说用最最简单的JDBC 也好,还实用比 较复杂一点的就是数据库连接池.当然还有使用DBCP的连接的,各 ...

随机推荐

  1. 中断下半部tasklet【转】

    本文转载自:http://edsionte.com/techblog/archives/1547 tasklet的实现 tasklet(小任务)机制是中断处理下半部分最常用的一种方法,其使用也是非常简 ...

  2. 安装mysql5.7后无法启动,/var/run/mysqld 目录每次重启后都需要手动去创建--终极解决方案

    鉴于很多童鞋反应,mysql5.7安装后出现无法启动,建立/var/run/mysqld 并赋权mysql用户解决了启动的问题,但是重启系统后又出现无法启动的问题,导致/var/run/mysqld ...

  3. SpringMVC实现AJax以及RestFull风格

    RestFull风格就是url路径中不能出现?不能带参数,如https://www.baidu.com/user/item/1234这个格式,也叫url资源定位 1.需要在web.xml中开启put, ...

  4. Python日期时间函数

    所有日期.时间的api都在datetime模块内. 1. 日期输出格式化 datetime => string import datetime now = datetime.datetime.n ...

  5. POJ 3376 Finding Palindromes (tire树+扩展kmp)

    很不错的一个题(注意string会超时) 题意:给你n串字符串,问你两两匹配形成n*n串字符串中有多少个回文串 题解:我们首先需要想到多串字符串存储需要trie树(关键),然后我们正序插入倒序匹配就可 ...

  6. EJS基本用法

    1.引入 <script src="/src/ejs_production.js"></script> 2.模板 <script id="c ...

  7. 快速的熟悉一个angular的项目从run看起

    config之类的都会注入到controller或者run里边

  8. jsp:jstl标签之控制流程

    下面将要讲的用于流程控制的标签,其中包括:if.choose.when 与 otherwise 等.接下来对这些标签逐一讲解. 这个标签的作用和 Java 程序中的 if 语句作用相同,用于判断条件语 ...

  9. c++中函数参数传递(值传递、指针传递,引用传递)进一步认识

    概念    首先从概念上来说一下这几种函数传参方式及区别:    1.值传递:形参是实参的拷贝,改变函数形参的值并不会影响外部实参的值,这是最常用的一种传参方法,也是最简单的一种传参方法,只需要传递参 ...

  10. webdriver处理鼠标右键菜单栏

    selenium中ActionChains类提供了鼠标操作的常用方法,但对于鼠标右键的菜单栏,无论是send_keys(Keys.ARROW_DOWN)还是send_keys("K" ...