公司需要和道闸对接,道闸有个模拟客户端端定时发送数据,服务端将道闸产生的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
}
}
MINA对接某道闸例子
猜你喜欢
转载自lakerhu.iteye.com/blog/2300822
今日推荐
周排行