`
mina_java
  • 浏览: 70926 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Mina入门:mina版之HelloWorld

阅读更多

一,前言:

在完成上篇文章《Mina入门:Java NIO框架Mina、Netty、Grizzly简介与对比》之后,我们现在可以正式切入Mina入门学习了。

 

二,搭建项目结构与解决项目依赖

本人使用Maven来管理项目的依赖。好了,废话也不多说,直接上pom.xml。这里主要是加入mina-core以及其依赖的SLF4J。

<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.androidwhy</groupId>
	<artifactId>mina-helloworld</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>mina-helloworld</name>
	<url>http://www.androidwhy.com</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</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>

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
</project>

 这里需要注意一点的就是Mina与SLF4J版本的匹配,官方也有文档提到了,注意一下就是。

 

三,编写服务器

我们的mina版的HelloWorld的业务逻辑很简单,就是接收客户端的请求,并回应给客户端一个字符"Hello,I am Server!"就可以了。

MinaTimeServer的主代码如下。

package com.androidwhy.mina.helloworld.server;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;

import org.apache.mina.core.service.IoAcceptor;
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.filter.logging.LoggingFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;


public class MinaTimeServer {

	private static final int PORT = 8888;

    public static void main(String[] args) throws IOException {
        // Create the acceptor
        IoAcceptor acceptor = new NioSocketAcceptor();
        
        // Add two filters : a logger and a codec
        acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );
        acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));
   
        // Attach the business logic to the server
        acceptor.setHandler( new HelloWorldServerHandler() );

        // Configurate the buffer size and the iddle time
        acceptor.getSessionConfig().setReadBufferSize( 2048 );
        acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );
        
        // And bind !
        acceptor.bind( new InetSocketAddress(PORT) );
    }
}

 

Handler代码如下:

package com.androidwhy.mina.helloworld.server;

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

public class HelloWorldServerHandler extends IoHandlerAdapter
{
    /**
     * Trap exceptions.
     */
    @Override
    public void exceptionCaught( IoSession session, Throwable cause ) throws Exception
    {
        cause.printStackTrace();
    }

    /**
     * If the message is 'quit', we exit by closing the session. Otherwise,
     * we return the message.
     */
    @Override
    public void messageReceived( IoSession session, Object message ) throws Exception
    {
        String str = message.toString();
        
        if( str.trim().equalsIgnoreCase("quit") ) {
            // "Quit" ? let's get out ...
            session.close(true);
            return;
        }
        
        System.out.println("Received message:"+str);

        // Send the "Hello, I am Server!" back to the client
        String helloWorld = "Hello, I am Server!";
        session.write(helloWorld);
        System.out.println("Message written...");
    }

    /**
     * On idle, we just write a message on the console
     */
    @Override
    public void sessionIdle( IoSession session, IdleStatus status ) throws Exception
    {
        System.out.println( "IDLE " + session.getIdleCount( status ));
    }
}

  你会发现,使用Mina写一个Server就是如此之简单!上面的MinaTimeServer主是建立一个监听在8888端口(建议使用大于1024的端口号,因为1024以下的是系统保留的)服务,并设置了一个日志filter与一个编码的filter;HelloWorldServerHandler对handler的各位状态进行了处理,在这里最为主要的就是override了messageReceived方法,并在其中处理我们的业务逻辑。

 

四,运行程序

到目前为止,我们只是写了一个Server,那程序怎么跑呢?客户端就暂时采用Telnet吧!

 

五,总结

我只想说一句:任何开源框架的入门都是如此的Easy,Mina也一样。

 

9
3
分享到:
评论
8 楼 Small嗳TT 2013-02-28  
大师,我来啦^_^~~~
7 楼 mina_java 2011-07-06  
suhuanzheng7784877 写道
哥们~回头这个系列做成javaeye电子书吧,收藏。。

嘿嘿,到时看情况,会尽量满足朋友们的。
6 楼 suhuanzheng7784877 2011-07-06  
哥们~回头这个系列做成javaeye电子书吧,收藏。。
5 楼 mina_java 2011-07-06  
下载代码后,机器没有安装Maven环境的朋友自己配置一下,很Easy
4 楼 mina_java 2011-07-06  
裴小星 写道
还是用 BBCode 编辑吧,否则样式很难控制。

OK,以后使用BBCode编辑器!
3 楼 裴小星 2011-07-06  
还是用 BBCode 编辑吧,否则样式很难控制。
2 楼 mina_java 2011-07-06  
mina_java 写道
第一次发表有代码的文章,代码位置放得不好,请朋友们多多谅解!

代码第一行都没有进到框框里,为什么啊?知道的朋友解答一下
1 楼 mina_java 2011-07-06  
第一次发表有代码的文章,代码位置放得不好,请朋友们多多谅解!

相关推荐

    Apache MINA (2) Hello World!

    这个“Apache MINA (2) Hello World!”示例旨在帮助初学者理解MINA的基本用法。 MINA的核心概念是基于NIO(非阻塞I/O)的事件驱动模型,它允许应用程序在处理多个连接时保持高效率。在MINA中,我们创建一个服务端来...

    Java视频教程 Java游戏服务器端开发 Netty NIO AIO Mina视频教程

    02、Mina客户端helloWorld入门.flv 03、Mina整体体系结构分析.flv 04、Mina学习之长短连接.flv 05、Mina学习之MinaIOService接口.flv 06、Mina学习之MinaIOFilter接口.flv 07、Mina学习之MinaIOSession接口.flv...

    【helloworld】-微信小程序教程-入门篇【3】

    案例分析:helloworld小程序。 备注:有编程经验或看过微信官网简易教程的同学,请酌情略过该章节。 2. 目录结构概述 (此图片来源于网络,如有侵权,请联系删除! )  (此图片来源于网络,如有侵权,请联系删除! )  ...

    【helloworld】-微信小程序教程-入门篇【2】

    案例分析:对于helloworld小程序的进行讲解。 备注:有编程经验或看过微信官网简易教程的同学,请酌情略过该章节。 2. 框架概述 业务逻辑部分 MINA(MINA IS NOT APP)是在微信中开发小程序的框架。 框架结构 MINA框架...

    【helloworld】-微信小程序教程-入门篇【4】

    案例分析:helloworld小程序。 备注:有编程经验或看过微信官网简易教程的同学,请酌情略过该章节。 2. MINA结构基础 从某种程度来来讲,我们可以把MINA的结构简化如下图: (此图片来源于网络,如有侵权,请联系删除...

    【helloworld】-微信小程序教程-入门篇【6】

    案例分析:helloworld小程序。 2. 知识点 精通 -&gt;基于项目的相关操作:创建/导入项目,删除,关闭,编辑,调试,编译。  -&gt;上传(由于没有邀请码,所以无法测试该功能。)  -&gt; 调试部分:编译,后台,缓存。  -&gt; ...

    Java Netty-入门教程.pdf

    ### Java Netty 入门教程知识点详解 #### 1. Netty 概览 ##### 1.1 Netty 是什么? Netty 是一款基于 Java 的高性能网络应用框架,支持多种协议,包括但不限于 HTTP、FTP、SMTP 等,并且特别擅长处理 TCP 和 UDP ...

    dubbo源码解析2

    一个典型的Dubbo HelloWorld例子通常包括服务提供者和服务消费者两个部分,通过简单的示例程序演示了如何注册服务、发布服务和调用服务。 #### 五、源文件概述 Dubbo的源代码主要由以下几个部分组成: 1. **core*...

    Ruby的安装与运行

    puts "Hello World!" def hello(name) puts "Hello #{name}" end hello('Mac') ``` - 运行命令:`ruby hello.rb`。 #### Ruby的文档系统 文档是学习任何编程语言的重要资源,Ruby也不例外。 1. **RDoc**:...

    JAVA上百实例源码以及开源项目源代码

    Java访问权限控制源代码 1个目标文件 摘要:Java源码,文件操作,权限控制 Java访问权限控制,为Java操作文件、写入文件分配合适的权限,定义写到文件的信息、定义文件,输出到c:/hello.txt、写信息到文件、关闭输出流...

Global site tag (gtag.js) - Google Analytics