本站文章均爲 李華明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() ));
/*---------接收對象---------*/
//建立接收數據的過濾器
|