mima开发实列

最顶层父基类Clinet:用于记录公共内容

切供多个Clinet继承公用

import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import java.util.Timer;
import java.util.TimerTask;

import org.apache.commons.lang.StringUtils;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
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.transport.socket.nio.NioSocketConnector;

import com.qinghuainvest.tsmarket.codec.HCoderFactory;
import com.qinghuainvest.tsmarket.socketclient.MinaClientHanlder;

/**
 * 父基类
 * @author huage
 *
 */
public abstract class MinaBaseClient {

    public abstract void startSocketReq(String code);
    protected String hostName ;
    protected int bindPort;

    /**
     * 创建IOSession
     * @return
     */
    protected IoSession createSession(){
        if( StringUtils.isBlank(hostName)) return null;
        try {
            NioSocketConnector connector = new NioSocketConnector();
            DefaultIoFilterChainBuilder chain = connector.getFilterChain();
            chain.addLast("objectFilter", new ProtocolCodecFilter(new HCoderFactory(Charset.forName("UTF-8"))));
            MinaClientHanlder handler = new MinaClientHanlder();
            connector.setHandler(handler);
            connector.getSessionConfig().setUseReadOperation(true);
            ConnectFuture cf = connector.connect(new InetSocketAddress(hostName, bindPort));
            cf.awaitUninterruptibly();
            return cf.getSession();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
     }

    /**
     * 传输数据
     * @param session
     * @param code
     */
    protected void writeMina(IoSession session,String code){
        if( session == null )return;
        session.write(code + "\n");
    }

    public static void main(String[] args) {
        Integer cacheTime = 1000 * 1;
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            public void run() {
                /*StockMina1004Client ns = new StockMina1004Client("218.1.111.62", 10003);
                ns.startSocketReq(EmCommunicationCode.nqxx.getCode()+"" );*/
            }
        }, 1000, cacheTime);
    }
}

子类继承

import org.apache.mina.core.session.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class StockMinaClient extends MinaBaseClient{
    private final Logger log = LoggerFactory.getLogger(StockMinaClient.class);
    private boolean isStatus = true;
    private IoSession session;

    public StockMinaClient(String hostName,int bindPort){
        super.hostName = hostName;
        super.bindPort = bindPort;
    }

    public void startSocketReq(String code) {
        if (isStatus) {
            isStatus = false;
            log.info("socket request start....hostName="+hostName+";bindPort="+bindPort+";requestparam="+code);
            if (session == null || !session.isConnected()) {
                session = createSession();
            }
            isStatus = true;
            super.writeMina(session, code);
        }
    }

}

子类重写(只是表明可以区别创建的对象)

import java.net.InetSocketAddress;
import java.nio.charset.Charset;

import org.apache.commons.lang.StringUtils;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
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.transport.socket.nio.NioSocketConnector;

import com.qinghuainvest.tsmarket.codec.HCoderFactory;
import com.qinghuainvest.tsmarket.socketclient.MinaClient1004Hanlder;

public class StockMina1004Client extends StockMinaClient{
    public StockMina1004Client(String hostName, int bindPort) {
        super(hostName, bindPort);
    }

    protected IoSession createSession(){
        if( StringUtils.isBlank(hostName)) return null;
        try {
            NioSocketConnector connector = new NioSocketConnector();
            DefaultIoFilterChainBuilder chain = connector.getFilterChain();
            chain.addLast("objectFilter", new ProtocolCodecFilter(new HCoderFactory(Charset.forName("UTF-8"))));
            MinaClient1004Hanlder handler = new MinaClient1004Hanlder();
            connector.setHandler(handler);
            connector.getSessionConfig().setUseReadOperation(true);
            ConnectFuture cf = connector.connect(new InetSocketAddress(hostName, bindPort));
            cf.awaitUninterruptibly();
            return cf.getSession();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
     }

}

需要的handler(根据实际业务调整messageReceived方法中的内容既可)

import java.util.Set;

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MinaClientHanlder extends IoHandlerAdapter {
    private final Logger log = LoggerFactory.getLogger(MinaClientHanlder.class);
    @Override
    public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
        cause.printStackTrace();
    }  

    @Override
    public void messageReceived(IoSession session, Object message)throws Exception {
        log.info("收到行情服务器回调传送数据...");
        if (message != null) {
            try {
                callback((String) message,session);
                clear(session);
            } catch (Exception e) {
                log.error("message Received ", e);
                //e.printStackTrace();
                session.write("system error.");
            }
        }
    }

    public void callback(String msg,IoSession session){
        if (!"null".equals(msg)) {
            //处理数据
        }
    }

