Mina框架项目运用
近期最一个项目对通信要求比較严格,须要建立长连接,且能处理多并发,所以选择了Mina框架。以下就简单记录开发的过程吧:
mina 开发须要的jar包:
mina pc端通信:
服务端:
package cn.ys.net;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFactory;
import org.apache.mina.filter.codec.ProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolEncoder;
/**
* <b>function:</b> 字符编码、解码工厂类,编码过滤工厂
* @author hoojo
* @createDate 2012-6-26 下午01:08:50
* @file CharsetCodecFactory.java
* @package com.hoo.mina.code.factory
* @project ApacheMiNa
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/
public class CharsetCodecFactory implements ProtocolCodecFactory {
@Override
public ProtocolDecoder getDecoder(IoSession session) throws Exception {
return new CharsetDecoder();
}
@Override
public ProtocolEncoder getEncoder(IoSession session) throws Exception {
return new CharsetEncoder();
}
}
package cn.ys.net;
import java.nio.charset.Charset;
import org.apache.log4j.Logger;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;
/**
* <b>function:</b> 字符解码
* @author hoojo
* @createDate 2012-6-26 上午11:14:18
* @file CharsetDecoder.java
* @package com.hoo.mina.code
* @project ApacheMiNa
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/
public class CharsetDecoder implements ProtocolDecoder {
private final static Logger log = Logger.getLogger(CharsetDecoder.class);
private final static Charset charset = Charset.forName("UTF-8");
// 可变的IoBuffer数据缓冲区
private IoBuffer buff = IoBuffer.allocate(100).setAutoExpand(true);
@Override
public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
log.info("#########decode#########");
// 假设有消息
while (in.hasRemaining()) {
// 推断消息是否是结束符。不同平台的结束符也不一样;
// windows换行符(\r\n)就觉得是一个完整消息的结束符了; UNIX 是\n。MAC 是\r
byte b = in.get();
if (b == '\n') {
buff.flip();
byte[] bytes = new byte[buff.limit()];
buff.get(bytes);
String message = new String(bytes, charset);
buff = IoBuffer.allocate(100).setAutoExpand(true);
// 假设结束了,就写入转码后的数据
out.write(message);
} else {
buff.put(b);
}
}
}
@Override
public void dispose(IoSession session) throws Exception {
log.info("#########dispose#########");
log.info(session.getCurrentWriteMessage());
}
@Override
public void finishDecode(IoSession session, ProtocolDecoderOutput out) throws Exception {
log.info("#########完毕解码#########");
}
}
package cn.ys.net;
import java.nio.charset.Charset;
import org.apache.log4j.Logger;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolEncoder;
import org.apache.mina.filter.codec.ProtocolEncoderOutput;
import org.apache.mina.filter.codec.textline.LineDelimiter;
/**
* <b>function:</b> 字符编码
* @author hoojo
* @createDate 2012-6-26 上午11:32:05
* @file CharsetEncoder.java
* @package com.hoo.mina.code
* @project ApacheMiNa
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/
public class CharsetEncoder implements ProtocolEncoder {
private final static Logger log = Logger.getLogger(CharsetEncoder.class);
private final static Charset charset = Charset.forName("UTF-8");
@Override
public void dispose(IoSession session) throws Exception {
log.info("#############dispose############");
}
@Override
public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception {
log.info("#############字符编码############");
IoBuffer buff = IoBuffer.allocate(100).setAutoExpand(true);
buff.putString(message.toString(), charset.newEncoder());
// put 当前系统默认换行符
buff.putString(LineDelimiter.DEFAULT.getValue(), charset.newEncoder());
// 为下一次读取数据做准备
buff.flip();
out.write(buff);
}
}
package cn.ys.net;
import java.util.Collection;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MinaServerHandler extends IoHandlerAdapter{
public static Logger logger = LoggerFactory.getLogger(MinaServerHandler.class);
/**
* 这种方法当一个Session 对象被创建的时候被调用。对于TCP 连接来说,连接被接受的时候
* 调用,但要注意此时TCP 连接并未建立。此方法仅代表字面含义,也就是连接的对象
* IoSession 被创建完成的时候,回调这种方法。
* 对于UDP 来说。当有数据包收到的时候回调这种方法,由于UDP 是无连接的。
*/
@Override
public void sessionCreated(IoSession session) throws Exception {
System.out.println(1);
// logger.info("服务端与client创建连接..."+ session.getId()+" remoteaddress: "+session.getRemoteAddress()+ " locanaddress"+session.getLocalAddress());
}
/**
* 这种方法在连接被打开时调用,它总是在sessionCreated()方法之后被调用。对于TCP 来
* 说。它是在连接被建立之后调用,你能够在这里运行一些认证操作、发送数据等。
*/
@Override
public void sessionOpened(IoSession session) throws Exception {
logger.info("服务端与client连接打开...");
}
/**
* 接收到消息时调用的方法,也就是用于接收消息的方法,普通情况下,message 是一个
* IoBuffer 类,假设你使用了协议编解码器,那么能够强制转换为你须要的类型。
*/
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
String msg = message.toString();
String remoteaddress=session.getRemoteAddress().toString();
logger.info("服务端接收到的数据为:" + msg+" id: "+ session.getId()+" remoteaddress: "+remoteaddress+ " locanaddress"+session.getLocalAddress());
// 拿到全部的clientSession
Collection<IoSession> sessions = session.getService().getManagedSessions().values();
// 向全部client发送数据
int i=0;
for (IoSession sess : sessions) {
i++;
logger.info(" remoteaddress: "+i+" "+session.getRemoteAddress());
if(!(remoteaddress.substring(1,14)).equalsIgnoreCase(sess.getRemoteAddress().toString().substring(1,14))){
sess.write(msg);
}
}
System.out.println("连接数: "+i);
}
/**
* 当发送消息成功时调用这种方法,注意这里的措辞,发送成功之后,
* 也就是说发送消息是不能用这种方法的。
*/
@Override
public void messageSent(IoSession session, Object message) throws Exception {
System.out.println(4);
logger.info("id: "+ session.getId()+" remoteaddress: "+session.getRemoteAddress()+ " locanaddress"+session.getLocalAddress());
logger.info("服务端发送信息成功...");
}
/**
* 对于TCP 来说,连接被关闭时。调用这种方法。
* 对于UDP 来说。IoSession 的close()方法被调用时才会毁掉这种方法。
*/
@Override
public void sessionClosed(IoSession session) throws Exception {
logger.info("服务端连接已经失效");
}
/**
* 这种方法在IoSession 的通道进入空暇状态时调用,对于UDP 协议来说,这种方法始终不会
* 被调用。
*/
@Override
public void sessionIdle(IoSession session, IdleStatus status)
throws Exception {
logger.info("服务端进入空暇状态...");
}
/**
* 这种方法在你的程序、Mina 自身出现异常时回调,一般这里是关闭IoSession。
*/
@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
logger.error("服务端发送异常...", cause);
}
}
package cn.ys.net;
import java.net.InetSocketAddress;
import org.apache.mina.core.service.IoAcceptor;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MinaServer {
private static Logger logger = LoggerFactory.getLogger(MinaServer.class);
public MinaServer(int port) {
// TODO Auto-generated constructor stub
IoAcceptor acceptor = null;
try {
// 创建一个非堵塞的server端的Socket
acceptor = new NioSocketAcceptor();
// 设置过滤器(使用Mina提供的文本换行符编解码器)
acceptor.getFilterChain().addLast("codec", new ProtocolCodecFilter(new CharsetCodecFactory()));
// acceptor.getFilterChain().addLast(
// "codec",
// new ProtocolCodecFilter(new TextLineCodecFactory(Charset
// .forName("UTF-8"),
// LineDelimiter.WINDOWS.getValue(),
// LineDelimiter.WINDOWS.getValue())));
// 设置读取数据的缓冲区大小
acceptor.getSessionConfig().setReadBufferSize(2048);
// 读写通道10秒内无操作进入空暇状态
acceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 10);
// 绑定逻辑处理器
acceptor.setHandler(new MinaServerHandler());
// 绑定port
acceptor.bind(new InetSocketAddress(port));
logger.info("服务端启动成功... 端口号为:" + port);
} catch (Exception e) {
logger.error("服务端启动异常....", e);
e.printStackTrace();
}
}
}
client:
package cn.ys.test;
import java.net.InetSocketAddress;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.future.CloseFuture;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.transport.socket.SocketConnector;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import cn.ys.net.CharsetCodecFactory;
import com.sun.corba.se.impl.javax.rmi.CORBA.Util;
public class MinaClient {
private static Logger logger = LoggerFactory.getLogger(MinaClient.class);
private SocketConnector connector;
private ConnectFuture future;
private IoSession session;
public boolean connect() {
// 创建一个socket连接
connector = new NioSocketConnector();
// 设置链接超时时间
connector.setConnectTimeoutMillis(2000);
// 获取过滤器链
DefaultIoFilterChainBuilder filterChain = connector.getFilterChain();
// 加入编码过滤器 处理乱码、编码问题
filterChain.addLast("codec", new ProtocolCodecFilter(new CharsetCodecFactory()));
// .forName("UTF-8"), LineDelimiter.WINDOWS.getValue(),
// LineDelimiter.WINDOWS.getValue())));
try {
// 消息核心处理器
connector.setHandler(new MinaClientHandler());
// TODO Auto-generated method stub
future = connector.connect(new InetSocketAddress(
"192.168.1.100", 6969));// 创建连接
future.awaitUninterruptibly();// 等待连接创建完毕
session= future.getSession();// 获得session
} catch (Exception e) {
// showToast("client链接异常。请检查网络");
logger.error("client链接异常...", e);
return false;
}
return true;
}
public void setAttribute(Object key, Object value) {
session.setAttribute(key, value);
}
public void send(String message) {
session.write(message);// 发送消息
// session.getCloseFuture().awaitUninterruptibly();// 等待连接断开
}
public boolean close() {
CloseFuture future = session.getCloseFuture();
future.awaitUninterruptibly();
// future.awaitUninterruptibly(1000);
connector.dispose();
return true;
}
public SocketConnector getConnector() {
return connector;
}
public IoSession getSession() {
return session;
}
}
package cn.ys.test;
import org.apache.commons.logging.Log;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MinaClientHandler extends IoHandlerAdapter {
private static Logger logger = LoggerFactory
.getLogger(MinaClientHandler.class);
public static String ini = "没有数据";
@Override
public void messageReceived(IoSession session, Object message)
throws Exception {
// Log.d("tag", "message "+ message);
//接收server发送过来的数据;
// String msg = message.toString();
// JSONObject jsonObject=new JSONObject(message.toString());
// String msg=jsonObject.get("state").toString();
// System.out.println(jsonObject.get("sum"));
// String info = "";
// if ("1".equals(msg)) {
// // session.close();
//
//用户登录成功 关闭连接
// info = "登录成功";
// } else {
// info = "登录失败";
// }
ini = message.toString();
// session.setAttribute("state", message);
// session.close();
logger.info("client接收到的信息为:" + message.toString());
}
@Override
public void exceptionCaught(IoSession session, Throwable cause)
throws Exception {
logger.error("client发生异常...", cause);
}
@Override
public void sessionCreated(IoSession arg0) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void sessionIdle(IoSession arg0, IdleStatus arg1) throws Exception {
// TODO Auto-generated method stub
}
/**
* 这种方法在连接被打开时调用。它总是在sessionCreated()方法之后被调用。
对于TCP 来
* 说,它是在连接被建立之后调用。你能够在这里运行一些认证操作、发送数据等。
*/
@Override
public void sessionOpened(IoSession arg0) throws Exception {
logger.info("ok", "i am ready!");
// System.out.println(6);
}
}
package cn.ys.test;
import java.util.Scanner;
import cn.ys.net.MinaServer;
public class TestServer {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
// new MinaServer(6969);
MinaClient client=new MinaClient();
if(client.connect()){
client.send("启动客户端成功!
");
while(scanner.hasNext()){
client.send(scanner.next());
}
}
}
}
这是pc端的通信,以下这是android端运用mina与server通信,server端还是不变:
android端须要的jar 包:
下面这是代码:
package com.ys.carclean.net;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFactory;
import org.apache.mina.filter.codec.ProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolEncoder;
/**
* <b>function:</b> 字符编码、解码工厂类,编码过滤工厂
* @author hoojo
* @createDate 2012-6-26 下午01:08:50
* @file CharsetCodecFactory.java
* @package com.hoo.mina.code.factory
* @project ApacheMiNa
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/
public class CharsetCodecFactory implements ProtocolCodecFactory {
@Override
public ProtocolDecoder getDecoder(IoSession session) throws Exception {
return new CharsetDecoder();
}
@Override
public ProtocolEncoder getEncoder(IoSession session) throws Exception {
return new CharsetEncoder();
}
}
package com.ys.carclean.net;
import java.nio.charset.Charset;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;
/**
* <b>function:</b> 字符解码
* @author hoojo
* @createDate 2012-6-26 上午11:14:18
* @file CharsetDecoder.java
* @package com.hoo.mina.code
* @project ApacheMiNa
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/
public class CharsetDecoder implements ProtocolDecoder {
// private final static Logger log = Logger.getLogger(CharsetDecoder.class);
private final static Charset charset = Charset.forName("UTF-8");
// 可变的IoBuffer数据缓冲区
private IoBuffer buff = IoBuffer.allocate(100).setAutoExpand(true);
@Override
public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception {
// log.info("#########decode#########");
// 假设有消息
while (in.hasRemaining()) {
// 推断消息是否是结束符,不同平台的结束符也不一样;
// windows换行符(\r\n)就觉得是一个完整消息的结束符了。 UNIX 是\n;MAC 是\r
byte b = in.get();
if (b == '\n') {
buff.flip();
byte[] bytes = new byte[buff.limit()];
buff.get(bytes);
String message = new String(bytes, charset);
buff = IoBuffer.allocate(100).setAutoExpand(true);
// 假设结束了,就写入转码后的数据
out.write(message);
} else {
buff.put(b);
}
}
}
@Override
public void dispose(IoSession session) throws Exception {
}
@Override
public void finishDecode(IoSession session, ProtocolDecoderOutput out) throws Exception {
}
}
package com.ys.carclean.net;
import java.nio.charset.Charset;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolEncoder;
import org.apache.mina.filter.codec.ProtocolEncoderOutput;
import org.apache.mina.filter.codec.textline.LineDelimiter;
/**
* <b>function:</b> 字符编码
* @author hoojo
* @createDate 2012-6-26 上午11:32:05
* @file CharsetEncoder.java
* @package com.hoo.mina.code
* @project ApacheMiNa
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/
public class CharsetEncoder implements ProtocolEncoder {
// private final static Logger log = Logger.getLogger(CharsetEncoder.class);
private final static Charset charset = Charset.forName("UTF-8");
@Override
public void dispose(IoSession session) throws Exception {
// log.info("#############dispose############");
}
@Override
public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception {
// log.info("#############字符编码############");
IoBuffer buff = IoBuffer.allocate(100).setAutoExpand(true);
buff.putString(message.toString(), charset.newEncoder());
// put 当前系统默认换行符
buff.putString(LineDelimiter.DEFAULT.getValue(), charset.newEncoder());
// 为下一次读取数据做准备
buff.flip();
out.write(buff);
}
}
package com.ys.carclean.net;
import java.nio.charset.Charset;
import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolEncoder;
import org.apache.mina.filter.codec.ProtocolEncoderOutput;
import org.apache.mina.filter.codec.textline.LineDelimiter;
/**
* <b>function:</b> 字符编码
* @author hoojo
* @createDate 2012-6-26 上午11:32:05
* @file CharsetEncoder.java
* @package com.hoo.mina.code
* @project ApacheMiNa
* @blog http://blog.csdn.net/IBM_hoojo
* @email hoojo_@126.com
* @version 1.0
*/
public class CharsetEncoder implements ProtocolEncoder {
// private final static Logger log = Logger.getLogger(CharsetEncoder.class);
private final static Charset charset = Charset.forName("UTF-8");
@Override
public void dispose(IoSession session) throws Exception {
// log.info("#############dispose############");
}
@Override
public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception {
// log.info("#############字符编码############");
IoBuffer buff = IoBuffer.allocate(100).setAutoExpand(true);
buff.putString(message.toString(), charset.newEncoder());
// put 当前系统默认换行符
buff.putString(LineDelimiter.DEFAULT.getValue(), charset.newEncoder());
// 为下一次读取数据做准备
buff.flip();
out.write(buff);
}
}
package com.ys.carclean.net;
import java.net.InetSocketAddress;
import java.nio.charset.Charset;
import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
import org.apache.mina.core.future.CloseFuture;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.textline.LineDelimiter;
import org.apache.mina.filter.codec.textline.TextLineCodecFactory;
import org.apache.mina.transport.socket.SocketConnector;
import org.apache.mina.transport.socket.nio.NioSocketConnector;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ys.carclean.net.util.Util;
public class MinaClient {
private static Logger logger = LoggerFactory.getLogger(MinaClient.class);
private SocketConnector connector;
private ConnectFuture future;
private IoSession session;
public boolean connect() {
// 创建一个socket连接
connector = new NioSocketConnector();
// 设置链接超时时间
connector.setConnectTimeoutMillis(2000);
// 获取过滤器链
DefaultIoFilterChainBuilder filterChain = connector.getFilterChain();
// 加入编码过滤器 处理乱码、编码问题
filterChain.addLast("codec", new ProtocolCodecFilter(new CharsetCodecFactory()));
// .forName("UTF-8"), LineDelimiter.WINDOWS.getValue(),
// LineDelimiter.WINDOWS.getValue())));
try {
// 消息核心处理器
connector.setHandler(new MinaClientHandler());
// TODO Auto-generated method stub
future = connector.connect(new InetSocketAddress(
Util.HOST, Util.PORT));// 创建连接
future.awaitUninterruptibly();// 等待连接创建完毕
session= future.getSession();// 获得session
} catch (Exception e) {
// showToast("client链接异常。请检查网络");
logger.error("client链接异常...", e);
return false;
}
return true;
}
public void setAttribute(Object key, Object value) {
session.setAttribute(key, value);
}
public void send(String message) {
session.write(message);// 发送消息
// session.getCloseFuture().awaitUninterruptibly();// 等待连接断开
}
public boolean close() {
CloseFuture future = session.getCloseFuture();
future.awaitUninterruptibly();
// future.awaitUninterruptibly(1000);
connector.dispose();
return true;
}
public SocketConnector getConnector() {
return connector;
}
public IoSession getSession() {
return session;
}
}
package com.ys.carclean.activity;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.ys.carclean.R;
import com.ys.carclean.net.MinaClient;
import com.ys.carclean.net.MinaClientHandler;
public class MainActivity extends Activity {
private static String LOGIN_NAME = "";
private Handler handler = new Handler();
private MinaClient client = new MinaClient();
Boolean isconn=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//启动app就发起网络请求
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
isconn=client.connect();
}
}).start();
Button btn = (Button) findViewById(R.id.btn_send);
final EditText et=(EditText) findViewById(R.id.et_name);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
LOGIN_NAME = et.getText().toString();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
if(isconn){
// Log.d("tag", LOGIN_NAME +" URLEncoder : "+URLEncoder.encode(LOGIN_NAME));
// SendVo sv=new SendVo();
// sv.setDestID("2454500");
// sv.setMsg("89887987");
// sv.setOperate("开机");
JSONObject object=new JSONObject();
try {
object.put("destId", "6546");
object.put("msg", "1小时");
object.put("operate", "1");
} catch (JSONException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
client.send(object.toString());
}
}
}).start();
showToast(MinaClientHandler.ini);
// name.setText("sysadmin"); 设置初始值
// final Handler myHandler = new Handler() {
// int i = 0;
//
// @Override
// public void handleMessage(Message msg) {
// // 该线程位于主线程
// // 假设该消息是本程序所发送的
// if (msg.what == 0x1233) {
// // 主线程里面 显示操作
// i++;
// showToast("第" + i + "次连接開始....");
// }
// }
// };
// 定义一个计时器。让该计时器周期性的运行指定任务 TimerTask对象的本质就是启动一条新线程
// new Timer().schedule(new TimerTask() {
// @Override
// public void run() {
// // 新启动的线程无法訪问该Activity里的组件
// // 所以须要通过Handler发送消息
// // TODO Auto-generated method stub
// Message msg = new Message();
// msg.what = 0x1233;
// // 发送消息
// myHandler.sendMessage(msg);
// LOGIN_NAME = et.getText().toString();
// //在子线程里面发送请求
// socketServer();
// showToast(MinaClientHandler.ini);
// }
// }, 0, 10000);
}
});
// 定义一个计时器,让该计时器周期性的运行指定任务 TimerTask对象的本质就是启动一条新线程
//每5秒。显示下后台传过来的东西
new Timer().schedule(new TimerTask() {
@Override
public void run() {
//新启动的线程无法訪问该Activity里的组件
showToast(MinaClientHandler.ini);
}
}, 0, 5000);
}
public void showToast(final String text) {
handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(getApplicationContext(), text,
Toast.LENGTH_SHORT).show();
}
});
}
// public void socketServer() {
// // 创建一个非堵塞的client程序
// IoConnector connector = new NioSocketConnector();
// // 设置链接超时时间
// connector.setConnectTimeout(5);
// // 加入编码过滤器
// connector.getFilterChain().addLast(
// "codec",
// new ProtocolCodecFilter(new TextLineCodecFactory(Charset
// .forName("UTF-8"), LineDelimiter.WINDOWS.getValue(),
// LineDelimiter.WINDOWS.getValue())));
// // 加入业务逻辑处理器类
// connector.setHandler(new MinaClientHandler());
// IoSession session=null;
// try {
// // 这里是异步操作 连接后马上返回
// ConnectFuture future = connector.connect(new InetSocketAddress(
// HOST, PORT));// 创建连接
// future.awaitUninterruptibly();// 等待连接创建完毕
// session= future.getSession();// 获得session
// JSONObject json = createJSONObject();
//
// session.write(json);// 发送消息
//
// session.getCloseFuture().awaitUninterruptibly();// 等待连接断开
// connector.dispose();
// showToast(MinaClientHandler.ini);
// } catch (Exception e) {
// showToast("client链接异常,请检查网络");
// logger.error("client链接异常...", e);
// }
//
// }
// public static JSONObject createJSONObject() {
// JSONObject jsonObject = new JSONObject();
// try {
// jsonObject.put("username", LOGIN_NAME);
//// jsonObject.put("sex", "男");
//// jsonObject.put("QQ", "413425430");
//// jsonObject.put("Min.score", new Integer(99));
// jsonObject.put("nickname", "梦中心境");
// } catch (JSONException e) {
// e.printStackTrace();
// }
// return jsonObject;
// }
}
到这里简单的mina pc端及app与后台通信都能够了。
以下这就是mina与spring进行整合了:弄了一个中午才搞懂,在spring配置文件了 配置了监听minaport。所以在就不须要在程序里手动启动了。
配置文件例如以下:
<!-- mina配置 -->
<!-- 业务处理逻辑 -->
<bean id="handler" class="cn.ys.carclean.net.MinaServerHandler" />
<!-- 累加数据包解码器:解断丢包、粘包问题 -->
<bean id="codec" class="org.apache.mina.filter.codec.ProtocolCodecFilter">
<constructor-arg>
<bean class="org.apache.mina.filter.codec.textline.TextLineCodecFactory"></bean>
<!-- <bean class="cn.ys.carclean.net.CharsetCodecFactory"> -->
<!-- <constructor-arg index="0"> -->
<!-- <bean class="cn.ys.carclean.net.CharsetEncoder"></bean> -->
<!-- </constructor-arg> -->
<!-- <constructor-arg index="1"> -->
<!-- <bean class="cn.ys.carclean.net.CharsetDecoder"> -->
<!-- </bean> -->
<!-- </constructor-arg> -->
<!-- </bean> -->
</constructor-arg>
</bean>
<!-- 多线程处理过滤器,为后面的操作开启多线程,一般放在编解码过滤器之后。開始业务逻辑处理 -->
<bean id="executors" class="org.apache.mina.filter.executor.ExecutorFilter" />
<!-- Mina自带日志过滤器 默认级别为debug -->
<bean id="loggerFilter" class="org.apache.mina.filter.logging.LoggingFilter">
<property name="messageReceivedLogLevel" ref="info"></property>
<property name="exceptionCaughtLogLevel" ref="info"></property>
</bean>
<!-- 枚举类型 依赖注入 须要先通过此类进行类型转换 -->
<bean id="info"
class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
<property name="staticField" value="org.apache.mina.filter.logging.LogLevel.INFO" />
</bean>
<bean id="filterChainBuilder"
class="org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder">
<property name="filters">
<map>
<entry key="codec" value-ref="codec" />
<entry key="logger" value-ref="loggerFilter" />
<entry key="executors" value-ref="executors" />
</map>
</property>
</bean>
<!-- 监听port -->
<bean id="defaultLocalAddress" class="java.net.InetSocketAddress">
<constructor-arg index="0" value="8081"></constructor-arg>
</bean>
<!-- session config 通过工厂方法注入 -->
<bean id="sessionConfig" factory-bean="ioAcceptor" factory-method="getSessionConfig">
<property name="readerIdleTime" value="10" />
<property name="minReadBufferSize" value="512" />
<property name="maxReadBufferSize" value="10240" />
</bean>
<bean id="ioAcceptor" class="org.apache.mina.transport.socket.nio.NioSocketAcceptor"
init-method="bind" destroy-method="unbind">
<!-- 默认启用的线程个数是CPU 的核数+1, -->
<!--<constructor-arg index="0" value="10"></constructor-arg> -->
<property name="defaultLocalAddress" ref="defaultLocalAddress" />
<property name="handler" ref="handler" />
<property name="filterChainBuilder" ref="filterChainBuilder" />
</bean>
ok 到这里简单学习完成,能够开心的开发项目了!
Mina框架项目运用的更多相关文章
- Android Mina框架的学习笔记
Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络 ...
- 关于mina框架EMFILE: open too many files exception的处理
做项目的时候,用到了mina框架,与server进行交互.由于采用的是短连接+心跳包+断线重连的方式,因此网络不稳定的时候经常会出现断线重连. 那么有时候偶尔会出现EMFILE: open too m ...
- 基于MINA框架快速开发网络应用程序
1.MINA框架简介 MINA(Multipurpose Infrastructure for Network Applications)是用于开发高性能和高可用性的网络应用程序的基础框架.通过使用M ...
- 使用Mina框架开发 QQ Android 客户端
Apache MINA是一个网络应用程序框架,用来帮助用户简单地开发高性能和高可靠性的网络应用程序.它提供了一个通过Java NIO在不同的传输例如TCP/IP和UDP/IP上抽象的事件驱动的异步AP ...
- mina框架tcpt通讯接收数据断包粘包处理
用mina做基于tcp,udp有通讯有段时间了,一直对编码解码不是很熟悉,这次做项目的时候碰到了断包情况,贴一下解决过程, 我接受数据格式如下图所示: unit32为c++中数据类型,代表4个字节,由 ...
- 基于Java Mina框架的部标jt808服务器设计和开发
在开发部标GPS平台中,部标jt808GPS服务器是系统的核心关键,决定了部标平台的稳定性和行那个.Linux服务器是首选,为了跨平台,开发语言选择Java自不待言.需要购买jt808GPS服务器源码 ...
- Mina框架的学习笔记——Android客户端的实现
Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络 ...
- mina框架详解
转:http://blog.csdn.net/w13770269691/article/details/8614584 mina框架详解 分类: web2013-02-26 17:13 12651人 ...
- GPS部标平台的架构设计(三) 基于struts+spring+hibernate+ibatis+quartz+mina框架开发GPS平台
注意,此版本是2014年研发的基于Spring2.5和Struts2的版本,此版本的源码仍然销售,但已不再提供源码升级的服务,因为目前我们开发的主流新版本是2015-2016年近一年推出的基于spri ...
随机推荐
- 【习题 7-3 UVA - 211】The Domino Effect
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每次搜素要往下还是要往右摆. 然后维护一下让每个下标只出现一次就可以了. =>作为剪枝条件 [代码] /* 1.Shoud i ...
- 94.文件bat脚本自删除
taskkill / f / im 自删除.exedel 自删除.exedel 1.bat void main() { FILE *pf = fopen("1.bat", &quo ...
- AndroidStudio MAT LeakCanary 内存分析之 LeakCanary
现在我们换一种更清晰方便的方式:LeakCanary https://github.com/square/leakcanary 首先将LeakCanary绑在我们的app上 build.gradle ...
- Flask项目之手机端租房网站的实战开发(八)
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...
- linux删除svn版本号库
当使用了svn版本号控制系统后每一个文件夹下都会有一个.svn文件夹存在,开发完当交付产品或者上传到server时一般要把这些文件夹删除.事实上在linux删除这些文件夹是非常easy的,命令例如以下 ...
- 使用 STL 辅助解决算法问题
不要重复制造轮子,而且你造的轮子未必比得上别人的: <numeric>⇒ accumulate,累积容器中区间的和,可以指定初值: 为什么 STL 中的容器和算法一定关于区间的操作一定是左 ...
- ejs模板引擎的使用
引入ejs.min.js 创建模板,以<%=jsCode%>包裹起来其余的html和html结构一样 focusTemplateData是模板使用的数据,使用$.each()方法遍历绑定数 ...
- FZU Problem 2168 防守阵地 I
http://acm.fzu.edu.cn/problem.php?pid=2168 题目大意: 给定n个数和m,要求从n个数中选择连续的m个,使得a[i]*1+a[i+1]*2+--a[i+m]*m ...
- Oracle10g中阻塞锁查询更简单
http://blog.itpub.net/195110/viewspace-677572/ http://blog.sina.com.cn/s/blog_636415010100khcl.html
- OC学习篇之---Foundation框架中的NSObject对象
从这篇文章开始我们开始介绍Foundation框架. OC中的Foundation框架是系统提供了,他就相当于是系统的一套api,和Java中的一些系统jar很相似,又早起的一批人开发的,内部有很多现 ...