目前项目需要做一个类似微信的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.youkuaiyun.com/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 {
}
}
好了,现在我们先运行服务器端代码,然后再运行客户端代码,运行效果如下