前段时间学习了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端需要添加网络访问权限:
<uses-permission android:name="android.permission.INTERNET" />
服务器端:
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<IoSession> 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
时间: 2024-10-12 03:22:22