android_项目_知识积累_mina通信(java程序简单通信)

目前项目需要做一个类似微信的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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值