【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()   ));
         /*---------接收對象---------*/
         //建立接收數據的過濾器
相關文章
相關標籤/搜索