package evanq.game.net;
import io.netty.channel.Channel;
import evanq.game.concurrent.loop.ICommand;
import evanq.game.trace.LogSystem;
import evanq.game.trace.Trace;
import evanq.game.trace.TraceConstant;
/**
*
*
* @author Evan cppmain@gmail.com
*
*/
class NettyNetConnectionManagerAdaptor {
private Trace logger = LogSystem.getDefaultTrace(TraceConstant.CONNECTION);
private AbstractNetConnectionManager netConnectionManager;
private AbstractNettyChannelInitializer channelInitializer;
NettyNetConnectionManagerAdaptor(AbstractNetConnectionManager netConnectionManager,AbstractNettyChannelInitializer channelInitializer){
this.netConnectionManager = netConnectionManager;
this.channelInitializer = channelInitializer;
}
//控制是否在单线程中执行业务
private static final boolean COMMAND_ON_SINGLE_THREAD = true;
public void accpet(Channel channel){
NewChannelAcceptCommand command = new NewChannelAcceptCommand();
command.channel = channel;
if (COMMAND_ON_SINGLE_THREAD) {
netConnectionManager.singleThread().accept(command);
}else{
command.execute();
}
}
public void close(Channel channel){
delayClose(channel,false);
}
/**
*
* @param channel
* @param delayClose true enable delay close
*/
public void delayClose(Channel channel,boolean delayClose){
ChannelDeActiveCommand command = new ChannelDeActiveCommand();
command.channel = channel;
command.delayClose=delayClose;
if (COMMAND_ON_SINGLE_THREAD) {
netConnectionManager.singleThread().accept(command);
}else{
command.execute();
}
}
public void broken(Channel channel){
delayClose(channel,true);
}
public void initChannel(NetConnectionType type, Channel channel){
try {
channelInitializer.enableChannel(type, channel);
} catch (Exception e) {
e.printStackTrace();
}
}
public void message(Channel channel, IPacket msg){
ChannelMessageCommand command = new ChannelMessageCommand();
command.channel = channel;
command.msg = msg;
if (COMMAND_ON_SINGLE_THREAD) {
netConnectionManager.singleThread().accept(command);
}else{
command.execute();
}
}
//TODO 是否使用单线程来管理连接
class NewChannelAcceptCommand implements ICommand{
Channel channel;
@Override
public void execute() {
logger.info("A dummy NetConnection Accepted with Channel:{}",channel);
NettyConnection nc = new NettyConnection(channel, NetConnectionType.DUMMY);
AbstractNettyChannelInitializer.set(channel,nc);
nc.addPropertyChangeListener(channelInitializer);
INetConnectionFSM fsm = netConnectionManager.createNetConnectionFSM(nc);
fsm.fireEvent(NetConnectionEvent.CREATE_OK);
}
}
//TODO 断开连接
class ChannelDeActiveCommand implements ICommand {
Channel channel;
boolean delayClose=false;
@Override
public void execute() {
NettyConnection iNetConnection = AbstractNettyChannelInitializer.get(channel);
if (null != iNetConnection) {
if(delayClose){
iNetConnection.fsm().fireEvent(NetConnectionEvent.DELAYED_CLOSE);
}else{
iNetConnection.fsm().fireEvent(NetConnectionEvent.CLOSE);
}
}
iNetConnection.removePropertyChangeListener(channelInitializer);
}
}
class ChannelMessageCommand implements ICommand{
Channel channel;
IPacket msg;
@Override
public void execute() {
INetConnection iNetConnection = AbstractNettyChannelInitializer.get(channel);
if(null != iNetConnection){
//try 防止异常崩坏线程
try{
msg.connection(iNetConnection);
msg.execute();
}catch(Exception e){
e.printStackTrace();
}
}else{
throw new NullPointerException("不能到达这里");
}
}
}
}