miduo_server/test/src/main/java/network/client/NettyTCPClientHandler.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);
}
}