在实验室写项目时,需要使用tcp的连接以及发送心跳给后台,还需接收后台给的数据,还可以给后台发送数据
1、先去写了很多的后台发送数据来我们去编解码
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;
}
//编码
public class ByteArrayEncoder extends ProtocolEncoderAdapter {
@Override
public void encode(IoSession session, Object message, ProtocolEncoderOutput out) {
out.write(message);
Log.d("check send", "encode: "+message.toString());
out.flush();
}
}
private final static Charset charset = Charset.forName("UTF-8");
// 可变的IoBuffer数据缓冲区
private IoBuffer buff = IoBuffer.allocate(100).setAutoExpand(true);
//解码
public class ByteArrayDecoder extends ProtocolDecoderAdapter {
@Override
public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out)
throws Exception {
while (in.hasRemaining()) {
byte b = in.get();
switch (b){
case 'n':
buff.flip();
byte[] bytes = new byte[buff.limit()];
buff.get(bytes);
Log.e("+++++++解码器打印+++++++:" ,new String(bytes));
out.write(bytes);
buff.clear();
break;
default:
buff.put(b);
}
}
}
}
}
2、写了去捕获后台给我们发送到的数据
@Override
public void exceptionCaught(IoSession arg0, Throwable arg1) throws Exception {
System.out.println("捕获客户端发送信息异常....:" + arg0.getId() + ";Throwable:" + arg1.getMessage());
}
@Override
public void inputClosed(IoSession arg0) throws Exception {
arg0.closeNow(); // 不发心跳时:加上该句。有心跳时可以不用加。
}
3、写了发送心跳包的方法
@Override
public boolean isRequest(IoSession session, Object message) {
//如果是服务器发送过来的心跳包, return true后会在 getResponse() 方法中处理心跳包.
if (message instanceof IoBuffer) {
iobuffermessage = (IoBuffer) message;
b = new byte[iobuffermessage.limit()];
iobuffermessage.get(b);
if (iobuffermessage.remaining() == iobuffermessage.limit()) {
b = new byte[iobuffermessage.limit()];
iobuffermessage.get(b);
}
if (new String(b) == minaConfig.getHeartone()) {
return true;
}
}
else if (message instanceof byte[] && new String((byte[]) message).equals(minaConfig.getHeartone())) {
return true;
}
return false;
}
/**
* 判断是否是心跳响应包,不管是对方的,还是自己的
*/
@Override
public boolean isResponse(IoSession session, Object message) {
//如果是客户端主动向服务器发起的心跳包, return true, 该框架会发送 getRequest() 方法返回的心跳包内容.
if (message instanceof IoBuffer) {
iobuffermessage = (IoBuffer) message;
if (iobuffermessage.remaining() == iobuffermessage.limit()) {
b = new byte[iobuffermessage.limit()];
iobuffermessage.get(b);
}
if (new String(b) == minaConfig.getHearttwo()) {
return true;
}
return true;
} else if (message instanceof byte[] && new String((byte[]) message).equals(minaConfig.getHearttwo())) {
return true;
}
return false;
}
4、开始去创建连接
rivate boolean createConnect() {
if (nioSocketConnector == null) {
nioSocketConnector = new NioSocketConnector();
} else {
nioSocketConnector.dispose();// 关闭原有的连接器
nioSocketConnector = new NioSocketConnector();
}
if (keepAliveFilter == null) {
keepAliveFilter = new KeepAliveFilter(new MinaKeepAliveFilter(minaConfig), IdleStatus.BOTH_IDLE, KeepAliveRequestTimeoutHandler.DEAF_SPEAKER);
/*
* IdleStatus参数为 READER_IDLE
* ,及表明如果当前连接的读通道空闲的时候在指定的时间间隔getRequestInterval后发送出心跳请求,以及发出Idle事件。
* KeepAliveRequestTimeoutHandler设置为CLOS表明, 当发出的心跳请求在规定时间内没有接受到反馈的时候则调用CLOSE方式关闭连接
* KeepAliveRequestTimeoutHandler设置为DEAF_SPEAKER表明,不需要发心跳
*/
// keepAliveFilter.setForwardEvent(true);// 继续调用 IoHandlerAdapter 中的 sessionIdle时间
// keepAliveFilter.setRequestInterval(minaConfig.getHeartsendTime());// 设置心跳发送时间间隔/s
// keepAliveFilter.setRequestTimeout(minaConfig.getHeartTimeout());// 设置心跳判断的超时时间/s
// keepAliveFilter.setRequestTimeoutHandler(new MinaKeepAliveRequestTimeoutHandler());// 设置超时的逻辑处理类
}
try {
isconnect = false;
nioSocketConnector = new NioSocketConnector();
nioSocketConnector.setConnectTimeoutMillis(minaConfig.getConnectTimeout());// 设置连接超时时间/ms
nioSocketConnector.getSessionConfig().setReadBufferSize(minaConfig.getReadbufferSize());// 设置接收缓冲区大小/b
loggingFilter = new LoggingFilter();
loggingFilter.setExceptionCaughtLogLevel(LogLevel.DEBUG);
loggingFilter.setMessageReceivedLogLevel(LogLevel.DEBUG);
loggingFilter.setMessageSentLogLevel(LogLevel.DEBUG);
loggingFilter.setSessionClosedLogLevel(LogLevel.DEBUG);
loggingFilter.setSessionCreatedLogLevel(LogLevel.DEBUG);
loggingFilter .setSessionIdleLogLevel(LogLevel.DEBUG);
loggingFilter. setSessionOpenedLogLevel(LogLevel.DEBUG);
nioSocketConnector.getFilterChain().addFirst("logger", loggingFilter);
nioSocketConnector.getFilterChain().addFirst("codec", new ProtocolCodecFilter(new ByteArrayCodecFactory()));//添加字符过滤器
nioSocketConnector.getFilterChain().addLast("keepalive", keepAliveFilter);
nioSocketConnector.setHandler(new MinaClientHandler(minaConfig.getiReceived(), this));// 消息处理
// nioSocketConnector.addListener(new MinaServiceListener());//服务监听
connectFuture = nioSocketConnector.connect(new InetSocketAddress(minaConfig.getHost(), minaConfig.getPort()));// 创建连接
connectFuture.awaitUninterruptibly();// 等待连接
ioSession = connectFuture.getSession();
isconnect = true;
System.out.println("连接成功!");
} catch (Exception e) {
e.printStackTrace();
isconnect = false;
}
return isconnect;
}
/**
* 连接
*/
public void connect() {
new Thread() {
@Override
public void run() {
super.run();
int i = 1;
System.out.println("Thread:" + Thread.currentThread().getName());
while (!createConnect()) {
System.out.println("正在尝试第" + i + "次连接...");
try {
Thread.sleep(2000);
i++;
} catch (Exception e) {
e.printStackTrace();
}
}
checkQueue();
}
}.start();
}
在这里就是连接没有建立上,一直陷入死循环,直到连接成功
5、开始进行连接
IReceived iReceived = new IReceived() {
@Override
public void received(String str) {
Log.e("接收的数据", str);
try {
JSONObject jsonObject = JSONObject.parseObject(str);
String getResponse = jsonObject.getString("response");
if (jsonObject.getString("cmd").equals("imgRequest")) {
Thread.sleep(1000);
minaManager.send1(sendManager());
} else {
}
} catch (Exception e) {
Log.e("HomeActivity", "主界面接收数据,类型转换错误");
}
}
};
// Log.e("接收的数据", "2222222222222");
MinaConfig minaConfig = new MinaConfig.Builder()
// .heartone_heartwo(JSON.toJSONString(map2), JSON.toJSONString(map)) 去掉心跳
.host(RetrofitHelper.getIP(), RetrofitHelper.getMinaPort())
.iReceived(iReceived)
.create();
minaManager = MinaManager.getInstence(minaConfig);
minaManager.connect();
最后
以上就是精明大白最近收集整理的关于Android使用mina传输数据以及发送心跳,有重连机制的全部内容,更多相关Android使用mina传输数据以及发送心跳内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复