`

Mina框架传递对象

 
阅读更多

   Apache MINA是一个网络应用程序框架,用来帮助用户简单地开发高性能和高可靠性的网络应用程序。它提供了一个通过Java NIO在不同的传输例如TCP/IP和UDP/IP上抽象的事件驱动的异步API。

   其中几个主要的组件如下:

I/O Service - 用来处理I/O流,对于Server端就是IOAcceptor的实现类接受Client端的连接请求,对于Client端就是IoConnector的实现类来建立到Server端的连接。

I/O Filter Chain - 用来过滤或转化数据。对于Server端和Client端来说都是IoFilter接口的实现类,MINA自己内建了很多IoFilter接口的实现类。具体可以参考官方文档。

I/O Handler - 用来处理真正业务逻辑的类。对于Server端和Client端来说都是IoHandler接口的实现类,通常来说需要自己编写。

 

由于Server端和Client端都是基于以上三个组件的,因此对于Server端和Client端编程来说就都有类似的代码结构。

对于Server端来说:

1. 创建I/O service - 这里就是创建IOAcceptor类监听端口。

2. 创建I/O Filter Chain - 这里就是告诉使用那些IoFilter。 
3. 创建I/O Handler - 自己的业务逻辑。

对于Client端来说:

1. 创建I/O service - 这里就是创建IOConnector类来建立到Server端的连接。

2. 创建I/O Filter Chain - 这里就是告诉使用那些IoFilter。

3. 创建I/O Handler - 自己的业务逻辑。

 

  对于简单的传输字符串,对mina来说是小菜一碟,当然它也可以用来传输对象。其基本过程为对象(客户端)->字节流(客户端)->发送->接收->字节流(服务器)->对象(服务器)。

   服务器端代码(1)

  package com.sohu.game.mina.sentObject;

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 MainServer {
	private static MainServer mainServer = null;
	private SocketAcceptor acceptor = new NioSocketAcceptor();
	private DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
	private int bindPort = 8887;

	public static MainServer getInstances() {
		if (null == mainServer) {
			mainServer = new MainServer();
		}
		return mainServer;
	}

	private MainServer() {
		//创建I/O Filter Chain
		//ProtocolCodecFilter实例用来编码数据,这里使用了ObjectSerializationCodecFactory类来序列化或反序列化数据成java对象。
		chain.addLast("myChin", new ProtocolCodecFilter(
				new ObjectSerializationCodecFactory()));
		acceptor.setHandler(ServerHandler.getInstances());
		try {
			//让IoAcceptor类实例绑定端口实现监听
			acceptor.bind(new InetSocketAddress(bindPort));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) throws Exception {
		MainServer.getInstances();
	}
}

 

   服务端代码(2)

   package com.sohu.game.mina.sentObject;


import java.util.ArrayList;
import java.util.List;

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 ServerHandler extends IoFilterAdapter implements IoHandler {
	private static ServerHandler samplMinaServerHandler = null;

	public static ServerHandler getInstances() {
		if (null == samplMinaServerHandler) {
			samplMinaServerHandler = new ServerHandler();
		}
		return samplMinaServerHandler;
	}

	private ServerHandler() {

	}

	// 当连接后打开时触发此方法,一般此方法与 sessionCreated 会被同时触发
	public void sessionOpened(IoSession session) throws Exception {
	}
	public void sessionClosed(IoSession session) {
	}
	/**
	 * 创建I/O Handler,这里主要看一下messageReceived方法,其接收了Object对象,然后又发送了一个Object对象给Client端。
	 */
	public void messageReceived(IoSession session, Object message)
			throws Exception {	
		if (message instanceof UserInfo) {
			UserInfo text = (UserInfo) message;
			System.out.println("服务器接收到从客户端的姓名:"+text.getName());
			System.out.println("服务器接收到从客户端的QQ:"+text.getQQNum());
		} 
		
		if (message instanceof Condition) {
			Condition text = (Condition) message;
			List<Student> students = text.getStudents();
			List<UserInfo> users = text.getUsers();
			System.out.println("服务器端接收到从客户端的学生信息数:"+students.size());
			System.out.println("服务器端接收到从客户端的用户信息数:"+users.size());
//			System.out.println("服务器接收到从客户端的姓名:"+text.getName());
//			System.out.println("服务器接收到从客户端的QQ:"+text.getQQNum());
		} else{
			if(message instanceof Student){
				System.out.println("哈哈");
			}
			System.out.println("aaa"+message.getClass());
			
		}
	}

	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 {
		
	}

}

 

   公共代码(1)

   package com.sohu.game.mina.sentObject;

public class Student implements java.io.Serializable{

	private String sname;
	private Integer age;
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	
}
 

   公共代码(2)

    package com.sohu.game.mina.sentObject;

public class UserInfo implements java.io.Serializable{
	private String name;
	private String QQNum;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getQQNum() {
		return QQNum;
	}
	public void setQQNum(String qQNum) {
		QQNum = qQNum;
	}
	
	
}

 

   客户端代码(1)

   package com.sohu.game.mina.sentObject;

import java.net.InetSocketAddress;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

public class MainClient {
	private static MainClient mainClient = null;
	NioSocketConnector connector = new NioSocketConnector();
	DefaultIoFilterChainBuilder chain = connector.getFilterChain();

	public static MainClient getInstances() {
		if (null == mainClient) {
			mainClient = new MainClient();
		}
		return mainClient;
	}

	private MainClient() {
		chain.addLast("myChin", new ProtocolCodecFilter(
				new ObjectSerializationCodecFactory()));
		connector.setHandler(ClientHandler.getInstances());
		connector.setConnectTimeout(30);
		connector.setConnectTimeoutMillis(30000);
		ConnectFuture cf = connector.connect(new InetSocketAddress("localhost",
				8887));
	}

	public static void main(String args[]) {
		MainClient.getInstances();
	}
}

 

  客户端代码(2)

  package com.sohu.game.mina.sentObject;

import java.util.ArrayList;

import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;

public class ClientHandler extends IoHandlerAdapter {
	private static ClientHandler samplMinaClientHandler = null;
	public static ClientHandler getInstances() {
		if (null == samplMinaClientHandler) {
			samplMinaClientHandler = new ClientHandler();
		}
		return samplMinaClientHandler;
	}

	private ClientHandler() {

	}

	public void sessionOpened(IoSession session) throws Exception {
		session.write("客户端与服务器的会话打开了……");
		UserInfo text=new UserInfo();
		text.setName("梅竹寒香");
		text.setQQNum("972341215");
		
		Student s1 = new Student();
		s1.setAge(89);
		s1.setSname("bianzhe");
		
		Student s2 = new Student();
		s2.setAge(88);
		s2.setSname("ganxin");
		
		Condition con = new Condition();
		ArrayList<Student> students = new ArrayList<Student>();
		students.add(s1);
		students.add(s2);
		con.setStudents(students);
		ArrayList<UserInfo> users = new ArrayList<UserInfo>();
		users.add(text);
		con.setUsers(users);
		
		//session.write(con);
		session.write(con);
		//session.write(text);
	}

	public void sessionClosed(IoSession session) {
	}

	public void messageReceived(IoSession session, Object message)
			throws Exception {
	}

	public void messageSent(IoSession arg0, Object arg1) throws Exception {
		System.out.println("客户端已经向服务器发送了:"+(String)arg1);
	}
}

 

  以上即是通过mina简单传递对象的过程。

0
0
分享到:
评论

相关推荐

    Mina通信框架应用示例

    Mina框架主要由以下几部分组成: - NIO框架库:MINA利用Java的非阻塞I/O模型,提供高效的数据传输能力。 - 客户端-服务器框架库:MINA支持多种通信协议,可以构建客户端和服务器端应用。 - 网络socket库:MINA...

    mina框架自定义解编码器

    在MINA框架中,解编码器是数据传输过程中的关键组件,负责将接收到的原始字节流转化为应用程序可以理解的对象,或者将应用程序准备发送的对象编码成字节流。自定义解编码器能帮助我们更好地处理特定的协议格式,...

    mina传输对象的示例

    在标题和描述中提到的“mina传输对象的示例”指的是如何在Mina框架下处理和传输自定义的数据对象。Mina允许开发者通过事件驱动和异步I/O模型来高效地构建网络服务。 Mina的核心组件包括: 1. **Session**: 表示...

    ApacheMINA传递对象实例[借鉴].pdf

    在Apache MINA中传递对象,主要依赖于Java的序列化机制。在这个例子中,`MyRequestObject`和`MyResponseObject`是两个简单的Java对象,它们都实现了`Serializable`接口。这使得这些对象能够被转换为字节流在网络中...

    mina框架--MINA框架是对java的NIO包的一个封装

    MINA框架通过封装NIO,提供了一种更加面向对象和易于使用的API,使得开发者可以更方便地创建高性能、可扩展的网络应用,如TCP和UDP服务器。 在上述代码中,可以看到如何使用MINA框架初始化一个服务器: 1. `...

    mina的高级使用,mina文件图片传送,mina发送文件,mina报文处理,mina发送xml和json

    Apache Mina是一个开源的网络通信应用框架,主要应用于Java平台,它为高性能、高可用性的网络应用程序提供了基础架构。在本文中,我们将深入探讨Mina的高级使用,特别是在文件图片传送、文件发送、XML和JSON报文处理...

    mina框架详解

    - **序列化服务**:除了基本的字节流传输外,Mina还支持Java对象的序列化服务,简化了复杂数据类型在网络间的传递。 - **虚拟机管道通信**:Mina还支持进程间通信,尤其是同一虚拟机内的管道通信,这对于构建分布式...

    mina中文开发手册.pdf

    - **序列化服务**:除了传统的字节流传输,Mina还支持Java对象的序列化服务,简化了复杂数据类型在网络间的传递。 - **虚拟机管道通信**:Mina还支持虚拟机内部的管道通信,这意味着可以在同一个JVM内部高效地进行...

    mina-http-2.0.7.jar.zip_mina_mina 获取POST_mina-http_mina-http-2.0

    MINA框架提供了一种事件驱动的非阻塞I/O模型,这种模型允许服务器处理大量的并发连接,同时保持较低的内存占用。它通过使用NIO(Non-blocking Input/Output)技术,使得服务器在等待数据到来时不会被阻塞,提高了...

    mina简单示例

    标题中的"mina简单示例"指的是使用Apache Mina框架构建一个简单的客户端和服务端的程序。在Java开发中,Mina提供了一种高效的方式来处理网络连接和数据传输,特别适合于构建大型、复杂的网络服务。 描述中的"mina...

    MINA 协议解码过滤器

    过滤器链的概念是MINA框架的核心特性之一,它允许开发者插入自定义的过滤器来处理进来的数据或者发送出去的数据。协议解码过滤器(ProtocolDecoderFilter)就是这样的一个过滤器,它的主要任务是从接收到的原始字节...

    mina文档说明书

    这个“mina文档说明书”包含了MINA框架的详细信息,帮助开发者理解和使用它。 MINA的核心概念包括: 1. **Session**:在MINA中,Session代表了网络连接,它是双向的通信通道。每个连接都会创建一个Session对象,...

    mina 多路分离解码

    mina框架是Apache软件基金会的一个开源项目,它为Java开发者提供了一套高效、功能丰富的网络通信库,主要用于构建高性能的网络应用服务器,如TCP和UDP服务。在mina框架中,“多路分离解码”(Multiplexing Decoding...

    SpringMina

    SpringMina 是一个将Apache Mina框架与Spring框架相结合的项目,主要用于构建高性能、异步的网络应用。SpringMina旨在简化Mina的配置和管理,利用Spring强大的依赖注入(DI)和面向切面编程(AOP)特性,使开发者能...

    Mina小Demo聊天工具

    4. 数据传输:Mina小Demo中的数据传输可能采用了序列化或JSON等格式,以便于在网络间传递对象和消息。 四、脱离Eclipse运行与最小化至托盘 Mina小Demo的可执行特性意味着开发者无需依赖Eclipse或其他IDE,只需将...

    基于Java的源码-高性能Java网络框架 MINA.zip

    - **IoSession**:这是MINA框架中的核心对象,代表了客户端与服务器之间的连接会话。它包含了与连接相关的所有信息,如输入/输出缓冲区、连接状态、事件和属性等。 - **IoHandler**:处理网络事件的接口,如连接...

    MINA TCP简单通信实例

    总结起来,这个“MINA TCP简单通信实例”涵盖了使用MINA框架搭建TCP通信的基本步骤,包括服务端Acceptor的配置、客户端Connector的使用、IoHandler的实现以及数据的发送与接收。同时,通过阅读源码,开发者可以...

    MINA源码与例子

    在"apache-mina-2.0.2"压缩包中,包含了MINA框架的源代码,包括核心库、示例应用、文档和测试代码。通过阅读源码,你可以深入了解MINA的设计思想和实现细节,例如如何实现非阻塞I/O、过滤器链的工作原理、以及如何...

    MinaClient

    总结来说,MinaClient是基于Apache Mina框架在Android平台上实现的网络通信客户端,它利用Mina的高效I/O处理能力,结合MPAndroidChart库进行数据可视化,可以用于创建复杂的网络应用。开发者需要理解Mina的核心组件...

    Mina Socket 源代码

    Mina Socket 是 Apache Mina 项目的一部分,它是一个高性能、可扩展的网络通信框架。Mina 提供了一种简单的方式来构建网络应用,如服务器和客户端,支持多种协议,如 TCP/IP 和 UDP。在这个简单示例中,我们将深入...

Global site tag (gtag.js) - Google Analytics