一,前言:

在完成上篇文章《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"

  1. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  2. <modelVersion>4.0.0</modelVersion>
  3. <groupId>com.androidwhy</groupId>
  4. <artifactId>mina-helloworld</artifactId>
  5. <version>0.0.1-SNAPSHOT</version>
  6. <packaging>jar</packaging>
  7. <name>mina-helloworld</name>
  8. <url>http://www.androidwhy.com</url>
  9. <properties>
  10. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  11. </properties>
  12. <dependencies>
  13. <dependency>
  14. <groupId>org.apache.mina</groupId>
  15. <artifactId>mina-core</artifactId>
  16. <version>2.0.4</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.slf4j</groupId>
  20. <artifactId>jcl-over-slf4j</artifactId>
  21. <version>1.6.1</version>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.slf4j</groupId>
  25. <artifactId>slf4j-nop</artifactId>
  26. <version>1.6.1</version>
  27. </dependency>
  28. <dependency>
  29. <groupId>junit</groupId>
  30. <artifactId>junit</artifactId>
  31. <version>3.8.1</version>
  32. <scope>test</scope>
  33. </dependency>
  34. </dependencies>
  35. </project>

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

三,编写服务器

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

MinaTimeServer的主代码如下。

package com.androidwhy.mina.helloworld.server;

  1. import java.io.IOException;
  2. import java.net.InetSocketAddress;
  3. import java.nio.charset.Charset;
  4. import org.apache.mina.core.service.IoAcceptor;
  5. import org.apache.mina.core.session.IdleStatus;
  6. import org.apache.mina.filter.codec.ProtocolCodecFilter;
  7. import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
  8. import org.apache.mina.filter.logging.LoggingFilter;
  9. import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
  10. public class MinaTimeServer {
  11. <span style="white-space: pre;">    </span>private static final int PORT = 8888;
  12. public static void main(String[] args) throws IOException {
  13. // Create the acceptor
  14. IoAcceptor acceptor = new NioSocketAcceptor();
  15. // Add two filters : a logger and a codec
  16. acceptor.getFilterChain().addLast( "logger", new LoggingFilter() );
  17. acceptor.getFilterChain().addLast( "codec", new ProtocolCodecFilter( new TextLineCodecFactory( Charset.forName( "UTF-8" ))));
  18. // Attach the business logic to the server
  19. acceptor.setHandler( new HelloWorldServerHandler() );
  20. // Configurate the buffer size and the iddle time
  21. acceptor.getSessionConfig().setReadBufferSize( 2048 );
  22. acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, 10 );
  23. // And bind !
  24. acceptor.bind( new InetSocketAddress(PORT) );
  25. }
  26. }

Handler代码如下:

package com.androidwhy.mina.helloworld.server;

  1. import org.apache.mina.core.service.IoHandlerAdapter;
  2. import org.apache.mina.core.session.IdleStatus;
  3. import org.apache.mina.core.session.IoSession;
  4. public class HelloWorldServerHandler extends IoHandlerAdapter
  5. {
  6. /**
  7. * Trap exceptions.
  8. */
  9. @Override
  10. public void exceptionCaught( IoSession session, Throwable cause ) throws Exception
  11. {
  12. cause.printStackTrace();
  13. }
  14. /**
  15. * If the message is 'quit', we exit by closing the session. Otherwise,
  16. * we return the message.
  17. */
  18. @Override
  19. public void messageReceived( IoSession session, Object message ) throws Exception
  20. {
  21. String str = message.toString();
  22. if( str.trim().equalsIgnoreCase("quit") ) {
  23. // "Quit" ? let's get out ...
  24. session.close(true);
  25. return;
  26. }
  27. System.out.println("Received message:"+str);
  28. // Send the "Hello, I am Server!" back to the client
  29. String helloWorld = "Hello, I am Server!";
  30. session.write(helloWorld);
  31. System.out.println("Message written...");
  32. }
  33. /**
  34. * On idle, we just write a message on the console
  35. */
  36. @Override
  37. public void sessionIdle( IoSession session, IdleStatus status ) throws Exception
  38. {
  39. System.out.println( "IDLE " + session.getIdleCount( status ));
  40. }
  41. }

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

四,运行程序

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

五,总结

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

