Android 는 Netty 를 기반으로 socketClient Twing 을 제거합니다.
인터넷에서 관련 데모와jar 패키지를 찾아 Netty로 구덩이를 메우는 길을 열었다.
Jar 패키지 다운로드 경로: 다운로드 주소는 물론 이 점수가 좀 높습니다. 이것은 제가 인터넷에서 찾은 것입니다.점수가 없으면 댓글이나 메일로 보내주세요([email protected])
사용 및 겪는 문제에 관하여: 1. 코딩 문제에 주의한다.코딩 문제에 주의하고 코딩 문제에 반드시 주의해야 한다.
데이터 전송 코딩 문제에 관해서는 반드시 서버에 따라 실현해야 한다는 것을 주의해야 한다.그렇지 않으면 서버의 데이터를 받을 수 있지만 보내는 데이터는 서버가 받지 못하거나 서버가 클라이언트가 보내는 데이터를 받을 수 있지만 클라이언트는 아무런 메시지도 받지 못한다.
2. 다음 코드는 인터넷에서 한 작은 형의 코드를 참고하여 만든 것이다.웹 주소를 저장하지 않았기 때문에 링크를 첨부할 수 없습니다. 대단히 죄송합니다.
실현 부분
NettyListener 는 가상 인터페이스의 상수를 정의하는 데 사용됩니다.
package com.example.lijinyi.*.*.api.socketApi;
/**
* author : lijinyi
* e-mail : [email protected]
* date : 2019/9/2516:11
* desc :
* version: 1.0
*/
public interface NettyListener {
byte STATUS_CONNECT_SUCCESS = 1;//
byte STATUS_CONNECT_CLOSED = 0;//
byte STATUS_CONNECT_ERROR = 0;//
int STATUS_SUCCESS = 0;
int STATUS_ERROR = 1;
//
int ADD_LIB = 1;
int CHG_LIB = 2;
int DEL_LIB = 3;
//
int ADD_FACE = 4;
int CHG_FACE = 5;
int DEL_FACE = 6;
/**
*
*/
void onMessageResponse(int statusCode,Object msg);
/**
*
*/
void onServiceStatusConnectChanged(int statusCode);
}
NettyClient 코드는 인터럽트 재연결과 심장 박동을 실현했다
package com.example.lijinyi.*.*.manager;
import com.example.lijinyi.*.*.api.socketApi.NettyListener;
/**
* author : lijinyi
* e-mail : [email protected]
* date : 2019/9/2516:12
* desc :
* version: 1.0
*/
public class NettyClient {
private static final String TAG = "NettyClient";
private EventLoopGroup group;//Bootstrap
private NettyListener listener;//
private Channel channel;//
private boolean isConnect = false;//
private static int reconnectNum = Integer.MAX_VALUE;//
private boolean isNeedReconnect = true;//
private boolean isConnecting = false;//
private long reconnectIntervalTime = 5000;//
public String host;//ip
public int tcp_port;//
/*
ip
*/
public NettyClient(String host, int tcp_port) {
this.host = host;
this.tcp_port = tcp_port;
}
/*
*/
public void connect() {
if (isConnecting) {
return;
}
//
Thread clientThread = new Thread("client-Netty") {
@Override
public void run() {
super.run();
isNeedReconnect = true;
reconnectNum = Integer.MAX_VALUE;
connectServer();
}
};
clientThread.start();
}
//
private void connectServer() {
synchronized (NettyClient.this) {
ChannelFuture channelFuture = null;//
if (!isConnect) {
isConnecting = true;
group = new NioEventLoopGroup();// group
Bootstrap bootstrap = new Bootstrap().group(group)//
.option(ChannelOption.TCP_NODELAY, true)// Nagle
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() { // 5
@Override
public void initChannel(SocketChannel ch) throws Exception {
// 。
ch.pipeline().addLast(new StringDecoder());//
ch.pipeline().addLast(new StringEncoder());
ch.pipeline().addLast(new ReadTimeoutHandler(60));//
ch.pipeline().addLast(new HttpRequestEncoder());// httpRequest
ch.pipeline().addLast(new HttpResponseDecoder());// httpresopnse
ch.pipeline().addLast(new HttpRequestDecoder());
ch.pipeline().addLast(new HttpResponseEncoder());
ch.pipeline().addLast(new NettyClientHandler(listener));// handlerAdapter
}
});
try {
//
channelFuture = bootstrap.connect(host, tcp_port).addListener(new ChannelFutureListener() {
@Override
public void operationComplete(ChannelFuture channelFuture) throws Exception {
if (channelFuture.isSuccess()) {
Log.e(TAG, " ");
isConnect = true;
channel = channelFuture.channel();
} else {
Log.e(TAG, " ");
isConnect = false;
}
isConnecting = false;
}
}).sync();
//
channelFuture.channel().closeFuture().sync();
Log.e(TAG, " ");
} catch (Exception e) {
e.printStackTrace();
} finally {
isConnect = false;
listener.onServiceStatusConnectChanged(NettyListener.STATUS_CONNECT_CLOSED);//STATUS_CONNECT_CLOSED
if (null != channelFuture) {
if (channelFuture.channel() != null && channelFuture.channel().isOpen()) {
channelFuture.channel().close();
}
}
group.shutdownGracefully();
reconnect();//
}
}
}
}
//
public void disconnect() {
Log.e(TAG, "disconnect");
isNeedReconnect = false;
group.shutdownGracefully();
}
//
public void reconnect() {
Log.e(TAG, "reconnect");
if (isNeedReconnect && reconnectNum > 0 && !isConnect) {
reconnectNum--;
SystemClock.sleep(reconnectIntervalTime);
if (isNeedReconnect && reconnectNum > 0 && !isConnect) {
Log.e(TAG, " ");
connectServer();
}
}
}
// 。
public boolean sendMsgHeartToServer(String data, String sUri, ChannelFutureListener listener) {
boolean flag = channel != null && isConnect;
try {
if (flag) {
URI uri = new URI(sUri);
ByteBuf byteBuf = Unpooled.wrappedBuffer(data.getBytes(StandardCharsets.UTF_8));
FullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, uri.toASCIIString(), byteBuf);
request.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE);
request.headers().set(HttpHeaderNames.CONTENT_LENGTH, request.content().readableBytes());
request.headers().set(HttpHeaderNames.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON);
channel.writeAndFlush(request).addListener(listener).sync();
}
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
//
public void setReconnectNum(int reconnectNum) {
NettyClient.reconnectNum = reconnectNum;
}
public void setReconnectIntervalTime(long reconnectIntervalTime) {
this.reconnectIntervalTime = reconnectIntervalTime;
}
//
public boolean getConnectStatus() {
return isConnect;
}
public boolean isConnecting() {
return isConnecting;
}
public void setConnectStatus(boolean status) {
this.isConnect = status;
}
public void setListener(NettyListener listener) {
this.listener = listener;
}
}
이 부분의 코드는 실제적으로 하나의 라인을 시작해서 socket 운행을 실현하고 심장 박동을 통해 발송의 성공 여부를 판단하여 표지 위치를 설정하여 끊어진 라인의 재연결 효과를 실현한다.
NettyClientHandler 관련 코드
package com.example.lijinyi.*.*.manager;
/**
* author : lijinyi
* e-mail : [email protected]
* date : 2019/9/2516:23
* desc :
* version: 1.0
*/
public class NettyClientHandler extends ChannelInboundHandlerAdapter {
private static final String TAG = "NettyClientHandler";
private NettyListener listener;
//
private LibInfoDao libManagerDao = null;
private FaceInfoDao faceManagerDao = null;
private FaceEnvironment environment = null;
private JSONObject object;
private int statuCode = -1;
private String strStatu = "";
public NettyClientHandler(NettyListener listener) {
this.listener = listener;
}
// , ---
//
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
if (evt instanceof IdleStateEvent) {
IdleStateEvent event = (IdleStateEvent) evt;
if (event.state() == IdleState.WRITER_IDLE) {
ctx.channel().writeAndFlush("Heartbeat" + System.getProperty("line.separator"));
}
}
}
/**
*
*/
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
Log.e(TAG, "channelActive");
super.channelActive(ctx);
listener.onServiceStatusConnectChanged(NettyListener.STATUS_CONNECT_SUCCESS);
}
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
super.channelInactive(ctx);
Log.e(TAG, "channelInactive");
}
// , activity
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
// 。
System.out.println(" " + " " + msg.toString());
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
// 。
Log.e(TAG, "exceptionCaught");
listener.onServiceStatusConnectChanged(NettyListener.STATUS_CONNECT_ERROR);
cause.printStackTrace();
ctx.close();
}
}
전체 Netty 구현 클라이언트의 주요 주의점은 코딩 문제입니다. channel Read () 는 데이터를 수신하고 write AndFlush () 는 데이터를 발송합니다.다른 것도 신경 쓸 게 없어요.
그럼 이렇게 됐어, 파이팅~
ヾ(◍°∇°◍)ノ゙
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.