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


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

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

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

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

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

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

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

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

然后我们首先创建两个类:

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框架中起到什么作用这个后续来说;

 

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
        

你可能感兴趣的:(apache,框架,server,String,服务器,Mina)