【Apache Mina2.0开发之一】搭建Apache Mina框架并实现Server与Client端的简单消息传递!

2020年06月06日 阅读数:103
这篇文章主要向大家介绍【Apache Mina2.0开发之一】搭建Apache Mina框架并实现Server与Client端的简单消息传递!,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。


本站文章均为 李华明Himi 原创,转载务必在明显处注明:
转载自【黑米GameDev街区】 原文连接: http://www.himigame.com/apache-mina/831.html

          ☞ 点击订阅 ☜
 本博客最新动态!及时将最新博文通知您!html

Hibernate系列学习阶段到此结束了,那么紧接着进入Apache Mina的开发学习,不少童鞋在微薄和QQ中疑问Himi为何忽然脱离游戏开发了,嘿嘿,其实可能更多的童鞋已经看出来了,Himi在偏向服务器Server端开发了,Hibernate、MySQL等都是为了Server端Mina开发而作的铺垫,当前的Apache Mina才是Himi真正的目的。哈哈。Himi的技术目标是“一我的能作出一个网游~”,OK.很少说其余的了,开始Himi的Apache mina开发之旅吧。java

对于Apache Mina不太链接的童鞋,请移步到以下百度百科链接进行学习了解:web

http://baike.baidu.com/view/2668084.htm apache

首先创建一个new project(Server端),这里Himi使用IDE是 eclipse;api

OK,首先咱们这里先配置下环境:对于Mina的日志输出使用的是slf4j,对于slf4j在开发Hibernate的时候已经很熟悉了,不须要再介绍了。另一方面就是加入mina的core核心jar包;服务器

1. mina-core.jar         2. slf4j-api.jar         3.slf4j-simple.jarsession

而后咱们首先建立两个类:架构

HimiObject.java框架

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**
  * @author Himi
  */
 
import java.io.Serializable;
 
public class HimiObject implements Serializable{
 
     public HimiObject( int id,String name){
         this .id=id;
         this .name=name;
     }
 
     private int id;
 
     private String name;
 
     public int getId() {
         return id;
     }
     public void setId( int id) {
         this .id = id;
     }
     public String getName() {
         return name;
     }
     public void setName(String name) {
         this .name = name;
     }
 
}

这个类是个消息Object,它用于server与client端的交互的数据,它须要序列化,因此咱们使用Serializable接口;至于在mina框架中起到什么做用这个后续来讲;eclipse

 

ClientMinaServerHanlder.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/**
  * @author Himi
  */
 
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
 
public class ClientMinaServerHanlder extends IoHandlerAdapter {
 
     private int count = 0 ;
 
     // 当一个新客户端链接后触发此方法.
     public void sessionCreated(IoSession session) {
         System.out.println( "新客户端链接" );
     }
 
     // 当一个客端端连结进入时 @Override
     public void sessionOpened(IoSession session) throws Exception {
         count++;
         System.out.println( "第 " + count + " 个 client 登录!address: : "
                 + session.getRemoteAddress());
 
     }
 
     // 当客户端发送的消息到达时:
     @Override
     public void messageReceived(IoSession session, Object message)
             throws Exception {
         // // 咱们己设定了服务器解析消息的规则是一行一行读取,这里就可转为String:
         // String s = (String) message;
         // // Write the received data back to remote peer
         // System.out.println("收到客户机发来的消息: " + s);
         // // 测试将消息回送给客户端 session.write(s+count); count++;
 
         HimiObject ho = (HimiObject) message;
         System.out.println(ho.getName());
 
         ho.setName( "serverHimi" );
         session.write(ho);
 
     }
 
     // 当信息已经传送给客户端后触发此方法.
     @Override
     public void messageSent(IoSession session, Object message) {
         System.out.println( "信息已经传送给客户端" );
 
     }
 
     // 当一个客户端关闭时
     @Override
     public void sessionClosed(IoSession session) {
         System.out.println( "one Clinet Disconnect !" );
     }
 
     // 当链接空闲时触发此方法.
     @Override
     public void sessionIdle(IoSession session, IdleStatus status) {
         System.out.println( "链接空闲" );
     }
 
     // 当接口中其余方法抛出异常未被捕获时触发此方法
     @Override
     public void exceptionCaught(IoSession session, Throwable cause) {
         System.out.println( "其余方法抛出异常" );
     }
 
}

本类主要是继承IoHandlerAdapter而且重写其类的一些函数,至于每一个函数的做用Himi都已经在代码中加以注视;本类的做用:

此类是用以处理消息的也可说是个消息处理器,当客户端有消息传给server端的时候,或者server端传递给Client端的时候(Client端也会有个消息处理器)都会经过消息处理器进行处理。

OK,下面咱们来书写server端的main函数类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/**
  * @author Himi
  */
 
import java.io.IOException;
import java.net.InetSocketAddress;
 
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.serialization.ObjectSerializationCodecFactory;
import org.apache.mina.transport.socket.SocketAcceptor;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
 
public class MinaServer {
 
     /**
      * @param args
      */
 
     public static void main(String[] args) {
         //建立一个非阻塞的server端Socket ,用NIO
         SocketAcceptor acceptor = new NioSocketAcceptor();
 
         /*---------接收字符串---------*/
//      //建立一个接收数据过滤器
//      DefaultIoFilterChainBuilder chain = acceptor.getFilterChain();
//      //设定过滤器一行行(/r/n)的读取数据
//      chain.addLast("mychin", new ProtocolCodecFilter(new TextLineCodecFactory()   ));
         /*---------接收对象---------*/
         //建立接收数据的过滤器