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

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,感谢

相关推荐

    mina框架的demo 入门,开发

    本教程将深入探讨Mina框架的入门与开发,帮助你快速掌握这个框架的关键概念和技术。 首先,理解Mina的核心概念至关重要。Mina提供了一个事件驱动、异步通信模型,使得开发者可以更高效地处理网络I/O操作。它抽象出...

    mina入门实例

    这就是一个基础的Mina入门实例,展示了如何使用Mina进行客户端-服务器间的通信。随着深入学习,你可以了解更多的Mina特性,如心跳机制、多线程处理、会话管理等,以构建更复杂、高效的网络应用。

    初学调用webservice的demo,适合初学者入门,资源包括axis2的库文件,以及org.apache.mina等库文件

    `org.apache.mina`是Apache的另一个项目,提供了一个高性能、异步的网络通信框架,常用于构建网络服务器,例如TCP/IP和UDP通信,这对于处理Web服务请求和响应来说是非常关键的。 【标签】中的"axis2"、"webservice...

    Apache_Mina2.0学习笔记

    Mina入门 2 第一步.下载使用的Jar包 2 第二步.工程创建配置 2 第三步.服务端程序 3 第四步.客户端程序 6 第五步.长连接VS短连接 8 二. Mina基础 9 1.IoService接口 10 2.1.1 类结构 11 2.1.2 应用 12 2.IoFilter...

    Mina2.0入门

    **Mina2.0入门** Apache Mina是一个高度可扩展且功能强大的网络通信框架,它为Java应用程序提供了简单而统一的API来处理TCP/IP、UDP和SSL/TLS协议。Mina2.0作为其最新版本,引入了许多改进和优化,旨在提高性能、...

    服务端基于MINA2的UDP双向通信Demo演示(MINA2服务端)

    描述提到,这个源码是配合某篇技术文章《NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示》的实现部分,文章链接为http://www.52im.net/thread-373-1-1.html。通常,这样的源码示例会包含完整的服务器端代码...

    服务端基于MINA2的UDP双向通信Demo演示(Java客户端)

    标题中的“服务端基于MINA2的UDP双向通信Demo演示(Java客户端)”是指使用Apache MINA框架在Java中实现的UDP(用户数据报协议)的双向通信示例。MINA是一个高性能、异步的网络应用程序框架,常用于构建网络服务,如...

    Mina2.0完全剖析,完全自学手册

    #### Mina入门详解 本节将详细介绍如何从零开始构建一个简单的Mina应用程序,涵盖从下载所需JAR包到编写服务端和客户端程序的全过程。 ##### 第一步. 下载使用的Jar包 为了开始Mina的应用开发,首先需要下载以下...

    mina2.0初学教程

    #### Mina 入门实践 **第一步:下载并配置 Jar 包** - **mina-core-2.0.0-M1.jar**:从 Apache Mina 官方网站下载最新版本的 Mina 核心库。 - **slf4j-api-1.5.2.jar** 及 **slf4j-log4j12-1.5.2.jar**:用于日志...

    mina学习文档

    #### 三、Mina入门示例 ##### 第一步:下载并配置Jar包 1. **Mina核心库**:从Mina官网下载最新版本的mina-2.0.1.zip,包含必要的核心组件。 2. **日志库**:下载slf4j1.5.2.zip,解压后得到slf4j-api-1.5.2.jar与...

Global site tag (gtag.js) - Google Analytics