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()+"");
}
mima开发实列的更多相关文章
- AD域控Dsquery查询命令实列
注:请以管理员的身份运行cmd程序,要不然某些命令不生效 AD域控Dsquery查询命令实列 查询技术支持二部的所有用户 dsquery user OU=技术支持二部,OU=技术部, ...
- jeecms系统使用介绍——通过二次开发实现对word、pdf、txt等上传附件的全文检索
转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/76912307 本文出自[我是干勾鱼的博客] 之前在文章<基于Java的门户 ...
- Android系统开发实务实训
实训项目 : Android系统开发实务实训 项目成品名称: 绝地坦克 ...
- Flask常用实列化参数
Flask中实列化配置: app = Flask( __name__, template_folder=’temp’ , ...... ) >template_folder = "te ...
- XML建模实列
XML建模 建模的由来: 就是将指定的xml字符串当作对象来操作 好处在于,只需要调用指定的方法就可以完成预定的字符串获取: 建模的一个思路: 1.分析需要被建模的文件中有那几个对 ...
- docker中启动2个mysql实列
一.mac环境安装docker容器 在docker官网中下载docker容器,地址:https://www.docker.com/products/docker-desktop 具体安装教程及设置网络 ...
- 实列+JVM讲解类的实列化顺序
刨根问底---类的实列化顺序 开篇三问 1什么是类的加载,类的加载和类的实列有什么关系,什么时候类加载 2类加载会调用构造函数吗,什么时候调用构造函数 3什么是实列化对象,实列化的对象有什么东西. 我 ...
- 美化传奇NPC对话框添加图片显示实列
NPC对话框一般都是文字显示,有些GM想突出版本特色,在NPC对话框加些专业图片,彰显独特之处,其实这是很简单的.下面为你讲解美化传奇NPC对话框添加图片显示实列 我们要添加你要放入npc图片的补丁. ...
- STM32L476RG_中断开发与实列
本程序的主要功能是实现按键控制灯的亮灭.当灯为灭的状态时按键按下点亮灯,当灯为亮的状态时按键按下熄灭灯,即实现灯的电平翻转操作. 按键扫描是利用 GPIO 下降中断,来监测按键按下动作.并加以消抖操作 ...
随机推荐
- 这段时间对c#和java的感受
这段时间对c#和java的感受 虽然很多书上说语法相似,但实际这是一个接近于门外汉的看法 真正的不同是 c#对更贴近系统API, 而java倡导跨平台 因而c#语法关键字更多,更细, 而ja ...
- 在JAVA中,关于反射机制的讨论
一.什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制 ...
- poj1573 Robot Motion
Robot Motion Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12507 Accepted: 6070 Des ...
- 十步完全理解SQL
转载于:http://blog.jobbole.com/55086/ 很多程序员视 SQL 为洪水猛兽.SQL 是一种为数不多的声明性语言,它的运行方式完全不同于我们所熟知的命令行语言.面向对象的程序 ...
- php进阶函数
1,对文件的操作,确保多个进程可以同时读写一个文件(flock函数) flock($hamdle,int $operator) operator的取值,LOCK_SH(共享锁定,读取程序),LOCK_ ...
- 临时表之IF-ELSE
1.解决输出单列到临时表 场景:存储过程传入id,id为缺省的过滤条件,如果id为0,则查找出tt表中的所有id作为过滤条件 目的:id不为0时,过滤id 解决:用case when来代替if els ...
- vue 滚动加载
<template> <div class="wraper" @scroll="onScroll($event)"> <div c ...
- 数据库mark
LOAD DATA INFILE 'I:\QQpwd\\1.txt' IGNORE INTO TABLE sgk.top1 FIELDS TERMINATED BY '----' OPTIONALLY ...
- Ultra-QuickSort
Description In this problem, you have to analyze a particular sorting algorithm. The algorithm proce ...
- opencv2-新特性及Mat
本文参照<opencv_2.4.9tutorial>的core部分完成.因为功力还不足以学习侯捷那种大师一样去深入浅出的解析opencv的源码,也只能先学会怎么用opencv,然后实在觉得 ...