push研究――Apache Mina探索初步
16lz
2021-01-24
虽然google为Android开发者提供了GCM实现push,但是因为需要系统安装了google play、google帐号、系统>2.2、google push服务器在国外等多种原因,在中国,Android上想实现push还需要自己努力。
当前最火的开源push是基于xmpp协议的androidpn。androidpn是基于Mina框架的,所以这里从Mina框架开始入手。
Server
下面通过简单的例子来学习mina的使用。首先创建服务端,工程正使用了3个jar包
看代码:
- publicclassHelloMina{
- privatestaticfinalintPORT=9125;
- /**
- *@paramargs
- *@throwsIOException
- */
- publicstaticvoidmain(String[]args)throwsIOException{
- //创建一个非阻塞的server端Socket,用NIO
- IoAcceptoracceptor=newNioSocketAcceptor();
- acceptor.getFilterChain().addLast("logger",newLoggingFilter());
- acceptor.getFilterChain().addLast("codec",newProtocolCodecFilter(newTextLineCodecFactory(Charset.forName("UTF-8"))));
- //设定服务器端的消息处理器
- acceptor.setHandler(newMinaServerHandler());
- acceptor.getSessionConfig().setReadBufferSize(2048);
- acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE,10);
- //服务器端绑定的端口启动服务
- acceptor.bind(newInetSocketAddress(PORT));
- }
- }
HelloMina的处理器:
- /**
- *HelloMina的处理逻辑
- *@authorzhangxy
- */
- classMinaServerHandlerextendsIoHandlerAdapter{
- @Override
- publicvoidexceptionCaught(IoSessionsession,Throwablecause)throwsException{
- cause.printStackTrace();
- session.close();
- }
- @Override
- publicvoidmessageReceived(IoSessionsession,Objectmessage)throwsException
- {
- Stringstr=message.toString();
- if(str.trim().equalsIgnoreCase("quit")){
- session.close();
- return;
- }
- System.err.println("收到客户端发来的消息::"+str);
- StringBuilderbuf=newStringBuilder(str.length());
- for(inti=str.length()-1;i>=0;i--){
- buf.append(str.charAt(i));
- }
- //andwriteitback.
- session.write(buf.toString());
- }
- @Override
- publicvoidsessionIdle(IoSessionsession,IdleStatusstatus)throwsException{
- System.out.println("IDLE"+session.getIdleCount(status));
- }
- @Override
- publicvoidmessageSent(IoSessionsession,Objectmessage)
- throwsException{
- //TODOAuto-generatedmethodstub
- super.messageSent(session,message);
- }
- @Override
- publicvoidsessionClosed(IoSessionsession)throwsException{
- //TODOAuto-generatedmethodstub
- super.sessionClosed(session);
- System.out.println("sessionclosed");
- }
- @Override
- publicvoidsessionCreated(IoSessionsession)throwsException{
- //TODOAuto-generatedmethodstub
- super.sessionCreated(session);
- System.out.println("sessioncreate");
- }
- @Override
- publicvoidsessionOpened(IoSessionsession)throwsException{
- //TODOAuto-generatedmethodstub
- super.sessionOpened(session);
- System.out.println("sessionopened");
- }
- }
client
下面是Client代码,Client没有使用NIO,使用的普通socket实现:
- publicclassHelloMinaClient{
- privateSocketsocket;
- privateDataOutputStreamout;
- privateDataInputStreamin;
- publicHelloMinaClient()throwsIOException{
- }
- /**
- *@paramargs
- */
- publicstaticvoidmain(String[]args)throwsException{
- //TODOAuto-generatedmethodstub
- HelloMinaClientminaClient=newHelloMinaClient();
- minaClient.minaClient();
- }
- /**
- *发送消息
- *@paramout
- */
- publicvoidsendMessage(Sockets){
- try{
- out=newDataOutputStream(s.getOutputStream());
- out.writeBytes("mina\n");
- }catch(IOExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- }
- publicvoidreceiveMessage(Sockets){
- try{
- in=newDataInputStream(s.getInputStream());
- System.err.println("收到服务端发来的消息::"+in.readLine());
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- publicvoidminaClient()throwsException{
- while(true){
- try{
- socket=newSocket("192.168.21.121",9124);
- sendMessage(socket);
- receiveMessage(socket);
- out.close();
- in.close();
- Thread.sleep(5000);
- }catch(InterruptedExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }catch(Exceptione){
- e.printStackTrace();
- }finally{
- try{
- if(socket!=null)socket.close();//断开连接
- }catch(IOExceptione){e.printStackTrace();}
- }
- }
- }
- }
SOCKET作为短连接,即收发消息后SOCKET断开一次,线程过5秒又建立连接收发消息。
/**
* @author 张兴业
* 邮箱:xy-zhang#163.com
* android开发进阶群:278401545
*http://blog.csdn.net/xyz_lmn
* http://xyzlmn.blog.51cto.com/
*/
更多相关文章
- Android客户端、服务端、数据库开发流程及需要环境
- 一篇文章看明白 Android(安卓)v1 & v2 签名机制
- Android中AsyncTask的使用
- Handler&Looper
- handler机制
- android 仿QQ界面
- 简单的android客户端servlet服务端的交互
- Android(安卓)2.3.3 NFC分析
- Android(安卓)Notification 用法的4种形式