168 lines
5.3 KiB
Java
168 lines
5.3 KiB
Java
package network.client;
|
|
|
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
|
import com.google.protobuf.GeneratedMessage;
|
|
import com.google.protobuf.GeneratedMessageLite;
|
|
import com.google.protobuf.MessageLite;
|
|
import com.ljsd.jieling.netty.cocdex.PacketNetData;
|
|
import com.ljsd.jieling.netty.cocdex.Tea;
|
|
import io.netty.channel.Channel;
|
|
import io.netty.channel.ChannelHandlerContext;
|
|
import io.netty.channel.SimpleChannelInboundHandler;
|
|
import io.netty.handler.timeout.IdleStateEvent;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.concurrent.BlockingDeque;
|
|
import java.util.concurrent.LinkedBlockingDeque;
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
|
|
/**
|
|
* Created by justin on 14-8-12.
|
|
*/
|
|
public class NettyTCPClientHandler extends SimpleChannelInboundHandler<Object> {
|
|
private static final Logger LOGGER = LoggerFactory.getLogger(NettyTCPClientHandler.class);
|
|
private volatile Channel channel;
|
|
private final BlockingDeque<PacketNetData> answer = new LinkedBlockingDeque<PacketNetData>();
|
|
private final Object object = new Object();
|
|
private static AtomicInteger atomicInteger = new AtomicInteger();
|
|
|
|
public AtomicInteger getAtomicInteger() {
|
|
return atomicInteger;
|
|
}
|
|
|
|
public Object getObject() {
|
|
return object;
|
|
}
|
|
|
|
public void sendRequestNew(PacketNetData request){
|
|
channel.writeAndFlush(request);
|
|
}
|
|
|
|
public BlockingDeque<PacketNetData> getAnswer() {
|
|
return answer;
|
|
}
|
|
|
|
public Channel getChannel() {
|
|
return channel;
|
|
}
|
|
|
|
public List<PacketNetData> sendRequest(MessageLite request) {
|
|
channel.writeAndFlush(request);
|
|
ArrayList<PacketNetData> msgs = new ArrayList<PacketNetData>();
|
|
// boolean interrupted = false;
|
|
try {
|
|
Thread.sleep(1000);
|
|
for (PacketNetData gameMessage1: answer){
|
|
gameMessage1 = answer.take();
|
|
msgs.add(gameMessage1);
|
|
}
|
|
} catch (InterruptedException e) {
|
|
LOGGER.error("sendRequest->msg={}", e.getMessage(), e);
|
|
}
|
|
return msgs;
|
|
|
|
}
|
|
|
|
|
|
public void sendRequest_jieling( byte[] finalMessage) {
|
|
channel.writeAndFlush(finalMessage);
|
|
}
|
|
|
|
|
|
public List<PacketNetData> sendHeartBeat_jieling() {
|
|
|
|
byte[] finalMessage = makeHeartBeatMessage();
|
|
|
|
channel.writeAndFlush(finalMessage);
|
|
ArrayList<PacketNetData> msgs = new ArrayList<PacketNetData>();
|
|
return msgs;
|
|
|
|
}
|
|
|
|
|
|
private byte[] makeHeartBeatMessage() {
|
|
byte[] packetData = new byte[12];
|
|
Tea.intToByte(packetData, 0, 10000001);
|
|
Tea.intToByte(packetData, 4, 543242);
|
|
Tea.intToByte(packetData, 8, 1000);
|
|
int[] secretKey = Tea.KEY;
|
|
byte[] finalData = Tea.encrypt2(packetData, secretKey);
|
|
|
|
return finalData;
|
|
}
|
|
|
|
|
|
@Override
|
|
public void channelRegistered(ChannelHandlerContext ctx) {
|
|
channel = ctx.channel();
|
|
}
|
|
|
|
@Override
|
|
protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
|
|
// atomicInteger.getAndIncrement();
|
|
// answer.add((PacketNetData)msg);
|
|
PacketNetData packetNetData = new PacketNetData((byte[])msg);
|
|
int userId = packetNetData.getUserId();
|
|
int token = packetNetData.getToken();
|
|
int msgId = packetNetData.getMsgId();
|
|
byte[] packetData = packetNetData.getPacketData();
|
|
|
|
|
|
|
|
System.out.println("back hartbeat id : "+msgId);
|
|
|
|
//System.out.println(JsonFormat.printToString());
|
|
|
|
// int msgIndex = packetNetData.getIndex();
|
|
// int resultCode = packetNetData.getResult();
|
|
// byte[] backmessage = packetNetData.parseServerProtoNetData();
|
|
|
|
// PlayerInfoProto.PlayerInfo.GetPlayerInfoResponse getPlayerInfoResponse
|
|
// = PlayerInfoProto.PlayerInfo.GetPlayerInfoResponse.parseFrom(backmessage);
|
|
|
|
// LOGGER.info("serverBack processMessage->uid={},token={},msgId={},msgIndex={},resultCode={}" +
|
|
// ",backMessageRank={},backMessageFamily={},backMessageSex={}",
|
|
// userId, token,msgId,msgIndex,resultCode,getPlayerInfoResponse.getRank(),
|
|
// getPlayerInfoResponse.getFamily(),getPlayerInfoResponse.getSex());
|
|
}
|
|
|
|
|
|
/**
|
|
* 发送心跳包
|
|
*
|
|
* @param ctx
|
|
*/
|
|
private void sendHeartbeatPacket(ChannelHandlerContext ctx) {
|
|
// GameProto.GameMessage gameMessage = GameProto.GameMessage.newBuilder().setMessageType(MessageTypeProto.MessageType.HEART_BEAT_PACKAET).build();
|
|
// ctx.writeAndFlush(gameMessage);
|
|
}
|
|
|
|
|
|
@Override
|
|
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
|
|
if (evt instanceof IdleStateEvent) {
|
|
// 不管是读事件空闲还是写事件空闲都向服务器发送心跳包
|
|
sendHeartbeatPacket(ctx);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
|
|
cause.printStackTrace();
|
|
ctx.close();
|
|
}
|
|
|
|
@Override
|
|
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
|
|
LOGGER.debug("closed...");
|
|
}
|
|
|
|
@Override
|
|
public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
|
|
super.channelReadComplete(ctx);
|
|
}
|
|
}
|