`
萧_瑟
  • 浏览: 156827 次
社区版块
存档分类
最新评论

Apache Mina 入门Demo

    博客分类:
  • java
阅读更多

 

什么是Mina,用Mina可以干什么?  

 

官网:http://mina.apache.org/

 

看不懂英文?那就随便百度,大概了解一下。

 

 

 

最终效果:



 

 

项目目录结构:


 

 

pom.xml

 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.royal</groupId>
  <artifactId>minaDemo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>minaDemo</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    
    <!-- mina需要用到的包 -->
    <dependency>
		<groupId>org.apache.mina</groupId>
		<artifactId>mina-core</artifactId>
		<version>2.0.4</version>
	</dependency>
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-nop</artifactId>
		<version>1.6.1</version>
	</dependency>
    
  </dependencies>
</project>
 

 

 

User.java

 

package com.royal.model;

import java.io.Serializable;

public class User implements Serializable {

	private static final long serialVersionUID = 1L;
	private String name;
	private int age;

	public User() {

	}

	public User(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

}
 

 

 

 

 

Mina服务端编写:

 

MinaServer.java

 

package com.royal.service;

import java.io.IOException;
import java.net.InetSocketAddress;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

/**
 * mina服务端
 * @author Royal
 *
 */
public class MinaServer {

	public static void main(String[] args) throws IOException {
		// 创建一个非阻塞的Server端 Socket,用NIO
		IoAcceptor acceptor = new NioSocketAcceptor();
		// 创建接收数据的过滤器
		DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
		// 设定这个过滤器将以对象为单位读取数
		ProtocolCodecFilter filter = new ProtocolCodecFilter(new ObjectSerializationCodecFactory());
		chain.addLast("objectFilter", filter);

		// 设定服务器端的消息处理器:一个ObjectMinaServerHandler对象,
		acceptor.setHandler(new ObjectMinaServerHandler());

		// 服务器端绑定的端口
		int bindPort = 9988;
		// 绑定端口,启动服务器
		acceptor.bind(new InetSocketAddress(bindPort));
		System.out.println("Mina Server is Listing on:= " + bindPort);
	}

}
 

 

 

ObjectMinaServerHandler.java

 

package com.royal.service;

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

import com.royal.model.User;

/**
 * 对象服务接受处理类
 * 
 * @author Royal
 * 
 */
public class ObjectMinaServerHandler extends IoHandlerAdapter {

	// 记录接受数据的次数
	private int count = 0;

	/**
	 * 当客户端 发送 的消息到达时
	 */
	@Override
	public void messageReceived(IoSession session, Object message) throws Exception {

		// 我们己设定了服务器解析消息的规则一个User对象为单位传输:
		User u = (User) message;
		System.out.println("这里是服务器(" + session.getLocalAddress() + ")\t收到客户机(" + session.getRemoteAddress() + ")发来的用户对象:" + u.toString() + "---------" + count);

		count++;
		if (count == 1000) {
			count = 0;
			// 服务器主动断开与客户端的连接
			session.close(true);
		}

		// 发送到客户端
		session.write(u);
	}

	/**
	 * 当一个客户端连接进入时
	 */
	@Override
	public void sessionOpened(IoSession session) throws Exception {
		System.out.println("incomming client: " + session.getRemoteAddress());
	}

	/**
	 * 当一个客户端关闭时
	 */
	@Override
	public void sessionClosed(IoSession session) throws Exception {
		System.out.println(session.getRemoteAddress() + " client Disconnect!");
	}

	/**
	 * 当捕获到异常的时候
	 */
	@Override
	public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
		System.err.println("error!!!!!!!!!!!!!");
		super.exceptionCaught(session, cause);
	}

}
 

 

 

Mina客户端测试编写:

 

MinaClient.java

 

package com.royal.client;

import java.net.InetSocketAddress;

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

/**
 * mina测试客户端
 * @author Royal
 *
 */
public class MinaClient {

	public static void main(String[] args) {

		// Create TCP/IP connector.
		IoConnector connector = new NioSocketConnector();
		// 创建接收数据的过滤器
		DefaultIoFilterChainBuilder chain = connector.getFilterChain();
		// 设定这个过滤器将以对象为单位读取数
		ProtocolCodecFilter filter = new ProtocolCodecFilter(new ObjectSerializationCodecFactory());
		chain.addLast("objectFilter", filter);
		// 设定客户端的消息处理器:一个ObjectMinaClientHandler对象,
		connector.setHandler(new ObjectMinaClientHandler());

		// 连结到服务器:
		ConnectFuture cf = connector.connect(new InetSocketAddress("localhost", 9988));
		// 等待连接创建完成
		cf.awaitUninterruptibly();
		// 等待连接断开
		cf.getSession().getCloseFuture().awaitUninterruptibly();

		// 客户端断开链接,释放资源
		connector.dispose();
	}

}
 

 

 

ObjectMinaClientHandler.java

 

package com.royal.client;

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

import com.royal.model.User;

/**
 * 对象客户端接受处理类
 * 
 * @author Royal
 * 
 */
public class ObjectMinaClientHandler extends IoHandlerAdapter {

	// 当一个服务端连结进入时
	@Override
	public void sessionOpened(IoSession session) throws Exception {
		System.out.println("connect server : " + session.getRemoteAddress());
		session.write(new User("mina", 18));
	}

	// 当一个服务端关闭时
	@Override
	public void sessionClosed(IoSession session) {
		System.out.println(session.getRemoteAddress() + " server Disconnect !");
	}

	// 当服务器发送的消息到达时:
	@Override
	public void messageReceived(IoSession session, Object message) throws Exception {
		User u = (User) message;
		System.out.println("这里是客户端(" + session.getLocalAddress() + ")\t服务器(" + session.getRemoteAddress() + ")发来的消息: " + u.getName() + "\t" + u.getAge());

		// 发送到服务端
		session.write(u);
	}

}
 

 

 

OK,就这样。

 

 

首先运行服务端MinaServer:


 

接着运行客户端MinaClient:


 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 54.9 KB
  • 大小: 38.4 KB
  • 大小: 21.6 KB
  • 大小: 9.3 KB
  • 大小: 11.4 KB
分享到:
评论
4 楼 sanzhixiong86 2013-11-21  
能问下我下的是2.7为什么不能正常运行
3 楼 redhacker 2013-08-28  
楼主教程写的不错,谢谢!
2 楼 f429800584 2013-02-23  
我还没有安装maven    不过非常感谢分享!
1 楼 aone 2013-01-30  
运行正常,第一次运行mina demo,感谢

相关推荐

    ApacheMina入门

    ApacheMina入门 ApacheMina入门 ApacheMina入门 ApacheMina入门 ApacheMina入门

    Apache mina2学习笔记DEMO

    这个是我学的apache mina2.0学习笔记的实例

    Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)

    Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)Apache Mina Server 2.0中文参考手册V1.0,Apache Mina2.0学习笔记(修订版)

    Apache Mina入门(完成版)

    这个网上一个牛人写的mina入门知识, 里面有基础介绍和项目开发步骤。 入门还是不错的,写的挺详细。 我把项目也加进来了。

    Apache Mina Demo.zip

    本工程用于研究Apache Mina技术 本工程编码方式:UTF-8 本工程开发工具:MyEclipse 本工程运行步骤: 1、运行StartMinaServer类 2、运行StartMinaClient类

    关于apache Mina Server

    深入理解Apache_Mina_(1)----_Mina的几个类 深入理解Apache_Mina_(2)----_与IoFilter相关的几个类 深入理解Apache_Mina_(3)----_与IoHandler相关的几个类 深入理解Apache_Mina_(4)----_IoFilter和IoHandler的区别和...

    apache Mina的完整学习资料

    apache mina的入门完整学习资料,附加中文参考手册。

    Apache mina框架入门教程

    该文档较好的介绍了,apache mina框架的使用方法。

    Apache MINA 线程模型配置

    Apache MINA 线程模型配置 Mina配置

    Apache Mina帮助文档

    收集整理的Apache Mina chm pdf教程和帮助文档

    Apache Mina核心jar包:mina-core-2.0.7

    Apache MINA是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络应用程序提供了非常便利的框架。 当前发行的 MINA 版本支持基于 Java NIO 技术的 TCP/UDP 应用程序开发、串口通讯程序(只在最新的预览版...

    Apache MINA开发相关jar包

    Apache MINA是一个网络应用程序框架,用来帮助用户简单地开发高性能和高可靠性的网络应用程序。 apache-mina-2.0.7-bin.zip,apache-mina-2.0.7-src.zip,log4j-1.2.17.zip,slf4j-api-1.6.6.jar,slf4j-api-1.6.6-...

    Apache Mina入门

    Apache Mina入门 Mina能干什么?先拉出来溜一下:我们用它做两个小程序,一个为服务器,收到客户机的消息 后,就回送给客户机;一个是简单的客户机,一连上服务器,就发一条消息报到,然后将从服务 器接到的消息再...

    apache mina 简单示例

    apache mina 简单示例apache mina 简单示例apache mina 简单示例apache mina 简单示例apache mina 简单示例apache mina 简单示例

    Apache MINA2实用手册

    Apache MINA2实用手册 Apache MINA2实用手册

    Apache_MINA_快速入门

    Apache_MINA_快速入门,开发中用到,自己想学的,可以看看。

    apache mina实例免费下载

    apache mina实例免费下载,有很多实例代码简单易懂欢迎大家下载!

Global site tag (gtag.js) - Google Analytics