具体使用的包可以参考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; } } }