`
zhhphappy
  • 浏览: 121383 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Apache MINA (2) Hello World!

 
阅读更多

了解完Apach MINA的一些基本概念Apache MINA (1) 简介 ,开始进入MINA相关的代码学习,以一个简单HelloWorld程序开始,完成客户端与服务端之间的通讯。

 

准备工作:
org.apache.mina 版本4.0
org.slf4j 1.6.1 (Simple Logging Facade for Java)mina所使用的日志框架,该版本是与mina4.0匹配的版本。
我是用maven管理项目依赖的,使用apache-maven-3.0.4
IDE:IntelliJ IDEA 10.0.3

 

开始HelloWorld:

1.maven的pom文件:

<?xml version="1.0" encoding="UTF-8"?>
<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>example</groupId>
    <artifactId>example</artifactId>
    <version>1.0</version>

    <properties>
        <project.build.sourceEncoding>GBK</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
          <groupId>org.apache.mina</groupId>
          <artifactId>mina-core</artifactId>
          <version>2.0.4</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>1.6.1</version>
        </dependency>

        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-nop</artifactId>
          <version>1.6.1</version>
        </dependency>

    </dependencies>  
    
</project>

 2. 服务器代码:

    a) 首先实现服务端的IoHandler代码SimpleMinaServerHandler。主要功能是打印客户端写入的信息,统计客户端的请求次数以及返回当前客户端是第几次访问。

package com.chiyan.apach.mina.server;

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

import java.util.concurrent.atomic.AtomicInteger;

/**
 * Created by IntelliJ IDEA.
 * 简单的消息处理器
 * User: chiyan
 * Date: 12-7-19
 * Time: 上午12:19
 */
public class SimpleMinaServerHandler extends IoHandlerAdapter {

	private AtomicInteger count = new AtomicInteger(0);

	/**
	 * 当一个客户端连接进入时
	 */
	@Override
	public void sessionOpened(IoSession session) throws Exception {

		System.out.println("client connection : " + session.getRemoteAddress());

	}

	/**
	 * 当一个客户端关闭时
	 */
	@Override
	public void sessionClosed(IoSession session) throws Exception {

		System.out.println("client disconnection : " +session.getRemoteAddress() + " is Disconnection");

	}

    /**
     * 当接收到客户端的信息
     *
     * @param session
     * @param message
     * @throws Exception
     */
	@Override
	public void messageReceived(IoSession session, Object message)
			throws Exception {

		String str = (String)message;

        // 打印客户端
		System.out.println("receive client message : [ " + str +" ]");

		// 回写消息给客户端
		session.write(count.incrementAndGet());

	}

}

 b) 搭建服务端 MainServer:

package com.chiyan.apach.mina.server;

import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.SocketSessionConfig;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;

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

/**
 * Created by IntelliJ IDEA.
 * User: chiyan
 * Date: 12-7-19
 * Time: 上午12:27
 */
public class MainServer {

    // 服务器端口
    private static final int SERVER_PORT = 8899;

    public static void main(String[] args) throws Exception {

        //创建一个非阻塞的Server端Socket,用NIO
        SocketAcceptor acceptor = new NioSocketAcceptor();

        // 定义每次接收数据大小
        SocketSessionConfig sessionConfig = acceptor.getSessionConfig();
        sessionConfig.setReadBufferSize(2048);

        //创建接受数据的过滤器
        DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();

        //设定这个过滤器将一行一行(/r/n)的读取数据
        chain.addLast("myChain", new ProtocolCodecFilter(new TextLineCodecFactory()));

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

        //绑定端口,启动服务器
        try {
            acceptor.bind(new InetSocketAddress(SERVER_PORT));
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("Mina server is listing port:" + SERVER_PORT);

    }

}

 3. 客户端代码

a)首先实现客户端的IoHandler代码SimpleMinaClientHandler。主要功能是向服务端写消息,接收到服务端计数后再回写服务端。

package com.chiyan.apach.mina.client;

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

/**
 * Created by IntelliJ IDEA.
 * User: chiyan
 * Date: 12-7-19
 * Time: 上午12:31
 */
public class SimpleMinaClientHandler extends IoHandlerAdapter {

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

        Integer num = Integer.valueOf((String)message);

        if(num == null || num >10){
            session.close(true);
            return;
        }

		System.out.println("receive server num : [ " + num + " ]");

        Thread.sleep(1000);

		session.write("client received num is : " + num + ", request next num");

	}

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

	/**
	 * 当一个客户端连接进入时
	 */
	@Override
	public void sessionOpened(IoSession session) throws Exception {

		System.out.println("create connection to server :" + session.getRemoteAddress());
		session.write("client started");
		session.write("Hello World!");
	}

}

 b)搭建客户端MainClient

package com.chiyan.apach.mina.client;

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.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.nio.NioSocketConnector;

import java.net.InetSocketAddress;

/**
 * Created by IntelliJ IDEA.
 * User: chiyan
 * Date: 12-7-19
 * Time: 上午12:40
 */
public class MainClient {

    /**
     * 服务器ip
     */
    private static final String SERVER_IP="127.0.0.1";

    /**
     * 服务器端口
     */
    private static final int SERVER_PORT=8899;

    public static void main(String []args){

		//Create TCP/IP connection
		NioSocketConnector connector = new NioSocketConnector();

		//创建接受数据的过滤器
		DefaultIoFilterChainBuilder chain = connector.getFilterChain();

		//设定这个过滤器将一行一行(/r/n)的读取数据
		chain.addLast("myChain", new ProtocolCodecFilter(new TextLineCodecFactory()));

		//服务器的消息处理器:一个 SimpleMinaClientHandler 对象
		connector.setHandler(new SimpleMinaClientHandler());

		//set connect timeout
		connector.setConnectTimeoutMillis(30 * 1000);

		//连接到服务器:
		ConnectFuture cf = connector.connect(new InetSocketAddress(SERVER_IP,SERVER_PORT));

		cf.awaitUninterruptibly();

		cf.getSession().getCloseFuture().awaitUninterruptibly();
		
		connector.dispose();
	}
}

 运行程序:

1.服务端打印:

Mina server is listing port:8899
client connection : /127.0.0.1:50497
receive client message : [ client started ]
receive client message : [ Hello World! ]
receive client message : [ client received num is : 1, request next num ]
receive client message : [ client received num is : 2, request next num ]
receive client message : [ client received num is : 3, request next num ]
receive client message : [ client received num is : 4, request next num ]
receive client message : [ client received num is : 5, request next num ]
receive client message : [ client received num is : 6, request next num ]
receive client message : [ client received num is : 7, request next num ]
receive client message : [ client received num is : 8, request next num ]
receive client message : [ client received num is : 9, request next num ]
receive client message : [ client received num is : 10, request next num ]
client disconnection : /127.0.0.1:50497 is Disconnection

 2.客户端打印:

create connection to server :/127.0.0.1:8899
receive server num : [ 1 ]
receive server num : [ 2 ]
receive server num : [ 3 ]
receive server num : [ 4 ]
receive server num : [ 5 ]
receive server num : [ 6 ]
receive server num : [ 7 ]
receive server num : [ 8 ]
receive server num : [ 9 ]
receive server num : [ 10 ]
client disconnect

 

小结:

通过一个Hello World完成了基于mina编写的客户端和服务端通信的例子,接下通过解析源代码的方式来了解mina客户端和服务端通讯的过程。Apache MINA (3) NioSocketAcceptor初始化 

 

代码在附件中

分享到:
评论
1 楼 白天看黑夜 2017-10-20  
Apache Mina Server 2.0 中文参考手册(带目录),有需要的自己下载吧
http://www.itmayun.com/it/files/226631678709806/resource/484719910403706/1.html

相关推荐

    Mina入门:mina版之HelloWorld

    **Mina入门:Mina版之HelloWorld** Apache Mina是一个开源项目,它提供了一个高度模块化、高性能的网络通信框架。Mina旨在简化网络应用的开发,支持多种传输协议,如TCP、UDP、HTTP、FTP等。在这个“Mina入门:Mina...

    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 MINA2实用手册

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

    apache-mina-2.0.4.rar_apache mina_mina

    Apache Mina是一个高性能、异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。这个"apache-mina-2.0.4.rar"压缩包包含的是Apache Mina 2.0.4版本的源代码,是深入理解和定制Mina的...

    Apache mina2学习笔记DEMO

    在这个"Apache MINA2学习笔记DEMO"中,我们很可能会看到如何使用MINA来创建一个自定义协议的示例。自定义协议通常是为了满足特定应用的需求,例如高效的数据传输、安全性或者特定的编码格式。MINA允许开发者定义自己...

    关于apache Mina Server

    深入理解Apache_Mina_(2)----_与IoFilter相关的几个类 深入理解Apache_Mina_(3)----_与IoHandler相关的几个类 深入理解Apache_Mina_(4)----_IoFilter和IoHandler的区别和联系 深入理解Apache_Mina_(5)----_配置Mina...

    Apache Mina2服务器和客户端简单实例

    Apache Mina2是一个高度可扩展且高性能的网络通信框架,主要设计用于简化开发网络应用,如TCP/IP和UDP协议的服务端和客户端。它提供了一种事件驱动、非阻塞I/O模型,使得开发者能够更专注于业务逻辑,而不是底层的...

    apache Mina的完整学习资料

    Apache Mina是一个开源框架,主要用于构建高性能、高可用性的网络应用程序。这个压缩包包含了全面的学习资料,适合初学者深入理解Mina的原理和使用方法。其中,中文参考手册的加入使得学习过程更加友好,便于非英语...

    Apache Mina帮助文档

    Apache Mina是一个高度可扩展的网络通信框架,主要用于构建高性能、高效率的服务端应用程序。它提供了事件驱动、异步I/O处理模型,使得开发者能够更专注于业务逻辑,而不是底层网络编程的复杂性。Mina主要应用于Java...

    Apache Mina 入门Demo

    Apache Mina是一个开源项目,主要用于构建高性能、高可用性的网络通信应用。它是Java语言开发的,提供了一套简单而强大的API,使得开发者可以方便地创建网络服务器和客户端应用程序。Mina的目标是简化网络编程,使其...

    apache mina实例免费下载

    Apache MINA(Multipurpose Infrastructure for Network Applications)是一个开源框架,主要设计用于简化网络应用程序的开发,尤其是基于TCP和UDP协议的应用。它提供了高度可扩展和高性能的非阻塞I/O模型,使得...

    apache mina 学习笔记三(子项目FtpServer)

    Apache MINA(Multipurpose Infrastructure for Network Applications)是一个Java框架,用于构建高性能、高可用性的网络应用程序。MINA 提供了一种简单而强大的API,开发者可以使用它来处理TCP/IP和UDP/IP协议,如...

    Apache MINA框架相关资料

    Apache MINA(Multipurpose Infrastructure for Network Applications)是一个高性能、异步事件驱动的网络应用程序框架,主要用于简化开发高质量的网络服务。这个框架适用于多种协议,如TCP/IP和UDP/IP,以及NIO(非...

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

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

    Apache MINA 2.0 用户指南( 缺第一章节)

    ### Apache MINA 2.0 用户指南:基础知识 #### 基础概念介绍 Apache MINA 2.0 是一款高性能且易于使用的网络应用程序框架,它简化了开发人员在网络编程方面的负担,允许开发者专注于应用程序的核心功能,而不是底层...

    Apache-Mina-2.rar_apache mina_java mina_mina_mina-core-1.1.3

    标题中的"Apache-Mina-2.rar"和"mina-mina-core-1.1.3"表明这是关于Apache Mina 2.x版本,特别是其核心模块的1.1.3版本。 Apache Mina的名称来源于"Multi-purpose Infrastructure for Network Applications",它...

    一个Apache MINA使用案例源代码ApacheMina

    Apache MINA是一个高性能、异步事件驱动的网络应用程序框架,主要设计用于简化开发服务器端的高性能网络应用。这个框架提供了一种抽象层,允许开发者使用相同的API处理多种不同的传输协议,如TCP/IP、UDP/IP以及SSL/...

Global site tag (gtag.js) - Google Analytics