公司需要和道闸对接,道闸有个模拟客户端端定时发送数据,服务端将道闸产生的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概述 HPsocket是一个高性能、跨平台的TCP/UDP/串口通信中间件库,它提供了丰富的API接口和灵活的事件驱动模型,使得用户可以方便地开发自己的网络应用程序。本文将...
在这个“mina消息推送例子”中,我们将深入探讨Mina如何实现消息推送,并结合Spring框架进行集成。 首先,Apache Mina提供了一个异步事件驱动的网络应用编程接口(API),它简化了TCP/IP和UDP协议的处理,如HTTP、...
这个"mina权威性能测试例子"是针对Apache Mina的一个实际性能测试案例,旨在展示在特定环境下Mina如何处理大量并发连接。在这个测试中,四台客户端机器同时对服务器进行压力测试,结果显示服务器可以轻松地处理一万...
这个例子中的链接(http://blog.csdn.net/stevexk/archive/2008/07/23/2697907.aspx)提供了更详细的实现细节,包括具体的编码和解码逻辑,以及如何在Mina的过滤器和处理器中处理RPC请求。如果你需要深入学习,建议...
这个例子是关于如何使用Apache Mina实现一个简单的服务端和客户端通信的示例。在这个案例中,`MinaTimeServer`是服务端程序,它负责监听客户端的连接请求,并发送时间信息;而`MinaClient`则是客户端程序,它连接到...
本项目将SpringBoot与Mina结合,用于实现串口协议的对接。 首先,我们来深入理解"串口通信"。串口通信(Serial Communication)是指数据以串行的方式一位一位地传输,通常涉及RS-232、RS-485等标准。在SpringBoot...
3. **编写简单的应用**:从例子入手,创建一个简单的MINA服务器和客户端,理解它们之间的通信机制。 4. **实现自定义过滤器**:根据需求,编写自定义的过滤器,以实现特定的数据处理功能。 5. **性能调优**:了解...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,主要用于简化开发高质量的网络服务。MINA的目标是为开发者提供一个简单易用但功能强大的库,...
**Mina官网例子之时间服务器** Apache Mina(Minimum Asynchronous Network)是一个高度可扩展的网络通信框架,它为各种协议提供了低级别的基础结构,包括TCP/IP和UDP/IP。Mina的目标是简化网络编程,使其变得高效...
这个"mina通讯例子"展示了如何利用MINA库来实现客户端与服务器之间的对象通信。 在MINA中,核心概念包括`Session`、`Filter`和`Handler`。`Session`代表了网络连接,它提供了读写数据的方法;`Filter`是数据处理链...
在这个"Mina例子包含与Spring整合"的项目中,我们将探讨如何将MINA与流行的Java企业级框架Spring进行集成。 1. **Apache MINA**:MINA是基于Java NIO(非阻塞I/O)的网络应用框架,用于构建高性能、跨平台的服务器...
在这个“Mina服务端例子”中,我们主要探讨的是如何使用Mina框架来实现一个基于Socket的非阻塞I/O(NIO)服务端。 1. **Mina框架介绍**: Mina提供了事件驱动和异步处理模型,使得开发者可以专注于业务逻辑,而...
《Mina 服务器开发实例详解》 Mina(Minimum Asynchronous Network)是一个开源的Java框架,主要用于构建高性能、...通过理解并实践上述例子,你将能够更好地掌握Mina,并在实际项目中运用它来构建高性能的网络应用。
通过这个"mina使用例子",你可以深入理解如何使用Mina来构建一个网络应用,从创建服务端、配置过滤器链,到处理客户端的连接和数据交换,以及如何进行性能优化和异常处理。这个例子将为你提供实践Mina框架的第一手...
**mina即时聊天demo** Mina(Java Multithreaded Application Network Architecture)是一个开源的网络通信框架,由Apache软件基金会开发并维护。它提供了一个高度可扩展的、高性能的、事件驱动的I/O服务架构,广泛...
本入门例子将带你了解如何使用MINA进行基本的网络通信应用开发。 首先,MINA的核心概念包括`Session`、`Filter`和`Handler`。`Session`代表一个网络连接,它是数据传输的通道;`Filter`是处理`Session`中数据的...
Apache MINA是一个网络应用程序框架,本实例在android下 进行串口通讯的例子
包含了官方例子中所有相关的jar包:log4j, mina-core, mina-integration-jmx, mina-statemachine, org.springframework.context, slf4j-api, slf4j-log4j12等
最近做rfid读写,C#和java都用udp不用厂家的动态库,udp自己写也简单,但是试了一下Apache mina ,接收的不是string,二十byte[] 数组,简单实现了UDP,网上也有例子,但是不是我要的。可用。
Apache Mina是一个开源的网络通信应用框架,主要应用于Java平台,它为高性能、高可用性的网络应用程序提供了基础架构。在本文中,我们将深入探讨Mina的高级使用,特别是在文件图片传送、文件发送、XML和JSON报文处理...