MINA对接某道闸例子

公司需要和道闸对接,道闸有个模拟客户端端定时发送数据,服务端将道闸产生的socket报文进行解析,报文里面有文案中规定好的数据含义。某种意义上讲, socket报文也是处理异构跨平台数据交换的利器。基于TCP/UDP协议,数据格式为字符串,这也跨语言平台无差别交换的原因。
扩展一下,有类似的框架Netty,可以参考MINA与Netty的对比文章:
http://ifeve.com/netty-mina-in-depth-1/



package com.jq.test;

import java.io.IOException;
import java.net.InetSocketAddress;

import org.apache.mina.filter.executor.ExecutorFilter;
import org.apache.mina.filter.executor.UnorderedThreadPoolExecutor;
import org.apache.mina.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.DatagramSessionConfig;
import org.apache.mina.transport.socket.nio.NioDatagramAcceptor;


public class MinaUdpServer {
                // 服务器监听端口
private static final int PORT = 1002;

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

/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
    NioDatagramAcceptor acceptor = new NioDatagramAcceptor();//创建一个UDP的接收器 
        acceptor.setHandler(new UdpServerHandler());//设置接收器的处理程序 
 
        //Executor threadPool = Executors.newCachedThreadPool();//建立线程池 
        UnorderedThreadPoolExecutor  pool = new UnorderedThreadPoolExecutor(10);
        acceptor.getFilterChain().addLast("exector", new ExecutorFilter(pool)); 
        acceptor.getFilterChain().addLast("logger", new LoggingFilter()); 
 
        DatagramSessionConfig dcfg = acceptor.getSessionConfig();//建立连接的配置文件 
        dcfg.setReadBufferSize(4096);//设置接收最大字节默认2048 
        dcfg.setReceiveBufferSize(1024);//设置输入缓冲区的大小 
        dcfg.setSendBufferSize(1024);//设置输出缓冲区的大小 
        dcfg.setReuseAddress(true);//设置每一个非主监听连接的端口可以重用 
         
        acceptor.bind(new InetSocketAddress(PORT));//绑定端口  }
}

}


package com.jq.test;



import java.util.Date;

import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;

/**
* 继承自IoHandlerAdapter,IoHandlerAdapter继承接口 IoHandler
        类IoHandlerAdapter实现了IoHandler的所有方法,只要重载关心的几个方法就可以了
*/
public class UdpServerHandler extends IoHandlerAdapter {

@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
cause.printStackTrace();
}

    /*
     * 这个方法是目前这个类里最主要的,
     * 当接收到消息,只要不是quit,就把服务器当前的时间返回给客户端
     * 如果是quit,则关闭客户端连接*/
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
System.out.println("messageReceived"); 

        if (message instanceof IoBuffer) { 
        IoBuffer ioBuffer = (IoBuffer) message;
    byte[] getInfo = new byte[ioBuffer.limit()];
    ioBuffer.get(getInfo);
    String getInfoStr = printHexString(getInfo);
    System.out.println(Thread.currentThread().getName() +"[" + new Date() + "] receive:" + getInfoStr); 
   
    IoBuffer buffer1 = IoBuffer.wrap("0".getBytes());//返回信息给Clinet端 
           
            session.write(buffer1); 
            Thread.sleep(10000);
      }

}

@Override
public void sessionClosed(IoSession session) throws Exception {
// TODO Auto-generated method stub
super.sessionClosed(session);
System.out.println("客户端与服务端断开连接.....");
}


public static String printHexString(byte[] b) {
String result = "";
for (int i = 0; i < b.length; i++) {
String hex = Integer.toHexString(b[i] & 0XFF);
if (hex.length() == 1) {
hex = '0' + hex;
}
result = result + hex.toUpperCase();
}
return result.trim();
}

}


package com.jq.test;

import java.io.IOException;
import java.net.InetSocketAddress;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

public class MinaTcpServer {   
private static MinaTcpServer minaServer = null;
//创建一个非阻塞的Server端Socket
private SocketAcceptor acceptor = new NioSocketAcceptor();
//创建接收数据的过滤器
private DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();       
private int bindPort = 1002;

//单例
public static MinaTcpServer getInstances() {   
if (null == minaServer) {              
minaServer = new MinaTcpServer();   
}           
return minaServer;   
}       
private MinaTcpServer() {           
//设定这个过滤器将按对象读取数据

//单例模式----------------------------------------
// chain.addLast("myChin", new ProtocolCodecFilter(   
// new ObjectSerializationCodecFactory()));
//设定服务器端的消息处理器:一个MinaServerHandler对象,
// acceptor.setHandler(ServerHandler.getInstances());  


//非单例模式---------------------------------------
//接收文字
chain.addLast("myChin", new ProtocolCodecFilter(   
new TextLineCodecFactory()));
//接收对象
// chain.addLast("myChin", new ProtocolCodecFilter(   
// new ObjectSerializationCodecFactory()));


acceptor.setHandler(new TcpServerHandler());
try {
//绑定端口,启动服务器
acceptor.bind(new InetSocketAddress(bindPort));

} catch (IOException e) {               
e.printStackTrace();   
}
System.out.println("服务端:监听端口--->" + bindPort);
}   
public static void main(String[] args) throws Exception {   
MinaTcpServer.getInstances();
//new MinaServer();
}   
}   



package com.jq.test;

import java.net.InetSocketAddress;

import org.apache.mina.core.filterchain.IoFilterAdapter;
import org.apache.mina.core.service.IoHandler;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;


public class TcpServerHandler extends IoFilterAdapter implements IoHandler {   
private static TcpServerHandler samplMinaServerHandler = null;       
public static TcpServerHandler getInstances() {
if (null == samplMinaServerHandler) {   
samplMinaServerHandler = new TcpServerHandler();
}   
return samplMinaServerHandler;       
}   
public TcpServerHandler() {   
}   
public void sessionOpened(IoSession session) throws Exception {
System.out.println("服务端:会话打开");
}   
public void sessionClosed(IoSession session) {



public void messageReceived(IoSession session, Object message)throws Exception {
//接收字符串
String str = (String)message;
System.out.println("服务端:收到客户端发来的信息--->"+str);
System.out.println("客户端"+((InetSocketAddress) session.getRemoteAddress()).getAddress().getHostAddress()+"连接成功!");
     
}

public void exceptionCaught(IoSession arg0, Throwable arg1)throws Exception {  

}

public void messageSent(IoSession arg0, Object arg1) throws Exception {   

}

public void sessionCreated(IoSession arg0) throws Exception {
System.out.println("服务端:会话创建");


public void sessionIdle(IoSession arg0, IdleStatus arg1) throws Exception {

}

@Override
public void inputClosed(IoSession arg0) throws Exception {
// TODO Auto-generated method stub

}   


猜你喜欢

转载自lakerhu.iteye.com/blog/2300822