Mina入门:mina版之HelloWorld的更多相关文章

  1. Mina入门:mina版之HelloWorld[z]

    Mina入门:mina版之HelloWorld [z] 一,前言: 在完成上篇文章<Mina入门:Java NIO框架Mina.Netty.Grizzly简介与对比>之后,我们现在可以正式 ...

  2. Apache Mina入门

    Mina第一次听到这个名称的时候,我以为是个MM的名字米娜,后来才知道… Apache MINA(Multipurpose Infrastructure for Network Application ...

  3. JAVA通信系列二:mina入门总结

    一.学习资料 Mina入门实例(一) http://www.cnblogs.com/juepei/p/3939119.html Mina入门教程(二)----Spring4 集成Mina http:/ ...

  4. Apache Mina入门实例

    一.mina是啥 ApacheMINA是一个网络应用程序框架,用来帮助用户简单地开发高性能和高可扩展性的网络应用程序.它提供了一个通过Java NIO在不同的传输例如TCP/IP和UDP/IP上抽象的 ...

  5. SpringMVC基础入门,创建一个HelloWorld程序

    ref:http://www.admin10000.com/document/6436.html 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要 ...

  6. Spring Boot 2.x 快速入门(下)HelloWorld示例详解

    上篇 Spring Boot 2.x 快速入门(上)HelloWorld示例 进行了Sprint Boot的快速入门,以实际的示例代码来练手,总比光看书要强很多嘛,最好的就是边看.边写.边记.边展示. ...

  7. ActiveMQ Pub/Sub版的HelloWorld

    1. pom.xml 这个和上一篇是一样的: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&qu ...

  8. ActiveMQ P2P版的HelloWorld

    1.2 JMS应用程序接口 ConnectionFactory: 用户用来创建到JMS提供者的连接的被管对象.JMS客户通过可移植的接口访问连接,这样当下层的实现改变时,代码不需要进行修改. 管理员 ...

  9. Mina入门实例(一)

    mina现在用的很多了,之前也有用到,但是毕竟不熟悉,于是查了一些资料,做了一些总结.看代码是最直观的,比什么长篇大论都要好.不过其中重要的理论,也要理解下. 首先是环境,程序运行需要几个包,这里用m ...

随机推荐

  1. Linux中Samba详细安装

    为了实现Windows主机与Linux服务器之间的资源共享,Linux操作系统提供了Samba服务,Samba服务为两种不同的操作系统架起了一座桥梁,使Linux系统和Windows系统之间能够实现互 ...

  2. Linux进程间通信——使用命名管道

    在前一篇文章——Linux进程间通信——使用匿名管道中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关的的进程 ...

  3. 简单Demo的用户登录JSP界面IE、Firefox(chrome) Enter 键提交表单

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  4. PHP实现好友生日邮件提醒

    我有一个想法是这样的,希望每天知道今天是我哪位好友的生日? 当然,我得首先保存我所有好友的生日信息 实现:在新浪申请免费服务器,并申请Mysql应用,然后建一张表保存好友的信息 我想,我已经完成第一步 ...

  5. spring 定时任务(3)--配置多个定时任务

    <!-- 定义调用对象和调用对象的方法 --> <!-- 定时任务 A start --> <bean id="jobtask" class=&quo ...

  6. HBase 2、HBase安装与初试牛刀

    官方帮助文档:http://hbase.apache.org/book.html  PDF:http://hbase.apache.org/apache_hbase_reference_guide.p ...

  7. #include <stack>

    1 pop(); 出栈 2 push(); 入栈 3 size(); 返回栈中元素个数 4 top(); 返回栈顶元素 使用栈,把十进制转换为二进制 #include <iostream> ...

  8. 全国计算机等级考试二级教程-C语言程序设计_第3章_顺序结构

    1输入两个整数给变量x和y:然后输出x和y:在交换x和y中的值后,在输出x和y. #include <stdio.h> main() { int x, y, t; printf(" ...

  9. C# 中的委托和事件[转自张子扬]

    文中代码在VS2005下通过,由于VS2003(.Net Framework 1.1)不支持隐式的委托变量,所以如果在一个接受委托类型的位置直接赋予方法名,在VS2003下会报错,解决办法是显式的创建 ...

  10. 聚类算法初探(五)DBSCAN

    最近由于工作需要,对聚类算法做了一些相关的调研.现将搜集到的资料和自己对算法的一些理解整理如下,供大家参考. 另外在算法代码方面,我也做了一些实现(包括串行和并行),欢迎感兴趣的朋友探讨和交流. 第一 ...