`

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

}   


分享到:
评论

相关推荐

    HPsocket 封包与mina对接

    ### HPsocket 封包与mina对接 #### 一、HPsocket概述 HPsocket是一个高性能、跨平台的TCP/UDP/串口通信中间件库,它提供了丰富的API接口和灵活的事件驱动模型,使得用户可以方便地开发自己的网络应用程序。本文将...

    mina消息推送例子

    在这个“mina消息推送例子”中,我们将深入探讨Mina如何实现消息推送,并结合Spring框架进行集成。 首先,Apache Mina提供了一个异步事件驱动的网络应用编程接口(API),它简化了TCP/IP和UDP协议的处理,如HTTP、...

    mina权威性能测试例子

    这个"mina权威性能测试例子"是针对Apache Mina的一个实际性能测试案例,旨在展示在特定环境下Mina如何处理大量并发连接。在这个测试中,四台客户端机器同时对服务器进行压力测试,结果显示服务器可以轻松地处理一万...

    Mina实现RPC的例子

    这个例子中的链接(http://blog.csdn.net/stevexk/archive/2008/07/23/2697907.aspx)提供了更详细的实现细节,包括具体的编码和解码逻辑,以及如何在Mina的过滤器和处理器中处理RPC请求。如果你需要深入学习,建议...

    apache-mina例子

    这个例子是关于如何使用Apache Mina实现一个简单的服务端和客户端通信的示例。在这个案例中,`MinaTimeServer`是服务端程序,它负责监听客户端的连接请求,并发送时间信息;而`MinaClient`则是客户端程序,它连接到...

    springboot mina 串口对接

    本项目将SpringBoot与Mina结合,用于实现串口协议的对接。 首先,我们来深入理解"串口通信"。串口通信(Serial Communication)是指数据以串行的方式一位一位地传输,通常涉及RS-232、RS-485等标准。在SpringBoot...

    mina源码+例子mina-2.0.0-M6.zip

    3. **编写简单的应用**:从例子入手,创建一个简单的MINA服务器和客户端,理解它们之间的通信机制。 4. **实现自定义过滤器**:根据需求,编写自定义的过滤器,以实现特定的数据处理功能。 5. **性能调优**:了解...

    MINA源码与例子

    Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,主要用于简化开发高质量的网络服务。MINA的目标是为开发者提供一个简单易用但功能强大的库,...

    Mina官网例子之时间服务器

    **Mina官网例子之时间服务器** Apache Mina(Minimum Asynchronous Network)是一个高度可扩展的网络通信框架,它为各种协议提供了低级别的基础结构,包括TCP/IP和UDP/IP。Mina的目标是简化网络编程,使其变得高效...

    mina通讯例子

    这个"mina通讯例子"展示了如何利用MINA库来实现客户端与服务器之间的对象通信。 在MINA中,核心概念包括`Session`、`Filter`和`Handler`。`Session`代表了网络连接,它提供了读写数据的方法;`Filter`是数据处理链...

    Mina例子包含与spring整合

    在这个"Mina例子包含与Spring整合"的项目中,我们将探讨如何将MINA与流行的Java企业级框架Spring进行集成。 1. **Apache MINA**:MINA是基于Java NIO(非阻塞I/O)的网络应用框架,用于构建高性能、跨平台的服务器...

    mina服务端例子

    在这个“Mina服务端例子”中,我们主要探讨的是如何使用Mina框架来实现一个基于Socket的非阻塞I/O(NIO)服务端。 1. **Mina框架介绍**: Mina提供了事件驱动和异步处理模型,使得开发者可以专注于业务逻辑,而...

    mina 服务器开发例子

    《Mina 服务器开发实例详解》 Mina(Minimum Asynchronous Network)是一个开源的Java框架,主要用于构建高性能、...通过理解并实践上述例子,你将能够更好地掌握Mina,并在实际项目中运用它来构建高性能的网络应用。

    mina使用例子

    通过这个"mina使用例子",你可以深入理解如何使用Mina来构建一个网络应用,从创建服务端、配置过滤器链,到处理客户端的连接和数据交换,以及如何进行性能优化和异常处理。这个例子将为你提供实践Mina框架的第一手...

    mina即时聊天demo

    **mina即时聊天demo** Mina(Java Multithreaded Application Network Architecture)是一个开源的网络通信框架,由Apache软件基金会开发并维护。它提供了一个高度可扩展的、高性能的、事件驱动的I/O服务架构,广泛...

    mina入门例子

    本入门例子将带你了解如何使用MINA进行基本的网络通信应用开发。 首先,MINA的核心概念包括`Session`、`Filter`和`Handler`。`Session`代表一个网络连接,它是数据传输的通道;`Filter`是处理`Session`中数据的...

    MINA for android例子

    Apache MINA是一个网络应用程序框架,本实例在android下 进行串口通讯的例子

    Mina官方例子所有jar包

    包含了官方例子中所有相关的jar包:log4j, mina-core, mina-integration-jmx, mina-statemachine, org.springframework.context, slf4j-api, slf4j-log4j12等

    Apache MINA java UDP例子|byte数组

    最近做rfid读写,C#和java都用udp不用厂家的动态库,udp自己写也简单,但是试了一下Apache mina ,接收的不是string,二十byte[] 数组,简单实现了UDP,网上也有例子,但是不是我要的。可用。

    mina的高级使用,mina文件图片传送,mina发送文件,mina报文处理,mina发送xml和json

    Apache Mina是一个开源的网络通信应用框架,主要应用于Java平台,它为高性能、高可用性的网络应用程序提供了基础架构。在本文中,我们将深入探讨Mina的高级使用,特别是在文件图片传送、文件发送、XML和JSON报文处理...

Global site tag (gtag.js) - Google Analytics