server端:
void UdpServerByMina(int port){
acceptor=new NioDatagramAcceptor();
acceptor.setHandler(new ChatUdpServerHandler());
//can use that port next again
//acceptor.getSessionConfig().setReuseAddress(true);
DefaultIoFilterChainBuilder chain=acceptor.getFilterChain();
chain.addLast("logger", new LoggingFilter());
try {
acceptor.bind(new InetSocketAddress(port));
} catch (IOException e) {
e.printStackTrace();
}
}
public class ChatUdpServerHandler implements IoHandler {
public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
cause.printStackTrace();
session.close(false);
}
//some service handle
public void messageReceived(IoSession session, Object message) throws Exception {
if(message instanceof IoBuffer){
IoBuffer buffer=(IoBuffer)message;
Command command=Command.getCommand(buffer,(InetSocketAddress)session.getRemoteAddress());
if(command!=null)
command.execute();
}
}
public void messageSent(IoSession session, Object message) throws Exception {
}
public void sessionClosed(IoSession session) throws Exception {
}
public void sessionCreated(IoSession session) throws Exception {
}
public void sessionIdle(IoSession session, IdleStatus status) throws Exception {
}
public void sessionOpened(IoSession session) throws Exception {
}
}
client端:
public void send(InetAddress addr,int port,final byte[] data){
IoConnector connector=new NioDatagramConnector();
connector.setHandler(new ChatUdpClientHandler());
ConnectFuture future=connector.connect(new InetSocketAddress(addr.getHostAddress(),port));
future.awaitUninterruptibly();
future.addListener(new IoFutureListener<ConnectFuture>(){
public void operationComplete(ConnectFuture future) {
if (future.isConnected()) {
ioSession = future.getSession();
/*
* this is just for heap buffer.
* if true derict buffer will be returned , and then it cannot be gc.
* easy to OOM exception
*/
IoBuffer buffer = IoBuffer.allocate(data.length,false);
buffer.put(data);
/*
* Flips this buffer.
* The limit is set to the current position and then the position is set to zero.
* If the mark is defined then it is discarded
* This method is often used in conjunction with the compact method when transferring data from one place to another.
* @see Buffer#compact
*/
buffer.flip();
//buffer.compact();
//buffer.put(someobj);
//buffer.flip();
ioSession.write(buffer);
} else {
System.out.println("Not connected...exiting");
}
}
});
future.cancel();
//future.getSession().getCloseFuture().awaitUninterruptibly();
}
有2点需要说明:
1.direct和heap buffer。
Direct Byte Buffer [ByteBuffer.allocateDirect()]: Given a direct byte buffer, the Java virtual machine will make a best effort to perform native I/O operations directly upon it.
Heap Byte Buffer [ByteBuffer.allocate()]: A byte buffer backed by a byte array.
View Byte Buffer [ByteBuffer.slice()]: a byte buffer whose content is a shared subsequence of direct or heap byte buffer's content.
下面这2段说的更详细
Utilities for direct (native) buffers. Unlike arrays and non-direct buffers that are backed by arrays, the contents of direct buffers cannot move during garbage-collection. This makes direct buffers useful in systems (e.g., OpenGL) that require native pointers to memory.
Memory allocated for a direct buffer typically lies outside the garbage-collected Java heap. That memory is freed when the direct buffer is garbage collected. Unfortunately, garbage collection normally occurs when insufficient space is available inside the Java heap. If insufficient space outside the Java heap is available, then allocation of a new direct buffer may fail with a OutOfMemoryError. This error may occur because direct buffers that are garbage have not yet been collected, perhaps because plenty of space is available inside the Java heap.
A solution to this problem is to perform garbage collection when this error occurs. Normally, a OutOfMemoryError is fatal. However, methods in this class that allocate direct buffers will catch this error and call System.gc() before attempting to allocate the buffer a second time. If that second attempt fails, then no further attempts are made and the error is thrown again. There is no guarantee that this solution will work, but we have not yet seen it fail in tests that repeatedly allocate direct buffers that quickly become garbage.
One reason why MappedByteBuffer can be faster is that it can be based on a 'Direct' ByteBuffer.
When a ByteBuffer is 'Direct', the bytes behind it are allocated outside the JVM in an OS specific manner and can be directly accessed by OS input/output calls. By doing this a whole set of OS specific file calls can be easily used that were not necessarily used by older JVMs (this can include OS specific buffering calls that are supported in hardware).
2.flip和compact的使用
具体参照代码里的注释,个人理解为,buffer为一个特殊的数组结构,这里理解为一个临时对象tmp,可以任意的put操作,当你认为这些可以作为一个完整的对象发送给udp的另一端的时候,需要结束这些操作把tmp对象转换为buffer。当然如果发送完毕之后你仍要对之前的buffer对象进行put操作,需要执行compact,把它还原为那个tmp临时对象。
最后附一张摘自ibm的mina架构图,帮助理解:
- 大小: 101.6 KB
分享到:
相关推荐
本示例聚焦于Mina中的自定义协议通信,这允许开发人员根据特定需求设计通信协议,而不是局限于预设的如TCP或UDP等标准协议。 首先,我们要理解Mina的基本工作原理。Mina提供了一个事件驱动的异步I/O模型,使得处理...
首先,Apache Mina提供了一个异步事件驱动的网络应用编程接口(API),它简化了TCP/IP和UDP协议的处理,如HTTP、FTP、SMTP等。Mina的核心思想是基于回调的事件模型,允许开发者编写非阻塞式的I/O代码,提高了系统的...
Apache Mina是一个开源项目,它提供了一个高度可扩展且高性能的网络通信框架,支持多种协议,如TCP、UDP等。 首先,理解Mina的核心概念是必要的。Mina基于事件驱动和异步模型,允许开发者创建高效的网络应用。其...
Mina提供了一种简单的方式来构建网络服务,如TCP/IP和UDP/IP,以及SSL/TLS加密的协议。这个"mina开发实例"可能是关于如何使用Mina框架创建网络应用的教程或示例代码。 Mina的核心设计理念是将网络通信的底层细节...
MINA的目标是为开发者提供一个简单易用但功能强大的库,使得他们能够构建网络应用,如TCP/IP和UDP协议的服务器和客户端,而无需深入理解底层网络编程的复杂性。 MINA的核心设计理念是基于非阻塞I/O(Non-blocking I...
MINA 提供了一套高级的网络编程抽象层,简化了开发过程,特别是对于那些处理TCP/IP和UDP/IP协议栈的应用。在这个“mina-2.0.0-M6.zip”压缩包中,包含了MINA库的源代码和示例,是学习和理解MINA工作原理的理想资源。...
Mina框架是一个高性能、事件驱动的网络应用框架,主要用于简化Java网络编程,特别是TCP和UDP协议的处理。它被广泛应用于开发服务器端应用,如FTP、SMTP、HTTP等协议的服务,以及任何基于TCP或UDP协议的应用。Mina的...
MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,用于构建服务器端应用程序,尤其在开发TCP和UDP协议的应用时非常有用。MINA 1.0 版本是该框架的一个...
10. **实际应用**:Mina常用于开发网络服务,如聊天服务器、文件传输服务器、在线游戏服务器等。它的灵活性和高性能使得它在各种复杂场景下都能胜任。 通过这个"mina使用例子",你可以深入理解如何使用Mina来构建一...
### Mina开发步骤 #### 1. 配置log4j日志记录器 在Mina项目中,日志记录是非常重要的环节之一,通过合理的日志配置可以方便地追踪程序运行状态,定位问题所在。log4j.properties文件中的配置如下: ```properties ...
而Mina则是一款强大的网络通信库,它提供了对TCP/IP和UDP协议的支持,同时也支持串口通信。本文将详细介绍如何在Spring Boot项目中整合Mina来实现串口通信。 首先,我们需要了解Spring Boot的基本架构。Spring Boot...
它提供了一个高度可扩展的、高性能的、事件驱动的I/O服务架构,广泛应用于各种网络协议的实现,如TCP/IP、UDP/IP以及HTTP等。在本“mina即时聊天demo”中,我们可以通过学习如何利用Mina来构建一个简单的即时聊天...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,主要用于简化开发可扩展且高效的网络应用,如TCP/IP和UDP/IP服务器。MINA的目标是帮助开发者...
MINA(Multi-purpose Infrastructure for Network Applications)是一个高性能、异步的网络通信框架,由Apache软件基金会开发,主要用于构建网络应用程序,如TCP/IP和UDP/IP协议的应用。MINA2是其第二个主要版本,...
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,主要用于简化开发Java网络应用,特别是那些基于TCP和UDP协议的应用。MINA 2.0版本是其一个...
MINA旨在简化网络编程,特别是对于TCP/IP和UDP/IP协议栈的应用,如FTP、SSH、 Telnet等服务。MINA的核心优势在于它的非阻塞I/O模型,这使得它在处理大量并发连接时表现出色。 MINA的高性能特性主要体现在以下几个...
MINA 提供了一种统一的方式来处理多种传输协议,如 TCP/IP 和 UDP/IP,以及套接字和 NIO(Non-blocking I/O)接口。本文将通过一个实例来深入理解 MINA 2.0 的核心概念和使用方法。 首先,我们来看`.classpath`和`....
Mina旨在简化网络应用的开发,支持多种传输协议,如TCP、UDP、HTTP、FTP等。在这个“Mina入门:Mina版之HelloWorld”教程中,我们将探讨如何使用Mina构建一个简单的网络通信应用。 首先,我们需要了解Mina的核心...
Mina通过提供一个抽象层来帮助开发者构建可扩展的网络应用,这些应用可以是基于TCP/IP或UDP/IP协议的服务器和客户端。Mina使用Java NIO(New I/O)作为底层支持来实现异步的、事件驱动的网络通信。这种机制使得网络...
Mina的核心设计思想是提供一个可扩展的框架,允许开发者创建各种类型的网络服务,如TCP/IP协议的应用(如HTTP、FTP)、UDP协议的应用以及自定义协议。它的核心组件包括IoSession,这是处理网络连接的核心对象,包含...