目前项目需要做一个类似微信的IM推送功能,因此首先自然是知识积累了,网上有个androidpn的项目,虽然bug很多,但是项目架构是很完整的,很多朋友能运行但是不知其原理,这里我就来慢慢探索下。
做一个项目就要把他吃透,不然用过了就完了,没有汲取其中的营养,技术也无从进步。这里我就从网络通信开始,几年前写过一段时间MFC框架的C++程序,对其中的网络通信机制也有大概的了解,当然这里我们不说C++语音,就说Java的网络通信。网络通信从架构上来说主要分为B/S、C/S架构。顾名思义,B/S架构就是浏览器服务器模型,C/S是客户端服务器端模型,常用的B/S类型的项目很多很多,比如现在这个博客系统就是B/S模型,自己也写过很多B/S项目,比如:ASP、JSP、.NET、以及PHP的都写过。常见的C/S模型便是传统的项目结构模型,虽然现在B/S越来越普及,但是C/S也一直沿用,因为富客户端的作用也是很大的,C/S模式比B/S模式更具有缓冲压力的作用,以及节约流量等自然是不言而喻的。
android和服务器端通信可以用B/S和C/S两种模式,android里面内嵌webview控件这个可是实现B/S通信,以及现在市场上拥有的phonegap、jquerymobile之类的,目前而言这些开发出的产品效果都不能达到运用android本地控件所做过的效果好。因此这里我们讨论用android本地控件开发客户端与服务器端通信的问题。
为了避免重复造轮子(自己全部重写java套接字编程以及线程池管理等),我准备用mina框架,关于mina的简介可以看这篇文章:http://hi.baidu.com/kangjun118/item/4dac06eaef58c2f3fb42ba38,mina主要的类:
IoAccepter 相当于网络应用程序中的服务器端
IoConnector 相当于客户端
IoSession 当前客户端到服务器端的一个连接实例
IoHandler 业务处理逻辑
IoFilter 过滤器用于悬接通讯层接口与业务层接口
这里写一个简单的mina通信的demo
服务器端:
准备工作:
安装JDK 5.0以上版本
下载:(下载地址:http://download.csdn.net/detail/guozeming122/6867033)
mina-core-2.0.0-M6.jar
slf4j-api-1.5.2.jar
服务器端工程结构如下:
服务端的代码:
package com.guo.mina.server; import java.net.InetSocketAddress; import org.apache.mina.core.filterchain.IoFilter; import org.apache.mina.core.service.IoAcceptor; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.transport.socket.nio.NioSocketAcceptor; public class MinaServer { private static final int PORT = 5333; /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub IoAcceptor acceptor = new NioSocketAcceptor(); IoFilter filter = new ProtocolCodecFilter(new TextLineCodecFactory()); acceptor.getFilterChain().addLast("gzm", filter); acceptor.setHandler(new ServerHandler()); try { acceptor.bind(new InetSocketAddress(PORT)); } catch (Exception e) { // TODO: handle exception System.out.println(e.getMessage()); } System.out.println("服务器正在监听端口" + PORT + "..."); } }
其中serverHandler代码如下:
package com.guo.mina.server; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IoSession; public class ServerHandler extends IoHandlerAdapter { @Override public void messageReceived(IoSession session, Object message) throws Exception { System.out.println("客户端发来消息:" + message.toString()); } @Override public void exceptionCaught(IoSession session, Throwable cause) throws Exception { System.out.println("服务器端异常:" +cause); } }
客户端:
准备工作:
安装JDK 5.0以上版本
下载:
mina-core-2.0.0-M6.jar
slf4j-api-1.5.2.jar
客户端工程目录如下:
客户端代码如下:
package com.guo.mina.client; import java.net.InetSocketAddress; import java.net.SocketAddress; import org.apache.mina.core.filterchain.IoFilter; import org.apache.mina.core.future.ConnectFuture; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.transport.socket.SocketConnector; import org.apache.mina.transport.socket.nio.NioSocketConnector; public class MinaClient { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub SocketConnector connector = new NioSocketConnector(); IoFilter filter = new ProtocolCodecFilter(new TextLineCodecFactory()); connector.getFilterChain().addLast("gzm", filter); SocketAddress soketAddress = new InetSocketAddress("127.0.0.1", 5333); connector.setHandler(new ClientHandler()); ConnectFuture future= connector.connect(soketAddress); future.join(); if (!future.isConnected()) { System.out.println("连接服务器失败"); return; } future.getSession().write("hello world"); } }
其中clientHandler类代码如下:
package com.guo.mina.client; import org.apache.mina.core.service.IoHandlerAdapter; import org.apache.mina.core.session.IoSession; public class ClientHandler extends IoHandlerAdapter { public void messageReceived(IoSession arg0, Object message) throws Exception { System.out.println("服务器发来消息:" + message.toString()); } public void exceptionCaught(IoSession arg0, Throwable arg1) throws Exception { } }
好了,现在我们先运行服务器端代码,然后再运行客户端代码,运行效果如下
代码下载地址:http://download.csdn.net/detail/guozeming122/6866985