`
picasso.di
  • 浏览: 51048 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

MINA2官方教程翻译(8)传输特性之UDP

    博客分类:
  • MINA
阅读更多

该教程可以帮助你使用MINA框架编写基于UDP的Socket应用程序。在这篇教程中,我们将编写一个server端程序,server可以通过连接该程序来展现client端程序的内存使用情况。现实中的很多程序都已经具备与该程序类似的功能,可以监控程序来内存使用情况。

构建代码

MINA 2.0的最终版本还没有release,但是你可以下载最新的版本。如果你希望从trunk构建代码,可以参考开发者指南。

 

应用程序


 

如上图所示,该server在端口18567监听,client端连接server端并向server端发送内存使用数据。在上图所展示应用中,共有两个client连接到了server。

 

程序执行流程

  1. server在18567端口监听客户端请求;
  2. client连接server端,server会在Session Created事件处理时增加一个Tab页;
  3. clients向server发送内存使用数据;
  4. server端把接收到的数据展现在Tab上。

Server端代码分析

我们可以在MINA的示例代的org.apache.mina.example.udp包下找到这些代码。对于每个实例,我们只需要关系MINA相关的代码。

要想构建该server,我们需要做如下操作:

  1. 创建一个数据报socket,监听client端请求。(请参考MemoryMonitor.java);
  2. 创建一个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
1
0
分享到:
评论

相关推荐

    Android Mina UDP数据交互

    本文将深入探讨如何使用Mina库在Android客户端与Java服务器之间实现UDP(用户数据报协议)的数据交互。 UDP是一种无连接的、不可靠的传输层协议,相比TCP,它具有更低的延迟和更高的数据传输效率。然而,由于其不...

    给予mina 协议进行大数据传输

    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版本,并且有一个官方教程,这个教程是中文版的,方便中文使用者学习。描述中提及了"apache-mina-2.0.7-bin.zip",这是一个...

    apache_mina2收集的教程

    《Apache Mina2官方教程翻译》是Mina2的官方文档中文版,详细介绍了如何使用Mina进行网络编程。这份文档将帮助你理解Mina的核心概念,包括过滤器链、事件驱动模型和I/O多路复用技术。通过学习,你可以了解到如何创建...

    Mina官方教程_中文版.rar

    《Mina官方教程_中文版》是一份专为学习Mina框架的中文教育资源,它涵盖了Mina框架的基础知识、核心概念以及实际应用技巧。Mina(MinA Socket API)是Apache软件基金会的一个开源项目,主要设计用于构建高性能、高可...

    mina2推送demo客户端

    4. MINA2的异步特性: MINA2基于NIO(Non-blocking I/O)模型,允许在单个线程中处理多个连接,提高了系统并发能力。在"echo_client_udp"中,当客户端发送数据后,MINA2会异步等待服务器的响应,这样可以有效地避免...

    Mina网络通信传输

    即时聊天系统的核心在于高效的数据传输和低延迟,Mina框架的事件驱动模型和非阻塞I/O特性正好满足这些需求,它能同时处理大量并发连接,确保即使在网络拥堵的情况下也能保持良好的用户体验。 压缩包中的文件...

    Java springboot 整合mina 框架,nio通讯基础教程,mina框架基础教程.zip

    Mina支持多种协议,如TCP、UDP等,适用于开发服务器端和客户端应用。Mina的核心组件包括IoSession(会话),管理连接状态和传输数据;IoFilter(过滤器),用于数据的预处理和后处理;IoHandler(处理器),处理实际...

    mina UDP 数据库连接池

    总的来说,基于MINA的UDP数据库连接池实现了高效、可靠的UDP数据接收和数据库操作,利用了MINA的异步特性、线程池的并发处理能力以及数据库连接池的资源复用,有效解决了UDP通信与数据库交互中的性能和稳定性问题。...

    MINA2 教程 socket

    在这个"MINA2 教程 socket"中,我们将探讨如何使用MINA2来实现服务器与客户端之间的通信,并且支持同时在线连接,以及如何利用`newFixedThreadPool`线程池来优化处理并发连接。 1. **MINA2基本概念**: MINA2的...

    mina2核心框架

    2. **协议无关性**:MINA2的设计旨在支持多种网络协议,开发者可以通过简单的接口切换来实现TCP、UDP、SSL/TLS等不同协议的服务。这使得MINA2成为构建跨平台、多协议网络应用的理想选择。 3. **高度可扩展性**:...

    mina文件传输

    Mina(MINA,全称Java Minimal Asynchronous Network Library)是一个用Java开发的网络通信框架,主要用于简化网络应用的开发,尤其是TCP和UDP协议的应用。它提供了高度抽象的API,使得开发者可以更专注于业务逻辑,...

    Mina2中文文档

    - **特性**:列出了Mina的一些关键特性,如支持多种传输协议、灵活的消息编码机制等。 - **开始的步骤**:简述了使用Mina开发网络应用程序的基本步骤,包括环境搭建、项目创建等。 #### Chapter 2 - 基础 - **应用...

    mina2.x开发示例

    8. **性能优化**:Mina2.x引入了更高效的内存管理,减少了内存复制,提升了性能。同时,开发者还可以根据具体需求调整线程池大小、缓冲区大小等参数,进一步优化性能。 9. **扩展性**:Mina框架的模块化设计使其...

    mina2+spring结合实例

    它支持多种协议,如TCP、UDP、SSL/TLS等,且提供了一套完整的过滤器体系,允许开发者在数据传输过程中添加自定义处理逻辑。Mina2的核心概念包括Session、Filter和ProtocolHandler,这些组件共同协作,实现网络通信的...

    Java mina2源码

    Java Mina2是一个高度可扩展且高性能的网络通信框架,主要用在开发基于TCP、UDP等协议的服务端应用。它提供了简单而强大的API,使得开发者能够轻松构建网络应用程序,如服务器端的聊天室、游戏服务器或者任何需要...

    MINA2 用户手册(中英文2个版本)加API(英文)

    8. **应用场景**:MINA2广泛应用于高性能的网络应用开发,例如在线游戏服务器、实时数据交换系统、分布式计算节点通信等,尤其适合需要处理大量并发连接的场景。 9. **最佳实践**:用户手册中通常会包含一些最佳...

    mina2.0 英文版 中文版 官方文档

    MINA 2.0 版本引入了诸多改进和新特性,使其在性能、稳定性和易用性上都有显著提升。 《mina_2.0_user_guide》是官方提供的用户指南,包含了关于如何使用 MINA 2.0 进行网络编程的详细信息。以下是一些关键知识点:...

    mina2依赖jar包

    标题"mina2依赖jar包"指的是Apache Mina 2项目所需的Java类库文件。这些jar包是Mina框架的核心组件,它们为开发网络应用程序提供了基础架构,特别是对于TCP/IP和UDP协议的高效处理。描述中列出的jar包包括: 1. **...

    mina-2.0.19官方相关jar包

    2. **协议无关性**:MINA抽象了各种传输协议,如TCP/IP、UDP/IP、SSL/TLS等,开发者可以通过统一的API来处理不同类型的网络通信,降低了开发复杂度。 3. **事件驱动**:MINA采用事件驱动的设计,通过事件监听器机制...

Global site tag (gtag.js) - Google Analytics