本站文章均为 李华明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
|