    /**
     * 清除session中的attribute
     * 解决mina通讯中内存溢出异常
     * 测试方法,未找到明确依据
     * @param session
     */
    private void clear(IoSession session) {
        Set<Object> set = session.getAttributeKeys();
        if(set==null || set.size()==0) return;
        for (Object object : set) {
            if(session.containsAttribute(object)) {
                session.removeAttribute(object);
            }
        }
    }
    @Override
    public void sessionCreated(IoSession session) throws Exception {
        log.info("session Created--");
        //System.out.println("session Created");
    }
    @Override
    public void messageSent(org.apache.mina.core.session.IoSession session, java.lang.Object message) {
        log.info("message Sented");
        //System.out.println("message Sented--");
    }
}

根据业务需要的另一个handler

import org.apache.mina.core.session.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MinaClient1004Hanlder extends MinaClientHanlder {
    private final Logger log = LoggerFactory.getLogger(MinaClient1004Hanlder.class);public void callback(String msg,IoSession session) {
        if (!"null".equals(msg)) {
            //处理数据
        }
        startCheck();
    }

}

特殊业务处理的工具类(根据业务自行处理)

package com.qinghuainvest.tsmarket.codec;

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;

public class HCoderFactory implements ProtocolCodecFactory {

    private final HDecoder decoder;
    private final HEncoder encoder;
//    private final TextLineEncoder encoder;

    public HCoderFactory() {
        this(Charset.defaultCharset());
    }

    public HCoderFactory(Charset charset) {
        decoder = new HDecoder();
        encoder = new HEncoder();
//        encoder = new TextLineEncoder();
    }

    public ProtocolEncoder getEncoder(IoSession session) throws Exception {
        return encoder;
    }

    public ProtocolDecoder getDecoder(IoSession session) throws Exception {
        return decoder;
    }
}
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.CumulativeProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;

public class HDecoder extends CumulativeProtocolDecoder {

    @Override
    protected boolean doDecode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
        // Remember the initial position.
        int start = in.position();
//        byte previous = 0;
        byte[] requestMsgArray;
        while (in.hasRemaining()) {
            byte current = in.get();
            if (current == ‘\n‘) {
                // Remember the current position and limit.
                int position = in.position();
                int limit = in.limit();
                try {
                    int dataLength = position - start - 1;//忽略掉\n,所以减1
                    in.position(start);
                    in.limit(position);
                    requestMsgArray = new byte[dataLength];
                    // The bytes between in.position() and in.limit()
                    // now contain a full CRLF terminated line.
                    in.get(requestMsgArray);
                    out.write(new String(requestMsgArray));
                } finally {
                    // Set the position to point right after the
                    // detected line and set the limit to the old
                    // one.
                    in.position(position);
                    in.limit(limit);
                }
                // Decoded one line; CumulativeProtocolDecoder will
                // call me again until I return false. So just
                // return true until there are no more lines in the
                // buffer.
//                previous = current;
                return true;
            }
        }
        in.position(start);

        return false;

    }
}
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolEncoderAdapter;
import org.apache.mina.filter.codec.ProtocolEncoderOutput;

public class HEncoder extends ProtocolEncoderAdapter {

    public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception {
        String msg = (String) message;
        byte[] msgArray = msg.getBytes();
        IoBuffer buffer = IoBuffer.allocate(msgArray.length , false);
        buffer.put(msgArray);
        buffer.flip();
        out.write(buffer);
        out.flush();
    }
}

处理调用启动写main方法调用

 public void start(){
    StockMinaClient  client  = null;
        if( client == null ){
            client = new StockMinaClient(market.getHostName(), market.getBindPort());
        }
        client.startSocketReq(EmCommunicationCode.nqxx.getCode()+"");
    }
时间: 2024-08-10 21:21:35

mima开发实列的相关文章

python之路-复习(结合前面操作写出实列)

不同语言的特点 编译型:一次性将全部的代码编译成二进制文件.例如(C  C++) 优点:执行效率高 缺点:开发速度慢,不能跨平台 解释型:当程序运行时,从上至下一行一行的解释成二进制. 优点:开发速度快,效率高,可以跨平台 缺点:运行效率低 python 2x 和 python 3x 宏观上的区别 python 2x 源码,重复率高,不规范,而且python 崇尚的是简单优美清晰,所以鬼叔创建了python 3,规范化. python 2x 写中文时,默认会报错,解决办法:一般在写代码时,在首行

H3C ——DHCP配置实列

