参考文章:http://blog.chinabyte.com/a/534099.html
传递对象的原因:个人理解:符合面向对象,服务器接收客户端消息,需要解析,处理,应答,如果传的是对象,可以把解析,处理,应答写在对象里,这么做,扩展性更好.
客户端
1 MinaClient.java
package com.nafio.client; import java.net.InetSocketAddress; import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder; import org.apache.mina.core.future.ConnectFuture; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory; import org.apache.mina.transport.socket.nio.NioSocketConnector; /** * @author nafio 2012-08-20 * mina传递对象客户端 */ public class MinaClient { //使用单例模式 private static MinaClient minaClient = null; //创建 TCP/IP connector NioSocketConnector connector = new NioSocketConnector(); //创建接收数据的过滤器 DefaultIoFilterChainBuilder chain = connector.getFilterChain(); //使用单例 //相关的IoHandlerAdapter继承类都采用了单实例模式 //在整个通信过程中做到对象session等实例的单一防止发生“所托非人”的现象//这个不是很理解? public static MinaClient getInstances() { if (null == minaClient) { minaClient = new MinaClient(); } return minaClient; } private MinaClient() { //设定这个过滤器将按对象读取数据 chain.addLast("myChin", new ProtocolCodecFilter( new ObjectSerializationCodecFactory())); connector.setHandler(ClientHandler.getInstances(connector));//by nafio用于彻底关闭客户端连接 //设定连接超时 connector.setConnectTimeout(30); //连接服务器 ConnectFuture cf = connector.connect(new InetSocketAddress("localhost", 8888)); } public static void main(String args[]) { MinaClient.getInstances(); } }
2 ClientHandler.java
package com.nafio.client; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; import org.apache.mina.transport.socket.nio.NioSocketConnector; import com.nafio.obj.TransferObj; /** * @author nafio 2012-08-20 * mina传递对象客户端 */ public class ClientHandler extends IoHandlerAdapter { private static ClientHandler minaClientHandler = null; NioSocketConnector connector;//by nafio用于彻底关闭客户端连接 public static ClientHandler getInstances(NioSocketConnector con) { if (null == minaClientHandler) { minaClientHandler = new ClientHandler(con); } return minaClientHandler; } private ClientHandler(NioSocketConnector con) { connector=con; } public void sessionOpened(IoSession session) throws Exception { //session.write("来自客户端:与服务端会话打开"); System.out.println("客户端:打开了与服务端的会话"); sendMsg(session); } //会话结束后触发 public void sessionClosed(IoSession session) { System.out.println("客户端:与服务端会话结束"); } //接到返回信息后触发 public void messageReceived(IoSession session, Object message)throws Exception { System.out.println("客户端:接收到服务端返回信息"); } //连接创建时触发 public void sessionCreated(IoSession session) throws Exception { super.sessionCreated(session); System.out.println("客户端:与服务端连接创建"); } //连接空闲是触发 public void sessionIdle(IoSession session, IdleStatus status) throws Exception { super.sessionIdle(session, status); System.out.println("客户端:连接空闲"); } //发送信息后触发 public void messageSent(IoSession arg0, Object arg1) throws Exception { //System.out.println("客户端:已向服务器发送-->"+(String)arg1); System.out.println("客户端:发送对象完毕"); arg0.close();//这里实际不能彻底关闭mina2.0需要connector.dispose()才能彻底关闭 connector.dispose();//不需要关闭去掉这两句就ok System.out.println("客户端:强行关闭连接"); } /** * 传送信息 * @param session * @throws Exception */ public void sendMsg(IoSession session) throws Exception{ TransferObj transferObj=new TransferObj(); transferObj.setDate("nafio_date"); session.write(transferObj); } public void exceptionCaught(IoSession session, Throwable cause) throws Exception { super.exceptionCaught(session, cause); } }
3 TransferObj.java
package com.nafio.obj; public class TransferObj implements java.io.Serializable{ private String date; public String getDate() { return date; } public void setDate(String date) { this.date = date; } }
服务端
1 MinaServer.java
package com.nafio.server; 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.serialization.ObjectSerializationCodecFactory; import org.apache.mina.transport.socket.SocketAcceptor; import org.apache.mina.transport.socket.nio.NioSocketAcceptor; public class MinaServer { private static MinaServer minaServer = null; //创建一个非阻塞的Server端Socket private SocketAcceptor acceptor = new NioSocketAcceptor(); //创建接收数据的过滤器 private DefaultIoFilterChainBuilder chain = acceptor.getFilterChain(); private int bindPort = 8888; //单例 public static MinaServer getInstances() { if (null == minaServer) { minaServer = new MinaServer(); } return minaServer; } private MinaServer() { //设定这个过滤器将按对象读取数据 chain.addLast("myChin", new ProtocolCodecFilter( new ObjectSerializationCodecFactory())); //设定服务器端的消息处理器:一个MinaServerHandler对象, acceptor.setHandler(ServerHandler.getInstances()); try { //绑定端口,启动服务器 acceptor.bind(new InetSocketAddress(bindPort)); } catch (IOException e) { e.printStackTrace(); } System.out.println("服务端:监听端口--->" + bindPort); } public static void main(String[] args) throws Exception { MinaServer.getInstances(); } }
2 ServerHandler.java
package com.nafio.server; import org.apache.mina.core.filterchain.IoFilterAdapter; import org.apache.mina.core.service.IoHandler; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IdleStatus; import org.apache.mina.core.session.IoSession; import com.nafio.obj.TransferObj; //下面两种写法应该等同,不确定? //public class ServerHandler extends IoHandlerAdapter { public class ServerHandler extends IoFilterAdapter implements IoHandler { private static ServerHandler samplMinaServerHandler = null; public static ServerHandler getInstances() { if (null == samplMinaServerHandler) { samplMinaServerHandler = new ServerHandler(); } return samplMinaServerHandler; } private ServerHandler() { } public void sessionOpened(IoSession session) throws Exception { } public void sessionClosed(IoSession session) { } public void messageReceived(IoSession session, Object message)throws Exception { if (message instanceof TransferObj) { TransferObj obj = (TransferObj) message; System.out.println("服务端:收到客户端数据--->"+obj.getDate()); } } 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 { } public void sessionIdle(IoSession arg0, IdleStatus arg1) throws Exception { } }
3 TransferObj.java(跟客户端相同,因为客户端和服务端要分开,所以这个类两个工程中都放一个)
彻底关闭mina客户端连接的方法
session.close();
java默认不赞成使用这个方法
这个方法使用后客户端实际还没彻底关闭
mina2.0彻底关闭用connector.dispose();
关于socket长短连接
通常的短连接操作步骤是:
连接→数据传输→关闭连接;
而长连接通常就是:
连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接;
这就要求长连接在没有数据通信时,定时发送数据包(心跳),以维持连接状态,短连接在没有数据传输时直接关闭就行了
所以mina默认应该就是长连接所以默认不关闭.
相关推荐
在这个"网络编程(socket、NIO、mina)---demo"的主题中,我们将深入探讨三个关键概念:Socket编程、非阻塞I/O(Non-blocking I/O,简称NIO)以及Apache Mina框架。这些技术广泛应用于构建高性能、高并发的网络应用...
Java SpringBoot 整合Mina框架,涉及到的核心技术主要包括Java NIO(非阻塞I/O)、Mina框架以及SpringBoot的集成应用。本教程旨在帮助开发者深入理解和掌握这些技术,并提供了一个可直接使用的基础平台框架。 Java ...
NIO在Java 1.4版本中引入,其核心是Channel、Buffer和Selector三大组件。下面将详细介绍这三个主要概念以及NIO在实际开发中的应用。 1. **Channel(通道)**:Channel类似于传统I/O中的流,但有显著的不同。在NIO中...
NIO (Non-blocking Input/Output) 和 MINA (Multipurpose Infrastructure for Network Applications) 是Java中用于高性能网络应用的两个重要框架。NIO是Java标准库的一部分,提供了与传统IO(Blocking I/O)不同的I/...
jaca视频教程 jaca游戏服务器端开发 Netty NIO AIO Mina视频教程 课程目录: 一、Netty快速入门教程 01、第一课NIO 02、第二课netty服务端 03、第三课netty客户端 04、第四课netty线程模型源码分析(一) 05、...
MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、易用的网络应用程序框架,基于Java NIO构建。MINA为开发者提供了高度抽象的API,简化了网络编程的复杂性。MINA支持TCP和UDP协议,适用...
《Mina NIO Socket:深度解析与应用》 在Java世界中,网络编程是一个不可或缺的部分,而Mina NIO(Non-blocking I/O)Socket库则是Java开发者实现高性能、高并发网络服务的重要工具。本文将深入探讨Mina NIO Socket...
当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版中提供),MINA 所支持的功能也在进一步的扩展中。不管是新手还是老手,还是很有学习参考价值的。
MINA框架(Multipurpose Infrastructure for Network Applications)是基于Java NIO设计的网络应用程序框架,其特点是采用松耦合架构,支持灵活的过滤器机制,同时单元测试也更为容易实现。MINA允许自定义线程数量,...
在本篇博文中,我们将深入探讨如何利用Apache MINA库实现基于TLS/SSL的NIO(非阻塞I/O)Socket通信。MINA是一个高度可扩展的网络应用框架,广泛用于构建高性能、高并发的网络应用程序,如服务器端的TCP和UDP服务。...
本文将通过一个对比实例,探讨一般Socket客户端与Mina NIO (Non-blocking I/O) Socket客户端的差异和特点,帮助开发者理解这两种技术在实际应用中的选择。 首先,普通Socket客户端基于BIO(Blocking I/O)模型,它...
【标题】"原创nio socket mina+javascript+flash实现commet长连接网页聊天室"揭示了一个基于Java NIO(Non-blocking I/O)的Socket通信框架Mina与JavaScript、Flash技术结合,实现COMET(Comet是使服务器向浏览器推...
标题中的“练练手,用mina2.0搭建一个nio客户端”表明了本文将探讨如何使用Mina 2.0框架构建一个基于非阻塞I/O(NIO)的客户端应用。Mina是一个开源的Java框架,常用于开发高性能、高并发的网络通信应用,如TCP/IP和...
1. 优化的内存管理:Mina ByteBuffer可能使用更高效的内存分配策略,例如直接内存分配,避免了Java对象在堆上的创建和垃圾收集开销。 2. 基于池化的管理:Mina通过缓冲区池来复用ByteBuffer实例,减少频繁的创建和...
最近使用Mina开发一个Java的NIO服务端程序,因此也特意学习了Apache的这个Mina框架。 首先,Mina是个什么东西?看下官方网站(http://mina.apache.org/)对它的解释: Apache的Mina(Multipurpose Infrastructure ...
### 基于MINA构建高性能的NIO应用 #### 概述 MINA作为一款优秀的客户端/服务器架构下的Java服务器框架,凭借其强大的功能和灵活性,在开发高性能网络应用程序方面表现突出。本文将深入探讨MINA的核心概念、优势...
在本教程中,我们将深入探讨如何整合Spring Boot与Mina框架,同时介绍Java NIO(非阻塞I/O)的基础知识。Spring Boot以其简洁、快速的起步方式深受开发者喜爱,而Mina则是一个强大的网络通信框架,常用于构建高性能...
通过使用I/O多路复用技术,如NIO(非阻塞I/O),Mina能够高效地管理多个连接,而无需为每个连接创建单独的线程。这极大地降低了系统资源的消耗,提高了服务器的并发能力。 2. **Mina文件图片传送** 在Mina中,我们...
MINA框架通过封装NIO,提供了一种更加面向对象和易于使用的API,使得开发者可以更方便地创建高性能、可扩展的网络应用,如TCP和UDP服务器。 在上述代码中,可以看到如何使用MINA框架初始化一个服务器: 1. `...