Android 简单使用mina传递byte数组

具体使用的包可以参考http://www.2cto.com/kf/201606/515499.html,感谢作者的帮助



如果是在eclipse上,直接导入log4j-1.2.17.jar,mina-core-2.0.0.jar slf4j-api-1.5.11.jar slf4j-simple-1.5.2.jar这几个包就可以

如果实在Android studio上编辑,就需要做些修改了

第一步:

把jar包拷贝到对应的mudule下的libs文件夹

第二步:

module关联jar包(如果不会可以查查百度怎么关联,这时候会有些错误,比如jar包内容重复,可以删除掉log4j-1.2.17.jar包,这个是日志包,没有影响


第三步:在对应的module的gradle添加

    defaultConfig {
        multiDexEnabled true
    }



这时候android studio的mina包算是基本导入了


对于参考的文章,他给出的编解码工厂是出来字符串的,需要在服务器发送字符串时候就要带上换行回车符,但是我们要我使用的是字节数组,需要自己定制

顺便封装了一下,可以直接放到工程中使用,最好还是自己去看看手册,会收获更多

package com.example.sockettext;

import java.net.InetSocketAddress;

import org.apache.mina.core.buffer.IoBuffer;
import org.apache.mina.core.future.ConnectFuture;
import org.apache.mina.core.service.IoConnector;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.service.IoService;
import org.apache.mina.core.service.IoServiceListener;
import org.apache.mina.core.session.IdleStatus;
import org.apache.mina.core.session.IoSession;
import org.apache.mina.filter.codec.ProtocolCodecFactory;
import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.apache.mina.filter.codec.ProtocolDecoder;
import org.apache.mina.filter.codec.ProtocolDecoderAdapter;
import org.apache.mina.filter.codec.ProtocolDecoderOutput;
import org.apache.mina.filter.codec.ProtocolEncoder;
import org.apache.mina.filter.codec.ProtocolEncoderAdapter;
import org.apache.mina.filter.codec.ProtocolEncoderOutput;
import org.apache.mina.transport.socket.nio.NioSocketConnector;


import android.util.Log;

public class SocketUtils{
	private MinaThread socketRun;
	private IoSession session;
	private SocketUtilsListener mSocketUtilsListener;
	private String ip;
	private int port;

	public SocketUtils(String ip, int port){
		this.ip = ip;
		this.port = port;
	}

	//创建连接线程
	public Runnable connect(){
		socketRun = new MinaThread(ip, port);
		return socketRun;
	}


	//写入byte数组
	public void write(byte[] data){
		if (session != null){
			session.write(IoBuffer.wrap(data));//关键,传递数组的关键
		}else{
			SocketUtilsLog("write:" + new String(data) + "出错");
		}
	}

	//是否连接状态
	public boolean isConnect(){
		if (session == null){
			return false;
		}
		return session.isConnected();
	}

	public void close(){
		if (session == null){
			return;
		}
		session.close();
	}

	//设置监听器
	void setSocketUtilsListener(SocketUtilsListener l){
		mSocketUtilsListener = l;
	}

	//自定义log
	void SocketUtilsLog(String str){
		Log.e("SocketUtilsLog", str);
	}


	public interface SocketUtilsListener{
		void sendOK();
		void ReceiveData(byte[]data);
		void disConnect();
		void connectOk();
		void connectErr(Exception e);
	}

	class MinaThread implements Runnable{
		private int port;
		private String ip;
		MinaThread(String ip, int port){
			this.ip = ip;
			this.port = port;
		}
		@Override
		public void run() {
			IoConnector connector = new NioSocketConnector();
			//设置链接超时时间
			connector.setConnectTimeoutMillis(30000);
			connector.getFilterChain().addLast("codec",
					new ProtocolCodecFilter(new ByteArrayCodecFactory()));
			connector.setHandler(new MinaClientHandler());
			connector.addListener(new IoServiceListener() {

				@Override
				public void sessionDestroyed(IoSession arg0) throws Exception {
					SocketUtilsLog("sessionDestroyed");
					if (mSocketUtilsListener != null){
						mSocketUtilsListener.disConnect();
					}
				}

				@Override
				public void sessionCreated(IoSession arg0) throws Exception {
					SocketUtilsLog("sessionCreated");
					if(mSocketUtilsListener != null){
						mSocketUtilsListener.connectOk();
					}
				}

				@Override
				public void serviceIdle(IoService arg0, IdleStatus arg1) throws Exception {
				}
				@Override
				public void serviceDeactivated(IoService arg0) throws Exception {
				}
				@Override
				public void serviceActivated(IoService arg0) throws Exception {
				}
			});
			try{
				ConnectFuture future = connector.connect(new InetSocketAddress(ip, port));//创建链接
				future.awaitUninterruptibly();// 等待连接创建完成
				session = future.getSession();
//				session.write(IoBuffer.wrap("start".getBytes()));
			}catch (Exception e){
				SocketUtilsLog("客户端链接异常..." + e.toString());
				if (mSocketUtilsListener != null){
					mSocketUtilsListener.connectErr(e);
				}
			}
		}
	}


	public class MinaClientHandler extends IoHandlerAdapter {
		@Override
		public void exceptionCaught(IoSession session, Throwable cause) throws Exception {
			SocketUtilsLog("客户端发生异常" + cause.getMessage());
			if (mSocketUtilsListener != null){

			}
			super.exceptionCaught(session, cause);
		}

		@Override
		public void messageReceived(IoSession session, Object message) throws Exception {
			byte[] bytes = (byte[])message;
//	        Log.e("messageReceived", "客户端接收到的信息为:" + new String (bytes));
			if (mSocketUtilsListener != null){
				mSocketUtilsListener.ReceiveData(bytes);
			}
			super.messageReceived(session, message);
		}

		@Override
		public void messageSent(IoSession session, Object message) throws Exception {
			super.messageSent(session, message);
		}
	}
	//编码
	public class ByteArrayEncoder extends ProtocolEncoderAdapter {

		@Override
		public void encode(IoSession session, Object message,
						   ProtocolEncoderOutput out){
			out.write(message);
			out.flush();
		}
	}
	//解码
	public class ByteArrayDecoder extends ProtocolDecoderAdapter {
		@Override
		public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out)
				throws Exception {
			int limit = in.limit();
			byte[] bytes = new byte[limit];
			in.get(bytes);
			out.write(bytes);
		}
	}

	//工厂
	public class ByteArrayCodecFactory implements ProtocolCodecFactory {
		private ByteArrayDecoder decoder;
		private ByteArrayEncoder encoder;
		public ByteArrayCodecFactory() {
			encoder = new ByteArrayEncoder();
			decoder = new ByteArrayDecoder();
		}
		@Override
		public ProtocolDecoder getDecoder(IoSession session) throws Exception {
			return decoder;
		}
		@Override
		public ProtocolEncoder getEncoder(IoSession session) throws Exception {
			return encoder;
		}
	}

}










评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值