实现场景 公司网络想实现一部分VLAN使用dhcp服务器动态分配ip地址,另一部分使用核心交换机做dhcp服务器为客户端分配ip地址,本实列信息如下: VLAN50为管理vlan,vlan41-vlan45使用核心交换作为dhcp服务器,vlan46-vlan48使用dhcp服务器10.100.44.2分配ip地址. 配置信息: <H3C>dis cu # version 5.20, Release 2202 # sysname H3C # dhcprelay server-group 1 i

美化传奇NPC对话框添加图片显示实列

NPC对话框一般都是文字显示,有些GM想突出版本特色,在NPC对话框加些专业图片,彰显独特之处,其实这是很简单的.下面为你讲解美化传奇NPC对话框添加图片显示实列 我们要添加你要放入npc图片的补丁.当然也可以用装备的补丁里面的图片.看你自己的需要了.我们可以借助与wil编辑器查看图片 这种的要加补丁,请你事先准备好图片素材放入ICON.WIL中 ;显示图标,默认调用Icon.wil中的素材 格式: <Img:N:F:X:Y/@Label>N表示显示文件中的第几个图片,F表示素材文件的编号,X

郑重告之:智能合约开发实训营第4期学员招募正式启动!

各位同学,抱歉久等了- 这是终于到来的<以太坊智能合约全栈开发>实战特训营第四期的正式招募通知. <以太坊智能合约全栈开发>实战特训营是由硅谷密探和 celer network 共同打造的全球第一档·智能合约全栈开发实战课程,也是目前唯一一个实现来自中.美.澳.英.日.韩等多国学员在线互动学习的区块链技术实战特训课程. 为了保证教学质量,如今已调整为每期仅招募100人,参与有门槛,需经过层层审核,录取通过率一度不到10%,并非所有人都适合参与. 拉至文末可直接进行报名. 请点击此处

docker中启动2个mysql实列

一.mac环境安装docker容器 在docker官网中下载docker容器,地址:https://www.docker.com/products/docker-desktop 具体安装教程及设置网络许多,自己查看..... 查看docker是否安装成功,在终端输入:docker info 二.在docker中安装mysql 我是需要在mac启2个mysql实列,故需要区分mysql端口号 docker run -p 13306:3306 --name mysql1 -v ~/mysql1:/v

Android系统开发实务实训

实训项目 :               Android系统开发实务实训                                            项目源码获取:   <绝地坦克>是一款坦克大战类型的javascript网络游戏,本游戏项目运行说明可分为三个方向:说明运行的项目是什么.如何运行,以及运行该项目的结果和意义是什么?其中运行的是什么包括:项目说明与功能分析:如何运行主要是指,该项目程序的实现原理和运行方式.具体说明如下: 一.项目说明与功能分析 首先从逻辑上而言,本项目

[Windows Phone开发]实机测试!快将手上的windows phone注册为开发机!

测试机是指? 当您辛辛苦苦地做出一大堆看起来有趣又充满创意的Windows Phone APP并使用模拟器测试过了,而且你确定在模拟器上运行没有任何问题,你一定会想将它上架吧!但是建议您先稍候,不怕一万只怕万一,您还没有看过APP在实例机器上运行的样子,你永远不会知道你的APP使用起来的手感以及是否有什么漏掉的东西! 今天就是要带着大家从模拟机跃上实例机啦! TO 开始之前请注意要自备一只Windows Phone手机 : 这听起来很蠢,但是你不能没有一只Windows Phone啊!还有,您也

最老程序猿创业开发实训1---Android应用架构之MVC

我们都知道Android中基本组件是Activity,每一个界面都是一个Activity,自从2.3版本号開始.又添加了Fragment组件,提供了适应于各种屏幕方法.可是因为Android系统仅仅是提供了各种可用的编程技术,并没有相应用架构进规定.实践中,非常多项目将全部功能都加入到了Activity中,使Activity变得十分臃肿.不便于进行后期改动和维护.假设我们要一个人来开发一个系统.那么必须採用高效的应用架构,方便调试及维护. 在开发应用中,採用MVC架构无疑是一种最安全的选择.将应

最老程序员创业开发实训13---Android---网络请求与异步任务

在完成了用户注册和登录页面的界面设计工作之后,我们就需要让我们的程序向后台发起请求,请求后台PHP程序实际进行用户注册操作.在新版本的Android系统中,所有的网络请求必须以异步的方式来进行,我们既可以通过线程方式也可以通过Android系统为我们提供的异步任务方式来完成,我们在这里选择采用异步任务的方式来进行网络操作. 根据异步任务的原理,当应用调用异步任务时,异步任务会在后台完成相应的网络操作,在完成之后,在onPostExecute方法中通知界面,更新操作状态.有两种方法可以完成这项任务