前段时间学习了mina框架的使用。它是基于Socket进行通信,所以说在项目中要是需要长连接的使用,那mina框架是一个不错的选择。
下面简单介绍一下mina框架的使用,学习mina框架不长时间,现在写下来即时为了记录一下自己的学习经历,又希望可以帮助其他初学者朋友,若有不足与错误之处,还请大神指教。
在使用mina框架之前需要下载所需的jar包。可以在我的网盘中下载,Android端也可以用的。地址:http://pan.baidu.com/s/1skP8YT3 ,提取码:inyl。
所需的jar包有:1、log4j-1.2.17.jar 2、mina-core-2.0.0.jar 3、slf4j-api-1.5.11.jar 4、slf4j-simple-1.5.2.jar
服务器端导入这四个jar包,Android端不用导入log4j-1.2.17.jar,它是用来打印log日志,Android端就不需要加入了。
Android端需要添加网络访问权限:
服务器端:
1、添加服务器端监听:
//入口函数
public static void main(String[] args) {
//创建一个NioSocketAcceptor
NioSocketAcceptor acceptor = new NioSocketAcceptor();
//添加过滤
acceptor.getFilterChain().addLast("LineCodec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
//设置Handler,这个handler使我们自己定义的类,需要继承IoHandlerAdapter
acceptor.setHandler(new MinaServerHandler());
try {
//绑定端口
acceptor.bind(new InetSocketAddress(9999));
} catch (IOException e) {
e.printStackTrace();
}
}
2、创建MinaServerHandler类: public class MinaServerHandler extends IoHandlerAdapter {
private static List sessions = new ArrayList<>();
//当客户端与服务器端简历连接后会调用sessionCreated,session相当于一个客户端连接实例,在这里我们可以保存这个实例
@Override
public void sessionCreated(IoSession session) throws Exception {
super.sessionCreated(session);
//保存session实例
sessions.add(session);
}
//当客户端与服务器断开连接是会调用这个方法,在这里我们可以移除已断开连接的Session
@Override
public void sessionClosed(IoSession session) throws Exception {
super.sessionClosed(session);
//移除Session实例
sessions.remove(session);
}
/*当客户端向服务器发送了消息以后,会调用这个方法,message为数据内容
在这里我们可以对数据进行接收我们可以
*/
@Override
public void messageReceived(IoSession session, Object message) throws Exception {
super.messageReceived(session, message);
//我们可以实时的将消息发送到其他客户端
for(IoSession is : sessions){
if(!is.equals(session)){
is.write(message);
}
}
//当处理逻辑较多时,如果我们使用json来传送数据,可以在json中加一个code字段来表示这条消息的类型,并写一个JsonUtil来进行获取类型等操作
String json = message.toString();
int code = JsonUtil.getCode(json);
switch(code){
case 1:
//根据json数据做处理
break;
case 2:
//更加json数据做处理
break;
}
}
}
}
Android客户端:
1、创建NetConnector用于与服务器建立连接
public class NetConnector {
private static IoSession instance = null;
private static IoConnector connector = null;
//获取Session
public static IoSession getSession(){
if(instance == null){
synchronized(NetConnector.class){
if(instance == null){
instance = createSession();
}
}
}
return instance;
}
//获取IoSession
private static IoSession createSession() {
L.i("客户端连接开始!");
connector = new NioSocketConnector();
//设置链接超时时间
connector.setConnectTimeoutMillis(30000);
//添加过滤器
connector.getFilterChain().addLast("LineCodec",
new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("UTF-8"))));
minaClientHandler = new MinaClientHandler();
//设置Handler,MinaClientHandler为自己创建的类,继承自IoHandlerAdapter
connector.setHandler(minaClientHandler);
ConnectFuture future = connector.connect(new InetSocketAddress("192.168.191.194", 9999));//创建链接,指定Ip地址与端口号
future.awaitUninterruptibly();// 等待连接创建完成
instance = future.getSession();//获得session实例
return instance;
}
public static closeConnector(){
if(instance != null){
session.getCloseFuture().awaitUninterruptibly(); //等待关闭连接
}
if(connector != null){
connector.dispose();
}
}
}
2、创建MinaClientHandler类MinaClientHandler类与服务器端的MinaServerHandler类都是继承自IoHandlerAdapter。在客户端中主要是重写MessageReceived方法用来接收服务器端的消息,我们也可以用为Json字符串添加Code字段来进行消息类型的解析。由于方法是一样的,在这里就省略了。3、向服务器端发送消息我们通过NetConnector的getInstance()方法得到一个IoSession实例,得到这个实例后,也就与服务器建立了连接,这时我们就可以通过IoSession的write(object)方法想服务器发送消息了。
4、关闭连接
如果现在不需要使用连接,记得关闭哦。 NetConnector.closeConnector();在这里mina框架的大概用法就介绍完了,这只是我目前理解并且使用的方法,后边需要对mina框架做进一步的学习,希望这里可以对初学者有一些帮助,如果有错误的地方,还请联系我,做进一步的改正,在这里先谢过各位大神。qq:1362616851