• mina通讯替代socket通讯的使用


    socket是java tcp通讯的封装工具,有时在工业上使用,配置需要的开发水平较高,偶尔不慎,就造成短路,接收不到数据。mina封装类很好解决了这个问题。在扫码头,电子秤等需要tcp通讯的地方使用很简洁方便。

    参考

    mina使用_绝世奇才的博客-CSDN博客_mina使用

    pom.xml

    
        org.rxtx
        rxtx
        2.1.7
        provided
    
    
        log4j
        log4j
        1.2.17
    
    
        org.apache.mina
        mina-core
        2.0.7
    

    server端,定义服务端,相当于socketserver.定义端口,接收数据。

    题外话:server中ip是使用系统的ip,client端才需要指定ip,server端只需定义port。

    package com.hs.mina;
    
    
    import com.hs.service.SenMessageService;
    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.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.nio.charset.Charset;
    
    @Component
    public class MinaServer {
        @Autowired
        private SenMessageService senMessageService;
    
        public static boolean isRun = false;
        public static void main(String[] args) throws IOException {
    
        }
        public void start() throws IOException {
            IoAcceptor acceptor = new NioSocketAcceptor();
    //        acceptor.getFilterChain().addLast("logger", new LoggingFilter());
            acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
            acceptor.setHandler(new TimeServerHandler(senMessageService));//这里规定了具体处理业务的实现类
            acceptor.bind(new InetSocketAddress(9008));
            isRun = true;
            System.out.println("mina 启动 9008 接收重量");
            System.out.println(senMessageService);
        }
    }
    

     处理业务的实现类 ,相当于 service的实现类,处理具体的业务,也相当于一个线程。

    接受字符串

    package com.hs.mina;
    
    import com.hs.conf.Weight;
    import com.hs.service.SenMessageService;
    import com.hs.util.NumberUtils;
    import com.hs.util.StringU;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.mina.core.service.IoHandlerAdapter;
    import org.apache.mina.core.session.IoSession;
    import org.springframework.stereotype.Component;
    
    @Component
    @Slf4j
    /**
     * 接收重量
     */
    public class TimeServerHandler extends IoHandlerAdapter {
    
        private SenMessageService senMessageService;
    
        public TimeServerHandler(SenMessageService senMessageService) {
            this.senMessageService = senMessageService;
        }
        @Override
        public void messageReceived(IoSession session, Object message){
            String mes = message.toString();//接受字符串
            log.info("9008 收到 ====" + mes);
            if (mes.split("\\.").length > 1) {
                mes = StringU.number(mes);
                double zl = Double.valueOf(mes.substring(0, mes.length() - 1));
                Weight.ZL = zl;
                log.info("判定为重量" + zl);
            } else if(NumberUtils.isNumber(mes)) {
                int xh = Integer.valueOf(mes);
                log.info("判定为序号" + xh);
                Weight.XH = xh;
            }else{
                log.info("判定为包头:" + mes);
            }
        }
    
        public static void main(String[] args) {
            String s = "0015.C88A".replaceAll("[a-zA-Z]", "");
            System.out.println(s);
        }
    
    }
    
    

     实现类处理字符流

    参考 mina iobuffer格式数据转化为String_just do it now的博客-CSDN博客 

    搞懂iobuffer就得先学习bytebuffer - 和风细雨汪汪 - 博客园

    package com.hs.mina;
    
    import com.hs.conf.Weight;
    import com.hs.service.SenMessageService;
    import com.hs.service.SenMessageService2x;
    import com.hs.util.DateUtilMy;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.mina.core.buffer.IoBuffer;
    import org.apache.mina.core.service.IoHandlerAdapter;
    import org.apache.mina.core.session.IoSession;
    import org.springframework.stereotype.Component;
    
    import java.util.Date;
    
    @Component
    @Slf4j
    public class TimeServerHandler9001erw extends IoHandlerAdapter {
        private int count = 0;
    
        private SenMessageService2x senMessageService2x;
    
        public TimeServerHandler9001erw(SenMessageService2x senMessageService) {
            this.senMessageService2x = senMessageService;
        }
    
        @Override
        public void messageReceived(IoSession session, Object message) {
            byte[] by = new byte[((IoBuffer)message).limit()];
            ((IoBuffer)message).get(by);//处理收到的字符流
            StringBuffer mesbu = new StringBuffer();
            for (int i = 0; i < by.length; i++) {
                mesbu.append((char) by[i]);
            }
            String mes = mesbu.toString();
            log.info("2线收到二维码 9001:" + mes);
            if(mes.trim().contains("ERROR")){
                log.error("9001没扫描到二维码,过===");
            }else  if(mes.split(",").length > 1){
                log.info("9001收到二维码 入库开始 === ");
                senMessageService2x.verify(mes,0.0);
            }else{
                log.info("9001啥也不是:" + mes);
            }
        }
    
    }
    
    

    首先使用String直接接收,接受不了的或者不全的,尝试使用第二种iobuffer 接收。

  • 相关阅读:
    【AI】行业消息精选和分析(23-11-20)
    区块链:去中心化革命下的创新与发展!
    Vue路由
    Spring Boot面试必问:启动流程(自动装配)
    226. 翻转二叉树
    GEE:对二值图层进行腐蚀和/或膨胀操作
    如何有效防止网络攻击?老男孩教育给你支招!
    MS2400隔离式调制器可pin对pin兼容AD7400
    Linux常用命令
    Ceres学习笔记003--使用Ceres进行曲线拟合
  • 原文地址:https://blog.csdn.net/somdip/article/details/128143926