mina2 结合spring应用的小例子

本文介绍了一个使用Spring框架和MINA库实现的简单网络通信应用案例,包括配置文件详解、自定义编码器实现及客户端测试代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先来看spring中的配置:

<?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.0.xsd">


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

 <bean id="ioAcceptor"
  class="org.apache.mina.transport.socket.nio.NioSocketAcceptor"
  init-method="bind" destroy-method="unbind">

  <property name="defaultLocalAddress" value=":1235" />


  <property name="handler" ref="SampleHandler" />
  <property name="filterChainBuilder" ref="filterChainBuilder" />
  <property name="reuseAddress" value="true" />

 </bean>
 <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="cn.org.handler.MyCodeFactory"></bean>//自定义的 字符编码类
  </constructor-arg>
 </bean>
 <bean id="loggingFilter"
  class="org.apache.mina.filter.logging.LoggingFilter" />
 <bean id="SampleHandler" class="cn.org.handler.HandlerTwo" />
 <!--boss server  -->
 <bean id="bossSampleHandler" class="cn.org.handler.HandlerOne" />

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


</beans>

 

然后再看 :SampleHandler:

很简单的:

package cn.org.handler;

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;


public class HandlerTwo extends IoHandlerAdapter {

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

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

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

}

测试的://启动 可以通过telnet 端口号来,也可以写个客户端的测试类

 

public class Test {

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

 }

}

 

客户端的测试类:


public class ClintTest {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // 创建客户端连接器.
  NioSocketConnector connector = new NioSocketConnector();
  connector.getFilterChain().addLast( "logger", new LoggingFilter() );
  connector.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "GBK" )))); //设置编码过滤器
  connector.setConnectTimeout(1);
  connector.setHandler(new HandlerOne());//设置事件处理器
  ConnectFuture cf = connector.connect(
  new InetSocketAddress("127.0.0.1", 1235));//建立连接
  cf.awaitUninterruptibly();//等待连接创建完成
  cf.getSession().write("知识");//发送消息
  //cf.getSession().write("quit");//发送消息
  cf.getSession().close();
  cf.getSession().getCloseFuture().awaitUninterruptibly();//等待连接断开
  connector.dispose();

 }

}

还有自定义的 编码类:

package cn.org.handler;

import java.nio.charset.Charset;

import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFactory;
import org.apache.mina.filter.codec.ProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolEncoder;
import org.apache.mina.filter.codec.textline.LineDelimiter;
import org.apache.mina.filter.codec.textline.TextLineDecoder;
import org.apache.mina.filter.codec.textline.TextLineEncoder;

public  class MyCodeFactory implements ProtocolCodecFactory {

     private final TextLineEncoder encoder;
     private final TextLineDecoder decoder;
     /*final static char endchar = 0x1a;*/
     final static char endchar = 0x0d;
     public MyCodeFactory() {
         this(Charset.forName("gb2312"));
     }
     public MyCodeFactory(Charset charset) {
       encoder = new TextLineEncoder(charset, LineDelimiter.UNIX);  
          decoder = new TextLineDecoder(charset, LineDelimiter.AUTO);  
          }

     @Override
  public ProtocolDecoder getDecoder(IoSession session) throws Exception {
   // TODO Auto-generated method stub
   return decoder;
  }
  @Override
  public ProtocolEncoder getEncoder(IoSession session) throws Exception {
   // TODO Auto-generated method stub
   return encoder;
  }
  public int getEncoderMaxLineLength() {
         return encoder.getMaxLineLength();
     }
     public void setEncoderMaxLineLength(int maxLineLength) {
         encoder.setMaxLineLength(maxLineLength);
     }
     public int getDecoderMaxLineLength() {
         return decoder.getMaxLineLength();
     }
     public void setDecoderMaxLineLength(int maxLineLength) {
         decoder.setMaxLineLength(maxLineLength);
     }

}

 

这样简单的例子就OK了

 

  jar 包 :spring.jar  mina2.0的jar包    slf4j-nop.1.5.2.jar、

 

 

 

 

 

 

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 华为移动服务(Huawei Mobile Services,简称 HMS)是一个全面开放的移动服务生态系统,为企业和开发者提供了丰富的工具和 API,助力他们构建、运营和推广应用。其中,HMS Scankit 是华为推出的一款扫描服务 SDK,支持快速集成到安卓应用中,能够提供高效且稳定的二维码和条形码扫描功能,适用于商品扫码、支付验证、信息获取等多种场景。 集成 HMS Scankit SDK 主要包括以下步骤:首先,在项目的 build.gradle 文件中添加 HMS Core 库和 Scankit 依赖;其次,在 AndroidManifest.xml 文件中添加相机访问和互联网访问权限;然后,在应用程序的 onCreate 方法中调用 HmsClient 进行初始化;接着,可以选择自定义扫描界面或使用 Scankit 提供的默认扫描界面;最后,实现 ScanCallback 接口以处理扫描成功和失败的回调。 HMS Scankit 内部集成了开源的 Zxing(Zebra Crossing)库,这是一个功能强大的条码和二维码处理库,提供了解码、生成、解析等多种功能,既可以单独使用,也可以与其他扫描框架结合使用。在 HMS Scankit 中,Zxing 经过优化,以更好地适应华为设备,从而提升扫描性能。 通常,ScanKitDemoGuide 包含了集成 HMS Scankit 的示例代码,涵盖扫描界面的布局、扫描操作的启动和停止以及扫描结果的处理等内容。开发者可以参考这些代码,快速掌握在自己的应用中实现扫码功能的方法。例如,启动扫描的方法如下: 处理扫描结果的回调如下: HMS Scankit 支持所有安卓手机,但在华为设备上能够提供最佳性能和体验,因为它针对华为硬件进行了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值