该教程可以帮助你使用MINA框架编写基于UDP的Socket应用程序。在这篇教程中,我们将编写一个server端程序,server可以通过连接该程序来展现client端程序的内存使用情况。现实中的很多程序都已经具备与该程序类似的功能,可以监控程序来内存使用情况。
构建代码
MINA 2.0的最终版本还没有release,但是你可以下载最新的版本。如果你希望从trunk构建代码,可以参考开发者指南。
应用程序
如上图所示,该server在端口18567监听,client端连接server端并向server端发送内存使用数据。在上图所展示应用中,共有两个client连接到了server。
程序执行流程
- server在18567端口监听客户端请求;
- client连接server端,server会在Session Created事件处理时增加一个Tab页;
- clients向server发送内存使用数据;
- server端把接收到的数据展现在Tab上。
Server端代码分析
我们可以在MINA的示例代的org.apache.mina.example.udp包下找到这些代码。对于每个实例,我们只需要关系MINA相关的代码。
要想构建该server,我们需要做如下操作:
- 创建一个数据报socket,监听client端请求。(请参考MemoryMonitor.java);
- 创建一个IoHandler来处理MINA框架生成的各种事件。(请参考MemoryMonitorHandler.java)。
第一步可以通过该程序片来实现:
NioDatagramAcceptor acceptor = new NioDatagramAcceptor();
acceptor.setHandler(new MemoryMonitorHandler(this));
这里,我们创建一个NioDatagramAcceptor来监听client端请求,并且设置它的IoHandler。变量"PORT"是一个int值。下一步我们家filter链中加入了一个logging filter。LoggingFilter是一个非常不错的记录日志的方式,它可以在很多节点处生成日志信息,这些热值能够展现出MINA框架的工作方式。
DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
chain.addLast("logger", new LoggingFilter());
下一步我们深入一下UDP传输所特有的代码。我们设置acceptor可以重用address。
DatagramSessionConfig dcfg = acceptor.getSessionConfig();
dcfg.setReuseAddress(true);acceptor.bind(new InetSocketAddress(PORT));
当然,最后一件事情是调用bind()方法来绑定端口。
IoHandler实现
Server端主要关心如下三个事件:
- Session创建
- Message接收
- Session关闭
详细代码如下:
Session Created Event
@Override
public void sessionCreated(IoSession session) throws Exception {
SocketAddress remoteAddress = session.getRemoteAddress();
server.addClient(remoteAddress);
}
在session创建事件中,我们调用addClient()方法来增加一个Tab页。
Message Received Event
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
if (message instanceof IoBuffer) {
IoBuffer buffer = (IoBuffer) message;
SocketAddress remoteAddress = session.getRemoteAddress();
server.recvUpdate(remoteAddress, buffer.getLong());
}
}
在message接收事件中,我们从接收到的消息中得到所关心的内存使用的数据;应用程序还需要发送响应信息。在这个方法中,处理消息和发送响应都是通过session完成的。
Session Closed Event
@Override
public void sessionClosed(IoSession session) throws Exception {
System.out.println("Session closed...");
SocketAddress remoteAddress = session.getRemoteAddress();
server.removeClient(remoteAddress);
}
在session关闭事件中,我们需要删除对应的Tab页。
Client端代码分析
在这一节,我们将解释一下客户端代码。实现客户端我们需要进行如下操作:
- 创建Socket并连接到server端
- 设置IoHandler
- 收集内存使用信息
- 发送数据到server端
我们从MemMonClient.java开始,可以在org.apache.mina.example.udp.client包下找到它。开始的几行代码非常简单:
connector = new NioDatagramConnector();
connector.setHandler( this );
ConnectFuture connFuture = connector.connect( new InetSocketAddress("localhost", MemoryMonitor.PORT ));
这里我们创建了一个NioDatagramConnector,设置了它的handler并且连接到server端。我们必须在InetSocketAddress对象中设定host,否则程序不能正常运行。该程序是在Windows XP环境下开发运行的,所以与其他环境可能存在差别。下一步我们等待确认client已经连接到server端,一旦连接建立,我们可以开始向server端发送数据。代码如下:
connFuture.addListener( new IoFutureListener(){
public void operationComplete(IoFuture future) {
ConnectFuture connFuture = (ConnectFuture)future;
if( connFuture.isConnected() ){
session = future.getSession();
try {
sendData();
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
log.error("Not connected...exiting");
}
}
});
这里我们在ConnectFuture对象中加入一个listener,当client连接到server端时,operationComplete方法将被回调,这时我们开始发送数据。我们通过调用sendData方法向server端发送数据,该方法如下:
private void sendData() throws InterruptedException {
for (int i = 0; i < 30; i++) {
long free = Runtime.getRuntime().freeMemory();
IoBuffer buffer = IoBuffer.allocate(8);
buffer.putLong(free);
buffer.flip();
session.write(buffer);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
throw new InterruptedException(e.getMessage());
}
}
}
该方法会在30秒内每秒向server端发送当前的剩余内存Cincinnati。你可以看到我们分配了一个足够大的IoBuffer来装载一个long型的变量。最后这个buffer被flipped并发送至server端。
- 大小: 11.1 KB
分享到:
相关推荐
本文将深入探讨如何使用Mina库在Android客户端与Java服务器之间实现UDP(用户数据报协议)的数据交互。 UDP是一种无连接的、不可靠的传输层协议,相比TCP,它具有更低的延迟和更高的数据传输效率。然而,由于其不...
MINA是Apache软件基金会的一个项目,它提供了一个高度可扩展和高性能的网络应用开发框架,适用于多种传输协议,如TCP/IP和UDP/IP,以及SSL/TLS加密。在大数据传输场景中,MINA因其非阻塞I/O模型而被广泛采用,能够...
标题提到的是"apache-mina-2.0.7 含官方教程",这意味着我们正在讨论Apache MINA的2.0.7版本,并且有一个官方教程,这个教程是中文版的,方便中文使用者学习。描述中提及了"apache-mina-2.0.7-bin.zip",这是一个...
《Apache Mina2官方教程翻译》是Mina2的官方文档中文版,详细介绍了如何使用Mina进行网络编程。这份文档将帮助你理解Mina的核心概念,包括过滤器链、事件驱动模型和I/O多路复用技术。通过学习,你可以了解到如何创建...
《Mina官方教程_中文版》是一份专为学习Mina框架的中文教育资源,它涵盖了Mina框架的基础知识、核心概念以及实际应用技巧。Mina(MinA Socket API)是Apache软件基金会的一个开源项目,主要设计用于构建高性能、高可...
4. MINA2的异步特性: MINA2基于NIO(Non-blocking I/O)模型,允许在单个线程中处理多个连接,提高了系统并发能力。在"echo_client_udp"中,当客户端发送数据后,MINA2会异步等待服务器的响应,这样可以有效地避免...
即时聊天系统的核心在于高效的数据传输和低延迟,Mina框架的事件驱动模型和非阻塞I/O特性正好满足这些需求,它能同时处理大量并发连接,确保即使在网络拥堵的情况下也能保持良好的用户体验。 压缩包中的文件...
Mina支持多种协议,如TCP、UDP等,适用于开发服务器端和客户端应用。Mina的核心组件包括IoSession(会话),管理连接状态和传输数据;IoFilter(过滤器),用于数据的预处理和后处理;IoHandler(处理器),处理实际...
总的来说,基于MINA的UDP数据库连接池实现了高效、可靠的UDP数据接收和数据库操作,利用了MINA的异步特性、线程池的并发处理能力以及数据库连接池的资源复用,有效解决了UDP通信与数据库交互中的性能和稳定性问题。...
在这个"MINA2 教程 socket"中,我们将探讨如何使用MINA2来实现服务器与客户端之间的通信,并且支持同时在线连接,以及如何利用`newFixedThreadPool`线程池来优化处理并发连接。 1. **MINA2基本概念**: MINA2的...
2. **协议无关性**:MINA2的设计旨在支持多种网络协议,开发者可以通过简单的接口切换来实现TCP、UDP、SSL/TLS等不同协议的服务。这使得MINA2成为构建跨平台、多协议网络应用的理想选择。 3. **高度可扩展性**:...
Mina(MINA,全称Java Minimal Asynchronous Network Library)是一个用Java开发的网络通信框架,主要用于简化网络应用的开发,尤其是TCP和UDP协议的应用。它提供了高度抽象的API,使得开发者可以更专注于业务逻辑,...
- **特性**:列出了Mina的一些关键特性,如支持多种传输协议、灵活的消息编码机制等。 - **开始的步骤**:简述了使用Mina开发网络应用程序的基本步骤,包括环境搭建、项目创建等。 #### Chapter 2 - 基础 - **应用...
8. **性能优化**:Mina2.x引入了更高效的内存管理,减少了内存复制,提升了性能。同时,开发者还可以根据具体需求调整线程池大小、缓冲区大小等参数,进一步优化性能。 9. **扩展性**:Mina框架的模块化设计使其...
它支持多种协议,如TCP、UDP、SSL/TLS等,且提供了一套完整的过滤器体系,允许开发者在数据传输过程中添加自定义处理逻辑。Mina2的核心概念包括Session、Filter和ProtocolHandler,这些组件共同协作,实现网络通信的...
Java Mina2是一个高度可扩展且高性能的网络通信框架,主要用在开发基于TCP、UDP等协议的服务端应用。它提供了简单而强大的API,使得开发者能够轻松构建网络应用程序,如服务器端的聊天室、游戏服务器或者任何需要...
8. **应用场景**:MINA2广泛应用于高性能的网络应用开发,例如在线游戏服务器、实时数据交换系统、分布式计算节点通信等,尤其适合需要处理大量并发连接的场景。 9. **最佳实践**:用户手册中通常会包含一些最佳...
MINA 2.0 版本引入了诸多改进和新特性,使其在性能、稳定性和易用性上都有显著提升。 《mina_2.0_user_guide》是官方提供的用户指南,包含了关于如何使用 MINA 2.0 进行网络编程的详细信息。以下是一些关键知识点:...
标题"mina2依赖jar包"指的是Apache Mina 2项目所需的Java类库文件。这些jar包是Mina框架的核心组件,它们为开发网络应用程序提供了基础架构,特别是对于TCP/IP和UDP协议的高效处理。描述中列出的jar包包括: 1. **...
2. **协议无关性**:MINA抽象了各种传输协议,如TCP/IP、UDP/IP、SSL/TLS等,开发者可以通过统一的API来处理不同类型的网络通信,降低了开发复杂度。 3. **事件驱动**:MINA采用事件驱动的设计,通过事件监听器机制...