├── .gitignore ├── README ├── gserver-core ├── .gitignore ├── pom.xml └── src │ └── main │ ├── java │ └── org │ │ └── gserver │ │ └── core │ │ ├── exception │ │ └── GsException.java │ │ ├── handler │ │ └── IHandler.java │ │ ├── net │ │ ├── Header.java │ │ ├── Message.java │ │ └── codec │ │ │ ├── Decoder.java │ │ │ ├── Encoder.java │ │ │ ├── HeaderDecoder.java │ │ │ ├── HeaderEncoder.java │ │ │ ├── decoder │ │ │ └── ProtobufDecoder.java │ │ │ └── encoder │ │ │ └── ProtobufEncoder.java │ │ ├── server │ │ ├── AbstractServer.java │ │ ├── config │ │ │ ├── ClientServerConfig.java │ │ │ ├── Config.java │ │ │ ├── ServerConfig.java │ │ │ └── ServerInfo.java │ │ ├── impl │ │ │ ├── ClientServer.java │ │ │ └── Server.java │ │ └── loader │ │ │ ├── ClientServerConfigXmlLoader.java │ │ │ └── ServerConfigXmlLoader.java │ │ ├── threadPool │ │ ├── AbstractWork.java │ │ ├── executor │ │ │ ├── NonOrderedQueuePoolExecutor.java │ │ │ └── OrderedQueuePoolExecutor.java │ │ └── struts │ │ │ ├── OrderedQueuePool.java │ │ │ └── TasksQueue.java │ │ └── util │ │ ├── ChannelPoolManager.java │ │ ├── SessionChannelManager.java │ │ └── SessionUtil.java │ └── resources │ └── log4j.properties ├── gserver-db ├── .gitignore ├── pom.xml └── src │ └── main │ ├── java │ └── org │ │ └── gserver │ │ └── db │ │ ├── IMysqlJdbcTemplate.java │ │ ├── MysqlJdbcTemplate.java │ │ └── accessor │ │ ├── AbstractMysqlAccessor.java │ │ ├── IMysqlAccessor.java │ │ ├── JdbcFactory.java │ │ ├── MysqlAccessor.java │ │ └── SQLUtil.java │ └── resources │ └── gs-mysql.xml ├── gserver-distribution ├── .gitignore ├── assembly.xml ├── pom.xml ├── shell │ ├── all-shutdown.bat │ └── all-startup.bat └── src │ └── main │ └── java │ └── org │ └── gserver │ └── distribution │ └── App.java ├── gserver-gate ├── .gitignore ├── gate-config │ ├── connect-app-config.xml │ └── server-config.xml ├── pom.xml ├── shell │ └── gate-startup.bat └── src │ ├── main │ ├── java │ │ └── org │ │ │ └── gserver │ │ │ ├── GateStart.java │ │ │ └── gate │ │ │ ├── ChannelCloseListener.java │ │ │ ├── GateHandler.java │ │ │ ├── GatePipelineFactory.java │ │ │ ├── GateServer.java │ │ │ └── clientServer │ │ │ ├── ConnectAppServer.java │ │ │ ├── ConnectHandler.java │ │ │ └── ConnectPipelineFactory.java │ └── resources │ │ ├── gs-application.xml │ │ └── log4j.properties │ └── test │ └── java │ └── org │ └── gserver │ └── test │ ├── Client.java │ └── ClientHandler.java ├── gserver-logic ├── .gitignore ├── logic-config │ └── server-config.xml ├── pom.xml ├── shell │ └── logic-startup.bat └── src │ └── main │ ├── java │ └── org │ │ └── gserver │ │ ├── LogicStart.java │ │ ├── handler │ │ └── Handler100001.java │ │ └── logic │ │ ├── LogicHandler.java │ │ ├── LogicPipelineFactory.java │ │ └── LogicServer.java │ └── resources │ ├── gs-handlers.xml │ └── log4j.properties ├── gserver-redis ├── .gitignore ├── pom.xml └── src │ └── main │ ├── java │ └── org │ │ └── gserver │ │ └── redis │ │ ├── IRedisTemplateMethod.java │ │ ├── RedisTemplateMethod.java │ │ ├── accessor │ │ ├── AbstractRedisAccessor.java │ │ ├── IRedisAccessor.java │ │ ├── RedisAccessor.java │ │ └── RedisFactory.java │ │ ├── persistence │ │ ├── AbstractRedisBean.java │ │ └── RedisBeanField.java │ │ └── util │ │ ├── BeanUtil.java │ │ └── KeyUtil.java │ └── resources │ ├── gs-context.xml │ ├── gs-redis.xml │ └── redis.properties ├── gserver-services ├── .gitignore ├── pom.xml └── src │ └── main │ ├── java │ ├── org │ │ └── gserver │ │ │ ├── dao │ │ │ ├── BaseDao.java │ │ │ ├── IBaseDao.java │ │ │ └── IRedisKey.java │ │ │ ├── handler │ │ │ └── AbstractHandler.java │ │ │ ├── services │ │ │ ├── SendMessageService.java │ │ │ └── SessionService.java │ │ │ └── util │ │ │ ├── CommandEnum.java │ │ │ ├── CommandEnumUtil.java │ │ │ ├── Components.java │ │ │ ├── ErrorCode.java │ │ │ ├── ServerType.java │ │ │ └── SpringContainer.java │ └── protocol │ │ ├── BaseType.java │ │ ├── ClientServerProtocol.java │ │ └── ServerClientProtocol.java │ └── resources │ └── gs-service.xml └── pom.xml /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /logs 3 | /.settings -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | 服务: 2 | gserver-gate:网关服务器 3 | gserver-logic:逻辑服务器 4 | 5 | 公用类: 6 | gserver-core:核心类 7 | gserver-redis:redis缓存管理 8 | gserver-services:逻辑类 9 | gserver-db:mysql数据库管理 10 | 11 | 打包: 12 | gserver-distribute:打包程序,路径/target目录下 13 | -------------------------------------------------------------------------------- /gserver-core/.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /logs 3 | /.settings -------------------------------------------------------------------------------- /gserver-core/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.gserver 8 | gserver 9 | 0.0.1-SNAPSHOT 10 | 11 | gserver-core 12 | 13 | gserver-core 14 | http://maven.apache.org 15 | 16 | UTF-8 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/exception/GsException.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.exception; 2 | 3 | public class GsException extends Exception { 4 | 5 | private static final long serialVersionUID = 1L; 6 | private int errorCode; 7 | private String message; 8 | 9 | public GsException(int errorCode) { 10 | this.errorCode = errorCode; 11 | } 12 | 13 | public GsException(int errorCode, String message) { 14 | super(message); 15 | this.message = message; 16 | this.errorCode = errorCode; 17 | } 18 | 19 | public String getMessage() { 20 | return message; 21 | } 22 | 23 | public void setMessage(String message) { 24 | this.message = message; 25 | } 26 | 27 | public int getErrorCode() { 28 | return errorCode; 29 | } 30 | 31 | public void setErrorCode(int errorCode) { 32 | this.errorCode = errorCode; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/handler/IHandler.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.handler; 2 | 3 | import org.gserver.core.exception.GsException; 4 | import org.gserver.core.net.Message; 5 | 6 | import com.google.protobuf.InvalidProtocolBufferException; 7 | 8 | public interface IHandler { 9 | /** 10 | * 业务处理方法 11 | * 12 | * @param request 13 | * 客户端请求 14 | */ 15 | abstract public void execute(Message request) throws GsException, 16 | InvalidProtocolBufferException; 17 | } 18 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/net/Header.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.net; 2 | 3 | /** 4 | * 请求和返回的头文件 5 | * 6 | * @author zhaohui 7 | * 8 | */ 9 | public class Header implements Cloneable { 10 | /** 数据编码格式。已定义:0:UTF-8,1:GBK,2:GB2312,3:ISO8859-1 **/ 11 | private byte encode; 12 | /** 加密类型。0表示不加密 **/ 13 | private byte encrypt; 14 | /** 用于扩展协议。暂未定义任何值 **/ 15 | private byte extend1; 16 | /** 用于扩展协议。暂未定义任何值 **/ 17 | private byte extend2; 18 | /** 会话ID **/ 19 | private int sessionId; 20 | /** 数据包长 **/ 21 | private int length; 22 | /** 命令 **/ 23 | private int commandId; 24 | 25 | @Override 26 | public Header clone() { 27 | try { 28 | return (Header) super.clone(); 29 | } catch (CloneNotSupportedException e) { 30 | e.printStackTrace(); 31 | } 32 | return null; 33 | } 34 | 35 | public Header() { 36 | 37 | } 38 | 39 | public Header(int sessionid, int commandId) { 40 | this.encode = 0; 41 | this.encrypt = 0; 42 | this.sessionId = sessionid; 43 | this.commandId = commandId; 44 | } 45 | 46 | public Header(byte encode, byte encrypt, byte extend1, byte extend2, 47 | int sessionId, int length, int commandId) { 48 | this.encode = encode; 49 | this.encrypt = encrypt; 50 | this.extend1 = extend1; 51 | this.extend2 = extend2; 52 | this.sessionId = sessionId; 53 | this.length = length; 54 | this.commandId = commandId; 55 | } 56 | 57 | public byte getEncode() { 58 | return encode; 59 | } 60 | 61 | public void setEncode(byte encode) { 62 | this.encode = encode; 63 | } 64 | 65 | public byte getEncrypt() { 66 | return encrypt; 67 | } 68 | 69 | public void setEncrypt(byte encrypt) { 70 | this.encrypt = encrypt; 71 | } 72 | 73 | public byte getExtend1() { 74 | return extend1; 75 | } 76 | 77 | public void setExtend1(byte extend1) { 78 | this.extend1 = extend1; 79 | } 80 | 81 | public byte getExtend2() { 82 | return extend2; 83 | } 84 | 85 | public void setExtend2(byte extend2) { 86 | this.extend2 = extend2; 87 | } 88 | 89 | public int getSessionId() { 90 | return sessionId; 91 | } 92 | 93 | public void setSessionId(int sessionId) { 94 | this.sessionId = sessionId; 95 | } 96 | 97 | public int getLength() { 98 | return length; 99 | } 100 | 101 | public void setLength(int length) { 102 | this.length = length; 103 | } 104 | 105 | public int getCommandId() { 106 | return commandId; 107 | } 108 | 109 | public void setCommandId(int commandId) { 110 | this.commandId = commandId; 111 | } 112 | 113 | @Override 114 | public String toString() { 115 | return "header [encode=" + encode + ",encrypt=" + encrypt + ",extend1=" 116 | + extend1 + ",extend2=" + extend2 + ",sessionid=" + sessionId 117 | + ",length=" + length + ",commandId=" + commandId + "]"; 118 | } 119 | 120 | } 121 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/net/Message.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.net; 2 | 3 | /** 4 | * 消息 5 | * 6 | * @author zhaohui 7 | * 8 | */ 9 | public class Message { 10 | /** 头消息 **/ 11 | private Header header; 12 | /** 数据 **/ 13 | private Object data; 14 | 15 | public Message() { 16 | 17 | } 18 | 19 | public Message(Header header) { 20 | this.header = header; 21 | } 22 | 23 | public Message(Header header, Object data) { 24 | this.header = header; 25 | this.data = data; 26 | } 27 | 28 | public void setContent(int commandId, byte[] data) { 29 | header.setCommandId(commandId); 30 | this.data = data; 31 | } 32 | 33 | public int getSessionId() { 34 | return header.getSessionId(); 35 | } 36 | 37 | public Object getData() { 38 | return data; 39 | } 40 | 41 | public void setData(Object data) { 42 | this.data = data; 43 | } 44 | 45 | public Header getHeader() { 46 | return header; 47 | } 48 | 49 | public void setHeader(Header header) { 50 | this.header = header; 51 | } 52 | 53 | public int getCommand() { 54 | return getHeader().getCommandId(); 55 | } 56 | 57 | } 58 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/net/codec/Decoder.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.net.codec; 2 | 3 | import org.gserver.core.net.Message; 4 | import org.jboss.netty.channel.Channel; 5 | import org.jboss.netty.channel.ChannelHandlerContext; 6 | import org.jboss.netty.handler.codec.oneone.OneToOneDecoder; 7 | 8 | /** 9 | * 解码器 10 | * 11 | * 将二进制数据转换成需要的业务逻辑对象 12 | * @author zhaohui 13 | * 14 | */ 15 | public abstract class Decoder extends OneToOneDecoder { 16 | 17 | @Override 18 | protected Object decode(ChannelHandlerContext ctx, Channel channel, 19 | Object msg) throws Exception { 20 | if (!(msg instanceof Message)) { 21 | return msg; 22 | } 23 | Message message = (Message) msg; 24 | Object logicObj = transformData(message.getData()); 25 | message.setData(logicObj); 26 | return message; 27 | } 28 | 29 | /** 30 | * 将二进制数据转换成逻辑对象 31 | * 32 | * @param msg 33 | * 请求对象 34 | * @throws Exception 35 | */ 36 | protected abstract Object transformData(Object msg) throws Exception; 37 | 38 | } 39 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/net/codec/Encoder.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.net.codec; 2 | 3 | import org.gserver.core.net.Message; 4 | import org.jboss.netty.channel.Channel; 5 | import org.jboss.netty.channel.ChannelHandlerContext; 6 | import org.jboss.netty.handler.codec.oneone.OneToOneEncoder; 7 | 8 | /** 9 | * 编码器 10 | * @author zhaohui 11 | * 12 | */ 13 | public abstract class Encoder extends OneToOneEncoder { 14 | 15 | @Override 16 | protected Object encode(ChannelHandlerContext ctx, Channel channel, 17 | Object msg) throws Exception { 18 | Message message = (Message) msg; 19 | Object buffer = transformData(message.getData()); 20 | message.setData(buffer); 21 | return msg; 22 | } 23 | 24 | /** 25 | * 将逻辑对象转换成二进制数据 26 | * @param msg 27 | * @throws Exception 28 | */ 29 | protected abstract Object transformData(Object msg) throws Exception; 30 | 31 | } 32 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/net/codec/HeaderDecoder.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.net.codec; 2 | 3 | import org.gserver.core.net.Header; 4 | import org.gserver.core.net.Message; 5 | import org.jboss.netty.buffer.ChannelBuffer; 6 | import org.jboss.netty.channel.Channel; 7 | import org.jboss.netty.channel.ChannelHandlerContext; 8 | import org.jboss.netty.handler.codec.frame.CorruptedFrameException; 9 | import org.jboss.netty.handler.codec.frame.FrameDecoder; 10 | 11 | /** 12 | * 对包的头文件进行解码 13 | * header协议格式: 14 | * { 15 | * tag byte 协议头标志位 16 | * encode byte 17 | * encrypt byte 18 | * extend1 byte 19 | * extend2 byte 20 | * sessionid int 21 | * length int 22 | * commandId int 23 | * } 24 | * 25 | * @author zhaohui 26 | * 27 | */ 28 | public class HeaderDecoder extends FrameDecoder { 29 | 30 | /**头文件长度**/ 31 | public static final int HEAD_LENGHT = 17; 32 | /** 包头标志 **/ 33 | public static final byte PACKAGE_TAG = 0x01; 34 | 35 | @Override 36 | protected Object decode(ChannelHandlerContext ctx, Channel channel, 37 | ChannelBuffer buffer) throws Exception { 38 | if (buffer.readableBytes() < HEAD_LENGHT) { 39 | return null; 40 | } 41 | buffer.markReaderIndex(); 42 | byte tag = buffer.readByte(); 43 | if (tag != PACKAGE_TAG) { 44 | throw new CorruptedFrameException("非法协议包"); 45 | } 46 | byte encode = buffer.readByte(); 47 | byte encrypt = buffer.readByte(); 48 | byte extend1 = buffer.readByte(); 49 | byte extend2 = buffer.readByte(); 50 | int sessionid = buffer.readInt(); 51 | int length = buffer.readInt(); 52 | int commandId = buffer.readInt(); 53 | 54 | if (buffer.readableBytes() < length) { 55 | buffer.resetReaderIndex(); 56 | return null; 57 | } 58 | 59 | Header header = new Header(encode, encrypt, extend1, extend2, 60 | sessionid, length, commandId); 61 | Message message = new Message(header, buffer.readBytes(length).array()); 62 | 63 | return message; 64 | } 65 | 66 | } 67 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/net/codec/HeaderEncoder.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.net.codec; 2 | 3 | import org.gserver.core.net.Header; 4 | import org.gserver.core.net.Message; 5 | import org.jboss.netty.buffer.ChannelBuffer; 6 | import org.jboss.netty.buffer.ChannelBuffers; 7 | import org.jboss.netty.channel.Channel; 8 | import org.jboss.netty.channel.ChannelHandlerContext; 9 | import org.jboss.netty.handler.codec.oneone.OneToOneEncoder; 10 | 11 | /** 12 | * 对包的头文件进行编码 13 | * 14 | * @author zhaohui 15 | * 16 | */ 17 | public class HeaderEncoder extends OneToOneEncoder { 18 | 19 | @Override 20 | protected Object encode(ChannelHandlerContext ctx, Channel channel, 21 | Object msg) throws Exception { 22 | if (!(msg instanceof Message)) { 23 | return msg; 24 | } 25 | 26 | Message message = (Message) msg; 27 | byte[] buffer = (byte[]) message.getData(); 28 | Header header = message.getHeader(); 29 | 30 | ChannelBuffer allBuffer = ChannelBuffers.dynamicBuffer(); 31 | allBuffer.writeByte(HeaderDecoder.PACKAGE_TAG); 32 | allBuffer.writeByte(header.getEncode()); 33 | allBuffer.writeByte(header.getEncrypt()); 34 | allBuffer.writeByte(header.getExtend1()); 35 | allBuffer.writeByte(header.getExtend2()); 36 | allBuffer.writeInt(header.getSessionId()); 37 | allBuffer.writeInt(buffer.length); 38 | allBuffer.writeInt(header.getCommandId()); 39 | allBuffer.writeBytes(buffer); 40 | return allBuffer; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/net/codec/decoder/ProtobufDecoder.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.net.codec.decoder; 2 | 3 | import org.gserver.core.net.codec.Decoder; 4 | import org.jboss.netty.buffer.ChannelBuffer; 5 | import org.jboss.netty.buffer.ChannelBufferInputStream; 6 | 7 | import com.google.protobuf.ExtensionRegistry; 8 | import com.google.protobuf.MessageLite; 9 | 10 | /** 11 | * pb格式数据转换成业务逻辑对象 12 | * 13 | * @author zhaohui 14 | * 15 | */ 16 | public class ProtobufDecoder extends Decoder { 17 | 18 | private final MessageLite prototype; 19 | private final ExtensionRegistry extensionRegistry; 20 | 21 | public ProtobufDecoder(MessageLite prototype) { 22 | this(prototype, null); 23 | } 24 | 25 | public ProtobufDecoder(MessageLite prototype, 26 | ExtensionRegistry extensionRegistry) { 27 | if (prototype == null) { 28 | throw new NullPointerException("prototype"); 29 | } 30 | this.prototype = prototype.getDefaultInstanceForType(); 31 | this.extensionRegistry = extensionRegistry; 32 | } 33 | 34 | @Override 35 | protected Object transformData(Object msg) throws Exception { 36 | if (!(msg instanceof ChannelBuffer)) { 37 | return msg; 38 | } 39 | 40 | ChannelBuffer buf = (ChannelBuffer) msg; 41 | if (buf.hasArray()) { 42 | final int offset = buf.readerIndex(); 43 | if (extensionRegistry == null) { 44 | return prototype 45 | .newBuilderForType() 46 | .mergeFrom(buf.array(), buf.arrayOffset() + offset, 47 | buf.readableBytes()).build(); 48 | } else { 49 | return prototype 50 | .newBuilderForType() 51 | .mergeFrom(buf.array(), buf.arrayOffset() + offset, 52 | buf.readableBytes(), extensionRegistry).build(); 53 | } 54 | } else { 55 | if (extensionRegistry == null) { 56 | return prototype 57 | .newBuilderForType() 58 | .mergeFrom( 59 | new ChannelBufferInputStream( 60 | (ChannelBuffer) msg)).build(); 61 | } else { 62 | return prototype 63 | .newBuilderForType() 64 | .mergeFrom( 65 | new ChannelBufferInputStream( 66 | (ChannelBuffer) msg), extensionRegistry) 67 | .build(); 68 | } 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/net/codec/encoder/ProtobufEncoder.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.net.codec.encoder; 2 | 3 | import static org.jboss.netty.buffer.ChannelBuffers.wrappedBuffer; 4 | 5 | import org.gserver.core.net.codec.Encoder; 6 | 7 | import com.google.protobuf.MessageLite; 8 | 9 | 10 | /** 11 | * 业务逻辑对象转换成二进制数据 12 | * @author zhaohui 13 | * 14 | */ 15 | public class ProtobufEncoder extends Encoder { 16 | 17 | @Override 18 | protected Object transformData(Object msg) throws Exception { 19 | if (msg instanceof MessageLite) { 20 | return wrappedBuffer(((MessageLite) msg).toByteArray()); 21 | } 22 | if (msg instanceof MessageLite.Builder) { 23 | return wrappedBuffer(((MessageLite.Builder) msg).build() 24 | .toByteArray()); 25 | } 26 | return msg; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/server/AbstractServer.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.server; 2 | 3 | import org.apache.log4j.Logger; 4 | import org.gserver.core.server.config.Config; 5 | 6 | public abstract class AbstractServer implements Runnable { 7 | private int server_id; 8 | private String server_name; 9 | protected Config config; 10 | 11 | protected AbstractServer(Config serverConfig) { 12 | this.config = serverConfig; 13 | if (this.config != null) { 14 | init(); 15 | } 16 | } 17 | 18 | protected void init() { 19 | this.server_name = this.config.getName(); 20 | this.server_id = this.config.getId(); 21 | } 22 | 23 | @Override 24 | public void run() { 25 | Runtime.getRuntime().addShutdownHook( 26 | new Thread(new CloseByExit(this.server_name))); 27 | } 28 | 29 | public String getServerName() { 30 | return server_name; 31 | } 32 | 33 | public int getServerId() { 34 | return server_id; 35 | } 36 | 37 | protected abstract void stop(); 38 | 39 | /** 40 | * 服务器关闭的钩子 41 | * 42 | * @author zhaohui 43 | * 44 | */ 45 | private class CloseByExit implements Runnable { 46 | private Logger log = Logger.getLogger(CloseByExit.class); 47 | private String server_name; 48 | 49 | public CloseByExit(String server_name) { 50 | this.server_name = server_name; 51 | } 52 | 53 | @Override 54 | public void run() { 55 | AbstractServer.this.stop(); 56 | log.info(this.server_name + " Stop!"); 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/server/config/ClientServerConfig.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.server.config; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * 客戶端server 8 | * 9 | * 逻辑服务器经常去连的服务器:gateServer,worldServer,publicServer 此时逻辑服务器被称为clientServer 10 | * 11 | * @author zhaohui 12 | * 13 | */ 14 | public class ClientServerConfig extends Config { 15 | 16 | private List connectServers = new ArrayList(); 17 | 18 | public List getConnectServers() { 19 | return connectServers; 20 | } 21 | 22 | public void setConnectServers(List connectServers) { 23 | this.connectServers = connectServers; 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/server/config/Config.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.server.config; 2 | 3 | /** 4 | * 服务器配置 5 | * 6 | * @author zhaohui 7 | * 8 | */ 9 | public abstract class Config { 10 | private String name; 11 | private int id; 12 | 13 | public String getName() { 14 | return this.name; 15 | } 16 | 17 | public void setName(String name) { 18 | this.name = name; 19 | } 20 | 21 | public int getId() { 22 | return this.id; 23 | } 24 | 25 | public void setId(int id) { 26 | this.id = id; 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/server/config/ServerConfig.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.server.config; 2 | 3 | public class ServerConfig extends Config { 4 | 5 | private int port; 6 | 7 | public int getPort() { 8 | return this.port; 9 | } 10 | 11 | public void setPort(int port) { 12 | this.port = port; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/server/config/ServerInfo.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.server.config; 2 | 3 | public class ServerInfo { 4 | /** 唯一编号 **/ 5 | private int id; 6 | /** ip **/ 7 | private String ip; 8 | /** 端口 **/ 9 | private int port; 10 | /** 建立连接的数量 **/ 11 | private int connectNum; 12 | 13 | public int getId() { 14 | return this.id; 15 | } 16 | 17 | public void setId(int id) { 18 | this.id = id; 19 | } 20 | 21 | public String getIp() { 22 | return this.ip; 23 | } 24 | 25 | public void setIp(String ip) { 26 | this.ip = ip; 27 | } 28 | 29 | public int getPort() { 30 | return this.port; 31 | } 32 | 33 | public void setPort(int port) { 34 | this.port = port; 35 | } 36 | 37 | public int getConnectNum() { 38 | return connectNum; 39 | } 40 | 41 | public void setConnectNum(int connectNum) { 42 | this.connectNum = connectNum; 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/server/impl/ClientServer.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.server.impl; 2 | 3 | import java.net.InetSocketAddress; 4 | import java.util.ArrayList; 5 | import java.util.HashMap; 6 | import java.util.List; 7 | import java.util.Map; 8 | import java.util.Random; 9 | import java.util.Set; 10 | import java.util.concurrent.CountDownLatch; 11 | import java.util.concurrent.Executors; 12 | import java.util.concurrent.TimeUnit; 13 | 14 | import org.apache.log4j.Logger; 15 | import org.gserver.core.net.Message; 16 | import org.gserver.core.server.AbstractServer; 17 | import org.gserver.core.server.config.ClientServerConfig; 18 | import org.gserver.core.server.config.ServerInfo; 19 | import org.gserver.core.server.loader.ClientServerConfigXmlLoader; 20 | import org.jboss.netty.bootstrap.ClientBootstrap; 21 | import org.jboss.netty.channel.Channel; 22 | import org.jboss.netty.channel.ChannelFuture; 23 | import org.jboss.netty.channel.ChannelFutureListener; 24 | import org.jboss.netty.channel.ChannelPipelineFactory; 25 | import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory; 26 | 27 | /** 28 | * 客户端服务器经常去连其他服务器,比如逻辑服务器连接网关服务器 29 | * 30 | * @author zhaohui 31 | * 32 | */ 33 | public abstract class ClientServer extends AbstractServer { 34 | 35 | private Logger log = Logger.getLogger(ClientServer.class); 36 | 37 | protected ClientBootstrap bootstrap = null; 38 | protected Map> connectSessions = new HashMap>(); 39 | protected List channelList = new ArrayList(); 40 | 41 | protected ClientServer(String serverConfig) { 42 | super(new ClientServerConfigXmlLoader().load(serverConfig)); 43 | } 44 | 45 | @Override 46 | public void run() { 47 | try { 48 | super.run(); 49 | createBootStrap(); 50 | ClientServerConfig config = (ClientServerConfig) this.config; 51 | if (config != null) { 52 | List connectServers = config.getConnectServers(); 53 | if (connectServers != null) { 54 | for (ServerInfo serverInfo : connectServers) { 55 | initConnect(serverInfo); 56 | } 57 | } 58 | 59 | Set keySet = connectSessions.keySet(); 60 | for (int key : keySet) { 61 | channelList.addAll(connectSessions.get(key)); 62 | } 63 | } 64 | } catch (Exception e) { 65 | log.error(e); 66 | } 67 | 68 | } 69 | 70 | private void createBootStrap() { 71 | bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory( 72 | Executors.newCachedThreadPool(), 73 | Executors.newCachedThreadPool())); 74 | bootstrap.setPipelineFactory(createPipelineFactory()); 75 | } 76 | 77 | protected abstract ChannelPipelineFactory createPipelineFactory(); 78 | 79 | /** 80 | * 初始化clientServer和其他服务器建立连接 81 | * 82 | * @param serverInfo 83 | * @throws InterruptedException 84 | */ 85 | private void initConnect(ServerInfo serverInfo) throws InterruptedException { 86 | int connected = 0; 87 | while (connected < serverInfo.getConnectNum()) { 88 | ChannelFuture fapp = bootstrap.connect(new InetSocketAddress( 89 | serverInfo.getIp(), serverInfo.getPort())); 90 | Channel channel = fapp.getChannel(); 91 | CountDownLatch countLatch = new CountDownLatch(1); 92 | fapp.addListener(new ChannelListener(countLatch)); 93 | if (!channel.isConnected()) { 94 | countLatch.await(2000, TimeUnit.MILLISECONDS); 95 | } 96 | 97 | if (!channel.isConnected()) { 98 | log.info("not connect ip:" + serverInfo.getIp() + ",port:" 99 | + serverInfo.getPort()); 100 | try { 101 | fapp.cancel(); 102 | Thread.sleep(5000L); 103 | } catch (Exception e) { 104 | this.log.error(e, e); 105 | } 106 | } else { 107 | log.info("connect ip:" + serverInfo.getIp() + ",port:" 108 | + serverInfo.getPort()); 109 | add(channel, serverInfo.getId()); 110 | connected++; 111 | } 112 | } 113 | } 114 | 115 | /** 116 | * 添加channel 117 | * 118 | * @param channel 119 | * @param id 120 | */ 121 | public void add(Channel channel, int id) { 122 | synchronized (this.connectSessions) { 123 | List sessions = this.connectSessions.get(Integer 124 | .valueOf(id)); 125 | if (sessions == null) { 126 | sessions = new ArrayList(); 127 | this.connectSessions.put(Integer.valueOf(id), sessions); 128 | } 129 | sessions.add(channel); 130 | } 131 | } 132 | 133 | public List getChannelList(int serverId) { 134 | return connectSessions.get(serverId); 135 | } 136 | 137 | private Channel getChannel() { 138 | return channelList.get(new Random().nextInt(channelList.size() - 1)); 139 | } 140 | 141 | public void write(Message message) { 142 | Channel channel = getChannel(); 143 | channel.write(message); 144 | } 145 | 146 | } 147 | 148 | class ChannelListener implements ChannelFutureListener { 149 | 150 | private CountDownLatch countlatch; 151 | 152 | public ChannelListener(CountDownLatch countlatch) { 153 | this.countlatch = countlatch; 154 | } 155 | 156 | @Override 157 | public void operationComplete(ChannelFuture future) throws Exception { 158 | if (future.getChannel().isConnected()) { 159 | countlatch.countDown(); 160 | } 161 | } 162 | 163 | } 164 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/server/impl/Server.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.server.impl; 2 | 3 | import java.net.InetSocketAddress; 4 | 5 | import org.apache.log4j.Logger; 6 | import org.gserver.core.server.AbstractServer; 7 | import org.gserver.core.server.config.ServerConfig; 8 | import org.gserver.core.server.loader.ServerConfigXmlLoader; 9 | import org.jboss.netty.bootstrap.ServerBootstrap; 10 | import org.jboss.netty.channel.ChannelPipelineFactory; 11 | import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory; 12 | 13 | /** 14 | * 服务器 15 | * 16 | * @author zhaohui 17 | * 18 | */ 19 | public abstract class Server extends AbstractServer { 20 | private Logger log = Logger.getLogger(Server.class); 21 | 22 | protected ServerBootstrap bootstrap; 23 | private int port; 24 | 25 | protected Server(String serverConfig) { 26 | super(new ServerConfigXmlLoader().load(serverConfig)); 27 | port = ((ServerConfig) config).getPort(); 28 | } 29 | 30 | @Override 31 | public void run() { 32 | super.run(); 33 | bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory()); 34 | bootstrap.setPipelineFactory(createPipelineFactory()); 35 | bootstrap.bind(new InetSocketAddress(port)); 36 | log.info("Server " + getServerName() + " Start At Port " + port); 37 | } 38 | 39 | protected abstract ChannelPipelineFactory createPipelineFactory(); 40 | 41 | } 42 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/server/loader/ClientServerConfigXmlLoader.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.server.loader; 2 | 3 | import java.io.FileInputStream; 4 | import java.io.IOException; 5 | import java.io.InputStream; 6 | 7 | import javax.xml.parsers.DocumentBuilder; 8 | import javax.xml.parsers.DocumentBuilderFactory; 9 | 10 | import org.apache.log4j.Logger; 11 | import org.gserver.core.server.config.ClientServerConfig; 12 | import org.gserver.core.server.config.ServerInfo; 13 | import org.w3c.dom.Document; 14 | import org.w3c.dom.Node; 15 | import org.w3c.dom.NodeList; 16 | 17 | /** 18 | * 加载clientServer配置xml 19 | * 20 | * @author zhaohui 21 | * 22 | */ 23 | public class ClientServerConfigXmlLoader { 24 | 25 | private Logger log = Logger.getLogger(ClientServerConfigXmlLoader.class); 26 | 27 | public ClientServerConfig load(String file) { 28 | InputStream in = null; 29 | try { 30 | DocumentBuilder builder = DocumentBuilderFactory.newInstance() 31 | .newDocumentBuilder(); 32 | in = new FileInputStream(file); 33 | Document doc = builder.parse(in); 34 | NodeList list = doc.getElementsByTagName("server"); 35 | 36 | ClientServerConfig config = new ClientServerConfig(); 37 | if (list.getLength() > 0) { 38 | Node node = list.item(0); 39 | NodeList childs = node.getChildNodes(); 40 | 41 | for (int j = 0; j < childs.getLength(); j++) { 42 | if ("server-name".equals(childs.item(j).getNodeName())) { 43 | config.setName(childs.item(j).getTextContent()); 44 | } else if ("server-id".equals(childs.item(j).getNodeName())) { 45 | config.setId(Integer.parseInt(childs.item(j) 46 | .getTextContent())); 47 | } else if ("connect-servers".equals(childs.item(j) 48 | .getNodeName())) { 49 | NodeList servers = childs.item(j).getChildNodes(); 50 | for (int k = 0; k < servers.getLength(); k++) 51 | if ("connect-server".equals(servers.item(k) 52 | .getNodeName())) { 53 | Node line = servers.item(k); 54 | ServerInfo info = new ServerInfo(); 55 | NodeList attrs = line.getChildNodes(); 56 | for (int l = 0; l < attrs.getLength(); l++) { 57 | String nodeName = attrs.item(l) 58 | .getNodeName(); 59 | String textContent = attrs.item(l) 60 | .getTextContent(); 61 | if ("server-id".equals(nodeName)) { 62 | info.setId(Integer 63 | .parseInt(textContent)); 64 | } else if ("server-ip".equals(nodeName)) { 65 | info.setIp(textContent); 66 | } else if ("server-port".equals(nodeName)) { 67 | info.setPort(Integer 68 | .parseInt(textContent)); 69 | } else if ("connect-num".equals(nodeName)) { 70 | info.setConnectNum(Integer 71 | .parseInt(textContent)); 72 | } 73 | } 74 | 75 | config.getConnectServers().add(info); 76 | } 77 | } 78 | } 79 | } 80 | 81 | in.close(); 82 | 83 | log.info("load server config !"); 84 | return config; 85 | } catch (Exception e) { 86 | this.log.error(e, e); 87 | } finally { 88 | if (in != null) { 89 | try { 90 | in.close(); 91 | } catch (IOException e) { 92 | } 93 | } 94 | } 95 | return null; 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/server/loader/ServerConfigXmlLoader.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.server.loader; 2 | 3 | import java.io.FileInputStream; 4 | import java.io.IOException; 5 | import java.io.InputStream; 6 | 7 | import javax.xml.parsers.DocumentBuilder; 8 | import javax.xml.parsers.DocumentBuilderFactory; 9 | 10 | import org.apache.log4j.Logger; 11 | import org.gserver.core.server.config.ServerConfig; 12 | import org.w3c.dom.Document; 13 | import org.w3c.dom.Node; 14 | import org.w3c.dom.NodeList; 15 | 16 | /** 17 | * 加载Server配置xml 18 | * 19 | * @author zhaohui 20 | * 21 | */ 22 | public class ServerConfigXmlLoader { 23 | private Logger log = Logger.getLogger(ServerConfigXmlLoader.class); 24 | 25 | public ServerConfig load(String file) { 26 | InputStream in = null; 27 | try { 28 | DocumentBuilder builder = DocumentBuilderFactory.newInstance() 29 | .newDocumentBuilder(); 30 | in = new FileInputStream(file); 31 | Document doc = builder.parse(in); 32 | NodeList list = doc.getElementsByTagName("server"); 33 | 34 | ServerConfig config = new ServerConfig(); 35 | if (list.getLength() > 0) { 36 | Node node = list.item(0); 37 | NodeList childs = node.getChildNodes(); 38 | 39 | for (int j = 0; j < childs.getLength(); j++) { 40 | if ("server-name".equals(childs.item(j).getNodeName())) 41 | config.setName(childs.item(j).getTextContent()); 42 | else if ("server-id".equals(childs.item(j).getNodeName())) 43 | config.setId(Integer.parseInt(childs.item(j) 44 | .getTextContent())); 45 | else if ("server-port".equals(childs.item(j).getNodeName())) { 46 | config.setPort(Integer.parseInt(childs.item(j) 47 | .getTextContent())); 48 | } 49 | } 50 | } 51 | 52 | log.info("load server config !"); 53 | return config; 54 | } catch (Exception e) { 55 | this.log.error(e); 56 | } finally { 57 | if (in != null) { 58 | try { 59 | in.close(); 60 | } catch (IOException e) { 61 | } 62 | } 63 | } 64 | return null; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/threadPool/AbstractWork.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.threadPool; 2 | 3 | import org.gserver.core.threadPool.struts.TasksQueue; 4 | 5 | public abstract class AbstractWork implements Runnable { 6 | 7 | private TasksQueue tasksQueue; 8 | 9 | public TasksQueue getTasksQueue() { 10 | return tasksQueue; 11 | } 12 | 13 | public void setTasksQueue(TasksQueue tasksQueue) { 14 | this.tasksQueue = tasksQueue; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/threadPool/executor/NonOrderedQueuePoolExecutor.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.threadPool.executor; 2 | 3 | import java.util.concurrent.LinkedBlockingQueue; 4 | import java.util.concurrent.ThreadPoolExecutor; 5 | import java.util.concurrent.TimeUnit; 6 | 7 | import org.gserver.core.threadPool.AbstractWork; 8 | 9 | /** 10 | * 无序队列线程池 11 | * @author zhaohui 12 | * 13 | */ 14 | public class NonOrderedQueuePoolExecutor extends ThreadPoolExecutor { 15 | 16 | public NonOrderedQueuePoolExecutor(int corePoolSize) { 17 | super(corePoolSize, corePoolSize, 30, TimeUnit.SECONDS, 18 | new LinkedBlockingQueue()); 19 | } 20 | 21 | public void execute(AbstractWork work) { 22 | execute(work); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/threadPool/executor/OrderedQueuePoolExecutor.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.threadPool.executor; 2 | 3 | import java.util.concurrent.LinkedBlockingQueue; 4 | import java.util.concurrent.ThreadPoolExecutor; 5 | import java.util.concurrent.TimeUnit; 6 | 7 | import org.apache.log4j.Logger; 8 | import org.gserver.core.threadPool.AbstractWork; 9 | import org.gserver.core.threadPool.struts.OrderedQueuePool; 10 | import org.gserver.core.threadPool.struts.TasksQueue; 11 | 12 | /** 13 | * 有序的队列线程池 14 | * @author zhaohui 15 | * 16 | */ 17 | public class OrderedQueuePoolExecutor extends ThreadPoolExecutor { 18 | 19 | protected static Logger log = Logger 20 | .getLogger(OrderedQueuePoolExecutor.class); 21 | 22 | private OrderedQueuePool pool = new OrderedQueuePool(); 23 | 24 | private String name; 25 | private int maxQueueSize; 26 | 27 | public OrderedQueuePoolExecutor(String name, int corePoolSize, 28 | int maxQueueSize) { 29 | super(corePoolSize, 2 * corePoolSize, 30, TimeUnit.SECONDS, 30 | new LinkedBlockingQueue()); 31 | this.name = name; 32 | this.maxQueueSize = maxQueueSize; 33 | } 34 | 35 | public OrderedQueuePoolExecutor(int corePoolSize) { 36 | this("queue-pool", corePoolSize, 10000); 37 | } 38 | 39 | /** 40 | * 增加执行任务 41 | * @param key 42 | * @param value 43 | * @return 44 | */ 45 | public boolean addTask(Integer key, AbstractWork task) { 46 | TasksQueue queue = pool.getTasksQueue(key); 47 | boolean run = false; 48 | boolean result = false; 49 | synchronized (queue) { 50 | if (maxQueueSize > 0) { 51 | if (queue.size() > maxQueueSize) { 52 | log.error("队列" + name + "(" + key + ")" + "抛弃指令!"); 53 | queue.clear(); 54 | } 55 | } 56 | result = queue.add(task); 57 | if (result) { 58 | task.setTasksQueue(queue); 59 | { 60 | if (queue.isProcessingCompleted()) { 61 | queue.setProcessingCompleted(false); 62 | run = true; 63 | } 64 | } 65 | } else { 66 | log.error("队列添加任务失败"); 67 | } 68 | } 69 | if (run) { 70 | execute(queue.poll()); 71 | } 72 | return result; 73 | } 74 | 75 | @Override 76 | protected void afterExecute(Runnable r, Throwable t) { 77 | super.afterExecute(r, t); 78 | 79 | AbstractWork work = (AbstractWork) r; 80 | TasksQueue queue = work.getTasksQueue(); 81 | if (queue != null) { 82 | AbstractWork afterWork = null; 83 | synchronized (queue) { 84 | afterWork = queue.poll(); 85 | if (afterWork == null) { 86 | queue.setProcessingCompleted(true); 87 | } 88 | } 89 | if (afterWork != null) { 90 | execute(afterWork); 91 | } 92 | } else { 93 | log.error("执行队列为空"); 94 | } 95 | } 96 | 97 | } 98 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/threadPool/struts/OrderedQueuePool.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.threadPool.struts; 2 | 3 | import java.util.concurrent.ConcurrentHashMap; 4 | 5 | public class OrderedQueuePool { 6 | 7 | ConcurrentHashMap> map = new ConcurrentHashMap>(); 8 | 9 | /** 10 | * 获得任务队列 11 | * @param key 12 | * @return 13 | */ 14 | public TasksQueue getTasksQueue(K key) { 15 | synchronized (map) { 16 | TasksQueue queue = map.get(key); 17 | 18 | if (queue == null) { 19 | queue = new TasksQueue(); 20 | map.put(key, queue); 21 | } 22 | 23 | return queue; 24 | } 25 | } 26 | 27 | /** 28 | * 获得全部任务队列 29 | * @param key 30 | * @return 31 | */ 32 | public ConcurrentHashMap> getTasksQueues() { 33 | return map; 34 | } 35 | 36 | /** 37 | * 移除任务队列 38 | * @param key 39 | * @return 40 | */ 41 | public void removeTasksQueue(K key) { 42 | map.remove(key); 43 | } 44 | } -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/threadPool/struts/TasksQueue.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.threadPool.struts; 2 | 3 | import java.util.ArrayDeque; 4 | import java.util.concurrent.locks.Lock; 5 | import java.util.concurrent.locks.ReentrantLock; 6 | 7 | public class TasksQueue { 8 | 9 | private Lock lock = new ReentrantLock(); 10 | /** 11 | * 命令队列 12 | */ 13 | private final ArrayDeque tasksQueue = new ArrayDeque(); 14 | 15 | private boolean processingCompleted = true; 16 | 17 | /** 18 | * 下一执行命令 19 | * 20 | * @return 21 | */ 22 | public V poll() { 23 | try { 24 | lock.lock(); 25 | return tasksQueue.poll(); 26 | } finally { 27 | lock.unlock(); 28 | } 29 | } 30 | 31 | /** 32 | * 增加执行指令 33 | * 34 | * @param command 35 | * @return 36 | */ 37 | public boolean add(V value) { 38 | try { 39 | lock.lock(); 40 | return tasksQueue.add(value); 41 | } finally { 42 | lock.unlock(); 43 | } 44 | } 45 | 46 | /** 47 | * 清理 48 | */ 49 | public void clear() { 50 | try { 51 | lock.lock(); 52 | tasksQueue.clear(); 53 | } finally { 54 | lock.unlock(); 55 | } 56 | } 57 | 58 | /** 59 | * 获取指令数量 60 | * 61 | * @return 62 | */ 63 | public int size() { 64 | return tasksQueue.size(); 65 | } 66 | 67 | public boolean isProcessingCompleted() { 68 | return processingCompleted; 69 | } 70 | 71 | public void setProcessingCompleted(boolean processingCompleted) { 72 | this.processingCompleted = processingCompleted; 73 | } 74 | 75 | } -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/util/ChannelPoolManager.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.util; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | import java.util.Random; 6 | 7 | import org.jboss.netty.channel.Channel; 8 | 9 | /** 10 | * 内部服务器建立的连接池 11 | * 12 | * @author zhaohui 13 | * 14 | */ 15 | public class ChannelPoolManager { 16 | 17 | private List channelPool = new ArrayList(); 18 | 19 | private static ChannelPoolManager poolManager = new ChannelPoolManager(); 20 | 21 | public static ChannelPoolManager getInstance() { 22 | return poolManager; 23 | } 24 | 25 | public void addChannel(Channel channel) { 26 | channelPool.add(channel); 27 | } 28 | 29 | public void removeChannel(Channel channel) { 30 | channelPool.remove(channel); 31 | } 32 | 33 | /** 34 | * 随机获取一个连接 35 | * 36 | * @return 37 | */ 38 | public Channel getChannel() { 39 | Channel channel = channelPool.get(new Random().nextInt(channelPool 40 | .size())); 41 | if (channel == null || channel.isConnected() == false) { 42 | throw new RuntimeException("no channel is connected channel:" 43 | + channel); 44 | } 45 | return channel; 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/util/SessionChannelManager.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.util; 2 | 3 | import java.util.Map; 4 | import java.util.concurrent.ConcurrentHashMap; 5 | import org.jboss.netty.channel.Channel; 6 | 7 | /** 8 | * session和channel关系管理器 9 | * 10 | * @author zhaohui 11 | * 12 | */ 13 | public class SessionChannelManager { 14 | 15 | public static SessionChannelManager instance = new SessionChannelManager(); 16 | 17 | private Map sessionChannelMap = new ConcurrentHashMap(); 18 | private Map channelSessionMap = new ConcurrentHashMap(); 19 | 20 | public static SessionChannelManager getInstance() { 21 | return instance; 22 | } 23 | 24 | public void addChannle(Integer sessionId, Channel channel) { 25 | synchronized (this) { 26 | sessionChannelMap.put(sessionId, channel); 27 | channelSessionMap.put(channel, sessionId); 28 | } 29 | } 30 | 31 | /** 32 | * 获取指定session的channel 33 | * 34 | * @param sessionId 35 | * @return 36 | */ 37 | public Channel getChannel(Integer sessionId) { 38 | return sessionChannelMap.get(sessionId); 39 | } 40 | 41 | /** 42 | * 获取指定channel的sessionId 43 | * 44 | * @param channel 45 | * @return 46 | */ 47 | public Integer getSessionId(Channel channel) { 48 | return channelSessionMap.get(channel); 49 | } 50 | 51 | /** 52 | * 移除指定session和channel 53 | * 54 | * @param sessionId 55 | */ 56 | public void removeChannel(int sessionId) { 57 | synchronized (this) { 58 | Channel channel = sessionChannelMap.get(sessionId); 59 | if (channel != null) { 60 | channelSessionMap.remove(channel); 61 | } 62 | sessionChannelMap.remove(sessionId); 63 | } 64 | } 65 | 66 | public void removeChannel(Channel channel) { 67 | synchronized (this) { 68 | Integer sessionId = channelSessionMap.get(channel); 69 | if (sessionId != null) { 70 | sessionChannelMap.remove(sessionId); 71 | } 72 | channelSessionMap.remove(channel); 73 | } 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /gserver-core/src/main/java/org/gserver/core/util/SessionUtil.java: -------------------------------------------------------------------------------- 1 | package org.gserver.core.util; 2 | 3 | import java.security.MessageDigest; 4 | import java.security.NoSuchAlgorithmException; 5 | import java.security.SecureRandom; 6 | import java.util.HashMap; 7 | import java.util.Map; 8 | import java.util.Random; 9 | 10 | public class SessionUtil { 11 | 12 | private static final int SESSION_ID_BYTES = 16; 13 | 14 | /** 15 | * 生成sessionId 16 | * 17 | * @return 18 | */ 19 | public static synchronized String generateSessionId() { 20 | Random random = new SecureRandom(); 21 | byte bytes[] = new byte[SESSION_ID_BYTES]; 22 | random.nextBytes(bytes); 23 | bytes = getDigest().digest(bytes); 24 | 25 | StringBuffer result = new StringBuffer(); 26 | for (int i = 0; i < bytes.length; i++) { 27 | byte b1 = (byte) ((bytes[i] & 0xf0) >> 4); 28 | byte b2 = (byte) (bytes[i] & 0x0f); 29 | if (b1 < 10) { 30 | result.append((char) ('0' + b1)); 31 | } else { 32 | result.append((char) ('A' + (b1 - 10))); 33 | } 34 | 35 | if (b2 < 10) { 36 | result.append((char) ('0' + b2)); 37 | } else { 38 | result.append((char) ('A' + (b2 - 10))); 39 | } 40 | } 41 | 42 | return (result.toString()); 43 | } 44 | 45 | private static MessageDigest getDigest() { 46 | try { 47 | MessageDigest md = MessageDigest.getInstance("MD5"); 48 | return md; 49 | } catch (NoSuchAlgorithmException e) { 50 | e.printStackTrace(); 51 | } 52 | return null; 53 | } 54 | 55 | public static void main(String[] args) { 56 | String sid = SessionUtil.generateSessionId(); 57 | System.out.println("jsessionid=" + sid); 58 | System.out.println("sid.lengh=" + sid.length()); 59 | String s = "CAB541D43210B989EE5696CDC5DEA456"; 60 | System.out.println(s.length()); 61 | Map v = new HashMap(); 62 | for (int i = 0; i < 100000; i++) { 63 | String xx = SessionUtil.generateSessionId(); 64 | if (v.containsKey(xx)) { 65 | System.err.println("xxxxxxxxxxxxxxxxxxx"); 66 | } else { 67 | v.put(xx, 0); 68 | } 69 | } 70 | } 71 | 72 | } 73 | -------------------------------------------------------------------------------- /gserver-core/src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | log4j.rootLogger=INFO,fileA,consoleA 2 | 3 | log4j.appender.fileA=org.apache.log4j.DailyRollingFileAppender 4 | log4j.appender.fileA.File=./logs/gameserver.log 5 | log4j.appender.fileA.append=true 6 | log4j.appender.fileA.ImmediateFlush=true 7 | log4j.appender.fileA.layout=org.apache.log4j.PatternLayout 8 | log4j.appender.fileA.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%t] %L::: %-5p %C - %m%n 9 | 10 | log4j.appender.consoleA=org.apache.log4j.ConsoleAppender 11 | log4j.appender.consoleA.layout=org.apache.log4j.PatternLayout 12 | log4j.appender.consoleA.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - %m%n -------------------------------------------------------------------------------- /gserver-db/.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /logs 3 | /.settings -------------------------------------------------------------------------------- /gserver-db/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.gserver 8 | gserver 9 | 0.0.1-SNAPSHOT 10 | 11 | gserver-db 12 | gserver-db 13 | http://maven.apache.org 14 | 15 | UTF-8 16 | 17 | 18 | 19 | 20 | mysql 21 | mysql-connector-java 22 | 5.1.23 23 | 24 | 25 | commons-dbcp 26 | commons-dbcp 27 | 1.4 28 | 29 | 30 | commons-dbutils 31 | commons-dbutils 32 | 1.6 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /gserver-db/src/main/java/org/gserver/db/IMysqlJdbcTemplate.java: -------------------------------------------------------------------------------- 1 | package org.gserver.db; 2 | 3 | import java.util.List; 4 | import java.util.Map; 5 | import java.util.Set; 6 | 7 | public interface IMysqlJdbcTemplate { 8 | 9 | public T queryBean(Class type, long id); 10 | 11 | public List batchQueryBean(Class type, Set ids); 12 | 13 | public int insert(Class type, Map beanMap); 14 | 15 | public int update(Class type, long id, Map updateMap); 16 | 17 | public void delete(Class type, long id); 18 | 19 | } 20 | -------------------------------------------------------------------------------- /gserver-db/src/main/java/org/gserver/db/MysqlJdbcTemplate.java: -------------------------------------------------------------------------------- 1 | package org.gserver.db; 2 | 3 | import java.util.List; 4 | import java.util.Map; 5 | import java.util.Set; 6 | 7 | import org.gserver.db.accessor.IMysqlAccessor; 8 | import org.gserver.db.accessor.SQLUtil; 9 | 10 | public class MysqlJdbcTemplate implements IMysqlJdbcTemplate { 11 | 12 | private IMysqlAccessor accessor; 13 | 14 | @Override 15 | public T queryBean(Class type, long id) { 16 | return null; 17 | } 18 | 19 | @Override 20 | public List batchQueryBean(Class type, Set ids) { 21 | return null; 22 | } 23 | 24 | @Override 25 | public int insert(Class type, Map beanMap) { 26 | String insertSql = SQLUtil.insert(beanMap, type.getSimpleName()); 27 | return accessor.insert(insertSql); 28 | } 29 | 30 | @Override 31 | public int update(Class type, long id, Map updateMap) { 32 | return 0; 33 | } 34 | 35 | @Override 36 | public void delete(Class type, long id) { 37 | 38 | } 39 | 40 | public void setAccessor(IMysqlAccessor accessor) { 41 | this.accessor = accessor; 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /gserver-db/src/main/java/org/gserver/db/accessor/AbstractMysqlAccessor.java: -------------------------------------------------------------------------------- 1 | package org.gserver.db.accessor; 2 | 3 | import java.sql.Connection; 4 | import java.sql.SQLException; 5 | 6 | public abstract class AbstractMysqlAccessor { 7 | 8 | private JdbcFactory jdbcFactory; 9 | 10 | protected T execute(SimpleJdbcCallback action) { 11 | return execute(action, true); 12 | } 13 | 14 | private T execute(SimpleJdbcCallback action, boolean flag) { 15 | Connection conn = null; 16 | try { 17 | conn = jdbcFactory.getConnection(); 18 | T result = action.doIt(conn); 19 | conn.close(); 20 | return result; 21 | } catch (Exception e) { 22 | throw new RuntimeException(e.getMessage(), e); 23 | } finally { 24 | try { 25 | if (conn != null) 26 | conn.close(); 27 | } catch (SQLException e) { 28 | e.printStackTrace(); 29 | } 30 | } 31 | } 32 | 33 | public void setJdbcFactory(JdbcFactory jdbcFactory) { 34 | this.jdbcFactory = jdbcFactory; 35 | } 36 | 37 | } 38 | 39 | interface SimpleJdbcCallback { 40 | T doIt(Connection conn) throws SQLException; 41 | } 42 | -------------------------------------------------------------------------------- /gserver-db/src/main/java/org/gserver/db/accessor/IMysqlAccessor.java: -------------------------------------------------------------------------------- 1 | package org.gserver.db.accessor; 2 | 3 | import java.util.List; 4 | import java.util.Set; 5 | 6 | public interface IMysqlAccessor { 7 | 8 | public T queryBean(Class type, long id); 9 | 10 | public List batchQueryBean(Class type, Set ids); 11 | 12 | public int insert(String sql, Object... args); 13 | 14 | public int update(String sql, Object... args); 15 | 16 | public void delete(String sql, Object... args); 17 | 18 | public int executeUpdate(String sql, Object... args); 19 | 20 | } 21 | -------------------------------------------------------------------------------- /gserver-db/src/main/java/org/gserver/db/accessor/JdbcFactory.java: -------------------------------------------------------------------------------- 1 | package org.gserver.db.accessor; 2 | 3 | import java.sql.Connection; 4 | import java.sql.SQLException; 5 | 6 | import javax.sql.DataSource; 7 | 8 | import org.apache.log4j.Logger; 9 | 10 | public class JdbcFactory { 11 | 12 | private static final Logger logger = Logger.getLogger(JdbcFactory.class); 13 | 14 | protected DataSource datasource; 15 | 16 | public void setDatasource(DataSource datasource) { 17 | this.datasource = datasource; 18 | } 19 | 20 | public Connection getConnection() { 21 | try { 22 | return datasource.getConnection(); 23 | } catch (SQLException e) { 24 | logger.error("getConnection error", e); 25 | } 26 | return null; 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /gserver-db/src/main/java/org/gserver/db/accessor/MysqlAccessor.java: -------------------------------------------------------------------------------- 1 | package org.gserver.db.accessor; 2 | 3 | import java.sql.Connection; 4 | import java.sql.SQLException; 5 | import java.util.List; 6 | import java.util.Set; 7 | 8 | import org.apache.commons.dbutils.QueryRunner; 9 | 10 | public class MysqlAccessor extends AbstractMysqlAccessor implements 11 | IMysqlAccessor { 12 | 13 | private QueryRunner queryRunner; 14 | 15 | public MysqlAccessor() { 16 | queryRunner = new QueryRunner(); 17 | } 18 | 19 | @Override 20 | public T queryBean(Class type, long id) { 21 | return null; 22 | } 23 | 24 | @Override 25 | public List batchQueryBean(Class type, Set ids) { 26 | return null; 27 | } 28 | 29 | @Override 30 | public int insert(String sql, Object... args) { 31 | return executeUpdate(sql, args); 32 | } 33 | 34 | @Override 35 | public int update(String sql, Object... args) { 36 | return executeUpdate(sql, args); 37 | } 38 | 39 | @Override 40 | public void delete(String sql, Object... args) { 41 | executeUpdate(sql, args); 42 | } 43 | 44 | @Override 45 | public int executeUpdate(final String sql, final Object... args) { 46 | return execute(new SimpleJdbcCallback() { 47 | @Override 48 | public Integer doIt(Connection conn) throws SQLException { 49 | return queryRunner.update(conn, sql, args); 50 | } 51 | }); 52 | } 53 | 54 | } 55 | -------------------------------------------------------------------------------- /gserver-db/src/main/java/org/gserver/db/accessor/SQLUtil.java: -------------------------------------------------------------------------------- 1 | package org.gserver.db.accessor; 2 | 3 | import java.util.Map; 4 | import java.util.Set; 5 | 6 | /** 7 | * 生成sql助手类 8 | * 9 | * @author zhaohui 10 | * 11 | */ 12 | public class SQLUtil { 13 | 14 | public final static String insert_into = "insert ignore into "; 15 | public final static String values = " VALUES "; 16 | public final static String set = " set "; 17 | public final static String empty_string = ""; 18 | public final static String blank_string = " "; 19 | public final static String nil_string = "null"; 20 | public final static String equals_string = " = "; 21 | public final static String quota_string = "'"; 22 | public final static String comma_string = ","; 23 | public final static String left_Brackets = " ("; 24 | public final static String right_Brackets = " )"; 25 | public final static String end_string = ";"; 26 | public final static String in = "in"; 27 | public final static String caseS = " CASE "; 28 | public final static String end = " end "; 29 | 30 | public final static String update_table = "update "; 31 | public final static String delete_from = "delete from "; 32 | public final static String where_id = " where id "; 33 | public static final String id = "id"; 34 | public static final String where = " where "; 35 | 36 | public static String insert(Map beanMap, String tableName) { 37 | if (beanMap == null || beanMap.size() <= 0) { 38 | return ""; 39 | } 40 | StringBuilder buffer = new StringBuilder(); 41 | buffer.append(insert_into).append(tableName); 42 | 43 | StringBuffer keyStr = new StringBuffer(left_Brackets); 44 | StringBuffer valueStr = new StringBuffer(left_Brackets); 45 | 46 | Set keySet = beanMap.keySet(); 47 | int index = 0; 48 | for (String key : keySet) { 49 | String value = beanMap.get(key); 50 | if (index != keySet.size() - 1) { 51 | keyStr.append(key).append(comma_string); 52 | valueStr.append(value).append(comma_string); 53 | } else { 54 | keyStr.append(key); 55 | valueStr.append(value); 56 | } 57 | index++; 58 | } 59 | keyStr.append(right_Brackets); 60 | valueStr.append(right_Brackets); 61 | 62 | buffer.append(keyStr).append(values).append(valueStr) 63 | .append(end_string); 64 | return buffer.toString(); 65 | } 66 | 67 | public String update(Map updateBean, String tableName) { 68 | if (updateBean == null || updateBean.size() <= 0) { 69 | return ""; 70 | } 71 | StringBuilder buffer = new StringBuilder(); 72 | buffer.append(update_table).append(tableName).append(set); 73 | 74 | Set keySet = updateBean.keySet(); 75 | int index = 0; 76 | for (String key : keySet) { 77 | String value = updateBean.get(key); 78 | if (index != keySet.size() - 1) { 79 | buffer.append(key).append(equals_string).append(value) 80 | .append(comma_string); 81 | } else { 82 | buffer.append(key).append(equals_string).append(value); 83 | } 84 | index++; 85 | } 86 | return buffer.toString(); 87 | } 88 | 89 | public String delete(Map params, String tableName) { 90 | StringBuilder buffer = new StringBuilder(); 91 | return buffer.toString(); 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /gserver-db/src/main/resources/gs-mysql.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /gserver-distribution/.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /logs 3 | /.settings -------------------------------------------------------------------------------- /gserver-distribution/assembly.xml: -------------------------------------------------------------------------------- 1 | 2 | bin 3 | 4 | 5 | zip 6 | 7 | 8 | 9 | 10 | 11 | 12 | false 13 | lib 14 | false 15 | 16 | 17 | com.gserver:gserver-logic 18 | com.gserver:gserver-gate 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | ../gserver-logic/shell 27 | 28 | 29 | * 30 | 31 | 32 | 33 | ../gserver-gate/shell 34 | 35 | 36 | * 37 | 38 | 39 | 40 | ../gserver-distribution/shell 41 | 42 | 43 | * 44 | 45 | 46 | 47 | 48 | ../gserver-logic/target 49 | 50 | 51 | *.jar 52 | 53 | 54 | 55 | ../gserver-gate/target 56 | 57 | 58 | *.jar 59 | 60 | 61 | 62 | 63 | ../gserver-logic/logic-config 64 | logic-config 65 | 66 | * 67 | 68 | 69 | 70 | ../gserver-gate/gate-config 71 | gate-config 72 | 73 | * 74 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /gserver-distribution/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.gserver 8 | gserver 9 | 0.0.1-SNAPSHOT 10 | 11 | gserver-distribution 12 | gserver-distribution 13 | http://maven.apache.org 14 | 15 | UTF-8 16 | 17 | 18 | 19 | 20 | 21 | org.apache.maven.plugins 22 | maven-assembly-plugin 23 | 2.4 24 | 25 | 26 | assembly.xml 27 | 28 | 29 | 30 | 31 | make-assembly 32 | package 33 | 34 | single 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | com.gserver 45 | gserver-logic 46 | 0.0.1-SNAPSHOT 47 | 48 | 49 | com.gserver 50 | gserver-gate 51 | 0.0.1-SNAPSHOT 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /gserver-distribution/shell/all-shutdown.bat: -------------------------------------------------------------------------------- 1 | taskkill /f /t /im cmd.exe -------------------------------------------------------------------------------- /gserver-distribution/shell/all-startup.bat: -------------------------------------------------------------------------------- 1 | echo .| start logic-startup.bat 2 | echo .| start gate-startup.bat -------------------------------------------------------------------------------- /gserver-distribution/src/main/java/org/gserver/distribution/App.java: -------------------------------------------------------------------------------- 1 | package org.gserver.distribution; 2 | 3 | /** 4 | * Hello world! 5 | * 6 | */ 7 | public class App 8 | { 9 | public static void main( String[] args ) 10 | { 11 | System.out.println( "Hello World!" ); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /gserver-gate/.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /logs 3 | /.settings -------------------------------------------------------------------------------- /gserver-gate/gate-config/connect-app-config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Gate1 5 | 1000 6 | 7 | 8 | 2000 9 | 127.0.0.1 10 | 8021 11 | 5 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /gserver-gate/gate-config/server-config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Gate1 5 | 30000 6 | 8000 7 | 8 | -------------------------------------------------------------------------------- /gserver-gate/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.gserver 8 | gserver 9 | 0.0.1-SNAPSHOT 10 | 11 | gserver-gate 12 | gserver-gate 13 | http://maven.apache.org 14 | 15 | UTF-8 16 | 17 | 18 | 19 | 20 | 21 | org.apache.maven.plugins 22 | maven-jar-plugin 23 | 2.3.2 24 | 25 | 26 | false 27 | 28 | true 29 | lib/ 30 | org.gserver.GateStart 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | com.gserver 41 | gserver-services 42 | 0.0.1-SNAPSHOT 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /gserver-gate/shell/gate-startup.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | java -jar gserver-gate-0.0.1-SNAPSHOT.jar 3 | pause -------------------------------------------------------------------------------- /gserver-gate/src/main/java/org/gserver/GateStart.java: -------------------------------------------------------------------------------- 1 | package org.gserver; 2 | 3 | import org.gserver.gate.GateServer; 4 | import org.gserver.gate.clientServer.ConnectAppServer; 5 | 6 | public class GateStart { 7 | public static void main(String[] args) { 8 | new Thread((Runnable) GateServer.getInstance()).start(); 9 | new Thread((Runnable) ConnectAppServer.getInstance()).start(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /gserver-gate/src/main/java/org/gserver/gate/ChannelCloseListener.java: -------------------------------------------------------------------------------- 1 | package org.gserver.gate; 2 | 3 | import org.apache.log4j.Logger; 4 | import org.gserver.core.util.SessionChannelManager; 5 | import org.gserver.services.SessionService; 6 | import org.jboss.netty.channel.Channel; 7 | import org.jboss.netty.channel.ChannelFuture; 8 | import org.jboss.netty.channel.ChannelFutureListener; 9 | 10 | /** 11 | * 监听channel的关闭 12 | * 13 | * @author zhaohui 14 | * 15 | */ 16 | public class ChannelCloseListener implements ChannelFutureListener { 17 | 18 | private final static Logger logger = Logger 19 | .getLogger(ChannelCloseListener.class); 20 | 21 | private SessionService sessionService; 22 | 23 | /** 24 | * channel关闭处理: 1.移除sessionId和channel的关系 2.移除公共缓存中sessionId和roleId的关系 25 | */ 26 | @Override 27 | public void operationComplete(ChannelFuture future) throws Exception { 28 | Channel channel = future.getChannel(); 29 | logger.info("close channle:" + channel); 30 | Integer sessionId = SessionChannelManager.getInstance().getSessionId( 31 | channel); 32 | SessionChannelManager.getInstance().removeChannel(sessionId); 33 | sessionService.removeSession(sessionId); 34 | } 35 | 36 | public void setSessionService(SessionService sessionService) { 37 | this.sessionService = sessionService; 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /gserver-gate/src/main/java/org/gserver/gate/GateHandler.java: -------------------------------------------------------------------------------- 1 | package org.gserver.gate; 2 | 3 | import org.apache.log4j.Logger; 4 | import org.gserver.core.net.Message; 5 | import org.gserver.core.threadPool.AbstractWork; 6 | import org.gserver.core.threadPool.executor.OrderedQueuePoolExecutor; 7 | import org.gserver.core.util.SessionChannelManager; 8 | import org.gserver.gate.clientServer.ConnectAppServer; 9 | import org.gserver.util.CommandEnumUtil; 10 | import org.gserver.util.SpringContainer; 11 | import org.jboss.netty.channel.Channel; 12 | import org.jboss.netty.channel.ChannelHandlerContext; 13 | import org.jboss.netty.channel.ChannelStateEvent; 14 | import org.jboss.netty.channel.ExceptionEvent; 15 | import org.jboss.netty.channel.MessageEvent; 16 | import org.jboss.netty.channel.SimpleChannelHandler; 17 | 18 | /** 19 | * 协议处理器 1.创建sessionID 2.接受客户端的消息进行转发 20 | * 21 | * @author zhaohui 22 | * 23 | */ 24 | public class GateHandler extends SimpleChannelHandler { 25 | 26 | private final static Logger logger = Logger.getLogger(GateHandler.class); 27 | private OrderedQueuePoolExecutor recvExcutor = new OrderedQueuePoolExecutor( 28 | "消息接收队列", 100, 10000); 29 | 30 | @Override 31 | public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) 32 | throws Exception { 33 | Channel channel = e.getChannel(); 34 | logger.info("channelConnected:" + channel); 35 | SessionChannelManager.getInstance() 36 | .addChannle(channel.getId(), channel); 37 | 38 | ChannelCloseListener listener = (ChannelCloseListener) SpringContainer 39 | .getInstance().getBeanById("channelCloseListener"); 40 | channel.getCloseFuture().addListener(listener); 41 | } 42 | 43 | @Override 44 | public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) 45 | throws Exception { 46 | Message request = (Message) e.getMessage(); 47 | if (!CommandEnumUtil.isValid(request.getCommand())) { 48 | return; 49 | } 50 | int sessionId = SessionChannelManager.getInstance().getSessionId( 51 | e.getChannel()); 52 | request.getHeader().setSessionId(sessionId); 53 | recvExcutor.addTask(sessionId, new MWork(request)); 54 | } 55 | 56 | class MWork extends AbstractWork { 57 | /** 消息 **/ 58 | private Message request; 59 | 60 | public MWork(Message request) { 61 | this.request = request; 62 | } 63 | 64 | @Override 65 | public void run() { 66 | try { 67 | ConnectAppServer.getInstance().write(request); 68 | } catch (Exception ex) { 69 | logger.error("gate forward error", ex); 70 | } 71 | } 72 | } 73 | 74 | @Override 75 | public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) 76 | throws Exception { 77 | logger.info("channel is closed" + e.getChannel()); 78 | } 79 | 80 | @Override 81 | public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) { 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /gserver-gate/src/main/java/org/gserver/gate/GatePipelineFactory.java: -------------------------------------------------------------------------------- 1 | package org.gserver.gate; 2 | 3 | import org.gserver.core.net.codec.HeaderDecoder; 4 | import org.gserver.core.net.codec.HeaderEncoder; 5 | import org.jboss.netty.channel.ChannelPipeline; 6 | import org.jboss.netty.channel.ChannelPipelineFactory; 7 | import org.jboss.netty.channel.Channels; 8 | 9 | public class GatePipelineFactory implements ChannelPipelineFactory { 10 | 11 | @Override 12 | public ChannelPipeline getPipeline() throws Exception { 13 | final GateHandler handler = new GateHandler(); 14 | ChannelPipeline pipeline = Channels.pipeline(); 15 | pipeline.addLast("decoder", new HeaderDecoder()); 16 | pipeline.addLast("encoder", new HeaderEncoder()); 17 | pipeline.addLast("handler", handler); 18 | return pipeline; 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /gserver-gate/src/main/java/org/gserver/gate/GateServer.java: -------------------------------------------------------------------------------- 1 | package org.gserver.gate; 2 | 3 | import org.gserver.core.server.impl.Server; 4 | import org.gserver.util.ServerType; 5 | import org.gserver.util.SpringContainer; 6 | import org.jboss.netty.channel.ChannelPipelineFactory; 7 | 8 | /** 9 | * 网关服务器 10 | * 11 | * @author zhaohui 12 | * 13 | */ 14 | public class GateServer extends Server { 15 | 16 | private static final String DEFUALT_SERVER_CONFIG = "gate-config/server-config.xml"; 17 | 18 | private static GateServer gateServer = new GateServer(); 19 | 20 | public static GateServer getInstance() { 21 | return gateServer; 22 | } 23 | 24 | private GateServer() { 25 | this(DEFUALT_SERVER_CONFIG); 26 | } 27 | 28 | public GateServer(String serverConfig) { 29 | super(serverConfig); 30 | } 31 | 32 | @Override 33 | protected void init() { 34 | super.init(); 35 | SpringContainer.getInstance().loadSpring(ServerType.GATE); 36 | } 37 | 38 | @Override 39 | protected ChannelPipelineFactory createPipelineFactory() { 40 | return new GatePipelineFactory(); 41 | } 42 | 43 | @Override 44 | protected void stop() { 45 | 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /gserver-gate/src/main/java/org/gserver/gate/clientServer/ConnectAppServer.java: -------------------------------------------------------------------------------- 1 | package org.gserver.gate.clientServer; 2 | 3 | import org.gserver.core.server.impl.ClientServer; 4 | import org.jboss.netty.channel.ChannelPipelineFactory; 5 | 6 | /** 7 | * 连接app服务器 8 | * 9 | * @author zhaohui 10 | * 11 | */ 12 | public class ConnectAppServer extends ClientServer { 13 | 14 | private static final String DEFUALT_SERVER_CONFIG = "gate-config/connect-app-config.xml"; 15 | 16 | private static ConnectAppServer connectAppServer = new ConnectAppServer(); 17 | 18 | public static ConnectAppServer getInstance() { 19 | return connectAppServer; 20 | } 21 | 22 | private ConnectAppServer() { 23 | super(DEFUALT_SERVER_CONFIG); 24 | } 25 | 26 | @Override 27 | protected ChannelPipelineFactory createPipelineFactory() { 28 | return new ConnectPipelineFactory(); 29 | } 30 | 31 | @Override 32 | protected void stop() { 33 | 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /gserver-gate/src/main/java/org/gserver/gate/clientServer/ConnectHandler.java: -------------------------------------------------------------------------------- 1 | package org.gserver.gate.clientServer; 2 | 3 | import org.apache.log4j.Logger; 4 | import org.gserver.core.net.Message; 5 | import org.gserver.core.threadPool.AbstractWork; 6 | import org.gserver.core.threadPool.executor.OrderedQueuePoolExecutor; 7 | import org.gserver.core.util.SessionChannelManager; 8 | import org.jboss.netty.channel.Channel; 9 | import org.jboss.netty.channel.ChannelHandlerContext; 10 | import org.jboss.netty.channel.ChannelStateEvent; 11 | import org.jboss.netty.channel.ExceptionEvent; 12 | import org.jboss.netty.channel.MessageEvent; 13 | import org.jboss.netty.channel.SimpleChannelHandler; 14 | 15 | /** 16 | * 协议处理器 1.创建sessionID 2.接受客户端的消息进行转发 17 | * 18 | * @author zhaohui 19 | * 20 | */ 21 | public class ConnectHandler extends SimpleChannelHandler { 22 | 23 | private final static Logger logger = Logger.getLogger(ConnectHandler.class); 24 | private OrderedQueuePoolExecutor recvExcutor = new OrderedQueuePoolExecutor( 25 | "消息接收队列", 100, 10000); 26 | 27 | @Override 28 | public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) 29 | throws Exception { 30 | } 31 | 32 | @Override 33 | public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) 34 | throws Exception { 35 | Message request = (Message) e.getMessage(); 36 | int sessionId = request.getHeader().getSessionId(); 37 | Channel channel = SessionChannelManager.getInstance().getChannel( 38 | sessionId); 39 | recvExcutor.addTask(sessionId, new MWork(request, channel)); 40 | } 41 | 42 | class MWork extends AbstractWork { 43 | /** 消息 **/ 44 | private Message request; 45 | /** 消息队列 **/ 46 | private Channel channel; 47 | 48 | public MWork(Message request, Channel channel) { 49 | this.request = request; 50 | this.channel = channel; 51 | } 52 | 53 | @Override 54 | public void run() { 55 | try { 56 | channel.write(request); 57 | } catch (Exception e) { 58 | logger.error("connect forward error", e); 59 | } 60 | } 61 | } 62 | 63 | @Override 64 | public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) 65 | throws Exception { 66 | logger.info("channelClosed:" + e.getChannel()); 67 | } 68 | 69 | @Override 70 | public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) { 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /gserver-gate/src/main/java/org/gserver/gate/clientServer/ConnectPipelineFactory.java: -------------------------------------------------------------------------------- 1 | package org.gserver.gate.clientServer; 2 | 3 | import org.gserver.core.net.codec.HeaderDecoder; 4 | import org.gserver.core.net.codec.HeaderEncoder; 5 | import org.jboss.netty.channel.ChannelPipeline; 6 | import org.jboss.netty.channel.ChannelPipelineFactory; 7 | import org.jboss.netty.channel.Channels; 8 | 9 | public class ConnectPipelineFactory implements ChannelPipelineFactory { 10 | 11 | @Override 12 | public ChannelPipeline getPipeline() throws Exception { 13 | final ConnectHandler handler = new ConnectHandler(); 14 | ChannelPipeline pipeline = Channels.pipeline(); 15 | pipeline.addLast("decoder", new HeaderDecoder()); 16 | pipeline.addLast("encoder", new HeaderEncoder()); 17 | pipeline.addLast("handler", handler); 18 | return pipeline; 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /gserver-gate/src/main/resources/gs-application.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /gserver-gate/src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | log4j.rootLogger=INFO,fileA,consoleA 2 | 3 | log4j.appender.fileA=org.apache.log4j.DailyRollingFileAppender 4 | log4j.appender.fileA.File=./logs/gate.log 5 | log4j.appender.fileA.append=true 6 | log4j.appender.fileA.ImmediateFlush=true 7 | log4j.appender.fileA.layout=org.apache.log4j.PatternLayout 8 | log4j.appender.fileA.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%t] %L::: %-5p %C - %m%n 9 | 10 | log4j.appender.consoleA=org.apache.log4j.ConsoleAppender 11 | log4j.appender.consoleA.layout=org.apache.log4j.PatternLayout 12 | log4j.appender.consoleA.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - %m%n -------------------------------------------------------------------------------- /gserver-gate/src/test/java/org/gserver/test/Client.java: -------------------------------------------------------------------------------- 1 | package org.gserver.test; 2 | 3 | import java.net.InetSocketAddress; 4 | import java.util.concurrent.Executors; 5 | 6 | import org.gserver.core.net.codec.HeaderDecoder; 7 | import org.gserver.core.net.codec.HeaderEncoder; 8 | import org.gserver.core.net.codec.encoder.ProtobufEncoder; 9 | import org.jboss.netty.bootstrap.ClientBootstrap; 10 | import org.jboss.netty.channel.ChannelFuture; 11 | import org.jboss.netty.channel.ChannelPipeline; 12 | import org.jboss.netty.channel.ChannelPipelineFactory; 13 | import org.jboss.netty.channel.Channels; 14 | import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory; 15 | 16 | public class Client { 17 | 18 | public static void main(String[] args) { 19 | ClientBootstrap cbApp = new ClientBootstrap( 20 | new NioClientSocketChannelFactory( 21 | Executors.newCachedThreadPool(), 22 | Executors.newCachedThreadPool())); 23 | final ClientHandler handler = new ClientHandler(); 24 | cbApp.setPipelineFactory(new ChannelPipelineFactory() { 25 | public ChannelPipeline getPipeline() { 26 | ChannelPipeline pipeline = Channels.pipeline(); 27 | pipeline.addLast("decoder", new HeaderDecoder()); 28 | pipeline.addLast("hEncoder", new HeaderEncoder()); 29 | pipeline.addLast("pEncoder", new ProtobufEncoder()); 30 | pipeline.addLast("handler", handler); 31 | return pipeline; 32 | } 33 | }); 34 | ChannelFuture future = cbApp.connect(new InetSocketAddress("localhost", 35 | 8000)); 36 | future.getChannel().getCloseFuture().awaitUninterruptibly(); 37 | cbApp.releaseExternalResources(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /gserver-gate/src/test/java/org/gserver/test/ClientHandler.java: -------------------------------------------------------------------------------- 1 | package org.gserver.test; 2 | 3 | import org.gserver.core.net.Header; 4 | import org.gserver.core.net.Message; 5 | import org.gserver.util.CommandEnum; 6 | import org.jboss.netty.channel.ChannelHandlerContext; 7 | import org.jboss.netty.channel.ChannelStateEvent; 8 | import org.jboss.netty.channel.MessageEvent; 9 | import org.jboss.netty.channel.SimpleChannelHandler; 10 | 11 | import protocol.BaseType.PBLogin; 12 | import protocol.ClientServerProtocol.C2SLogin; 13 | 14 | public class ClientHandler extends SimpleChannelHandler { 15 | 16 | @Override 17 | public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) 18 | throws Exception { 19 | PBLogin.Builder login = PBLogin.newBuilder(); 20 | login.setUser("zhaohui"); 21 | login.setPswd("11111111"); 22 | 23 | C2SLogin.Builder c2sLogin = C2SLogin.newBuilder().setLogin(login); 24 | 25 | Header header = new Header(); 26 | header.setSessionId(1); 27 | header.setCommandId(CommandEnum.C2S_LOGIN.getId()); 28 | Message message = new Message(header, c2sLogin.build().toByteArray()); 29 | e.getChannel().write(message); 30 | } 31 | 32 | @Override 33 | public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) 34 | throws Exception { 35 | Message message = (Message) e.getMessage(); 36 | System.out.println("cmd:" + message.getHeader().getCommandId()); 37 | System.out.println(message.getData()); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /gserver-logic/.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | /logs 3 | /.settings -------------------------------------------------------------------------------- /gserver-logic/logic-config/server-config.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | App1 5 | 2000 6 | 8021 7 | 8 | -------------------------------------------------------------------------------- /gserver-logic/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.gserver 8 | gserver 9 | 0.0.1-SNAPSHOT 10 | 11 | gserver-logic 12 | gserver-logic 13 | http://maven.apache.org 14 | 15 | UTF-8 16 | 17 | 18 | 19 | 20 | 21 | org.apache.maven.plugins 22 | maven-jar-plugin 23 | 2.3.2 24 | 25 | 26 | false 27 | 28 | true 29 | lib/ 30 | org.gserver.LogicStart 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | com.gserver 41 | gserver-services 42 | 0.0.1-SNAPSHOT 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /gserver-logic/shell/logic-startup.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | java -jar gserver-logic-0.0.1-SNAPSHOT.jar 3 | pause -------------------------------------------------------------------------------- /gserver-logic/src/main/java/org/gserver/LogicStart.java: -------------------------------------------------------------------------------- 1 | package org.gserver; 2 | 3 | import org.gserver.logic.LogicServer; 4 | 5 | public class LogicStart { 6 | 7 | public static void main(String[] args) { 8 | LogicServer logicServer = new LogicServer(); 9 | new Thread((Runnable) logicServer).start(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /gserver-logic/src/main/java/org/gserver/handler/Handler100001.java: -------------------------------------------------------------------------------- 1 | package org.gserver.handler; 2 | 3 | import org.gserver.core.exception.GsException; 4 | import org.gserver.core.net.Message; 5 | import org.gserver.util.CommandEnum; 6 | 7 | import protocol.ClientServerProtocol.C2SLogin; 8 | import protocol.ServerClientProtocol.S2CLogin; 9 | 10 | import com.google.protobuf.InvalidProtocolBufferException; 11 | 12 | public class Handler100001 extends AbstractHandler { 13 | 14 | @Override 15 | public void execute(Long roleId, Message request) throws GsException, 16 | InvalidProtocolBufferException { 17 | C2SLogin login = C2SLogin.parseFrom((byte[]) request.getData()); 18 | System.out.println(login.toString()); 19 | 20 | S2CLogin.Builder builder = S2CLogin.newBuilder(); 21 | builder.setResult(1); 22 | 23 | sendMessage(request.getSessionId(), CommandEnum.S2C_LOGIN, builder 24 | .build().toByteArray()); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /gserver-logic/src/main/java/org/gserver/logic/LogicHandler.java: -------------------------------------------------------------------------------- 1 | package org.gserver.logic; 2 | 3 | import org.apache.log4j.Logger; 4 | import org.gserver.core.exception.GsException; 5 | import org.gserver.core.handler.IHandler; 6 | import org.gserver.core.net.Message; 7 | import org.gserver.core.threadPool.AbstractWork; 8 | import org.gserver.core.threadPool.executor.OrderedQueuePoolExecutor; 9 | import org.gserver.core.util.ChannelPoolManager; 10 | import org.gserver.util.CommandEnum; 11 | import org.gserver.util.ErrorCode; 12 | import org.gserver.util.SpringContainer; 13 | import org.jboss.netty.channel.Channel; 14 | import org.jboss.netty.channel.ChannelHandlerContext; 15 | import org.jboss.netty.channel.ChannelStateEvent; 16 | import org.jboss.netty.channel.ExceptionEvent; 17 | import org.jboss.netty.channel.MessageEvent; 18 | import org.jboss.netty.channel.SimpleChannelHandler; 19 | 20 | import protocol.ServerClientProtocol.S2CErrorCode; 21 | 22 | /** 23 | * 协议处理器 1.创建sessionID // 2.接受客户端的消息进行转发 // 24 | * 25 | * @author zhaohui 26 | * 27 | */ 28 | public class LogicHandler extends SimpleChannelHandler { 29 | 30 | private final static Logger logger = Logger.getLogger(LogicHandler.class); 31 | private OrderedQueuePoolExecutor recvExcutor = new OrderedQueuePoolExecutor( 32 | "消息接收队列", 100, 10000); 33 | 34 | @Override 35 | public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) 36 | throws Exception { 37 | ChannelPoolManager.getInstance().addChannel(e.getChannel()); 38 | logger.info("connected:" + e.getChannel().toString()); 39 | } 40 | 41 | @Override 42 | public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) 43 | throws Exception { 44 | Message request = (Message) e.getMessage(); 45 | int sessionId = request.getHeader().getSessionId(); 46 | recvExcutor.addTask(sessionId, new MWork(request, e.getChannel())); 47 | } 48 | 49 | class MWork extends AbstractWork { 50 | /** 消息 **/ 51 | private Message request; 52 | /** 消息队列 **/ 53 | private Channel channel; 54 | 55 | public MWork(Message request, Channel channel) { 56 | this.request = request; 57 | this.channel = channel; 58 | } 59 | 60 | @Override 61 | public void run() { 62 | channel.write(processRequest(request)); 63 | } 64 | } 65 | 66 | /** 67 | * 处理请求 68 | * 69 | * @param request 70 | * 请求消息 71 | * @return 72 | */ 73 | private Message processRequest(Message request) { 74 | int cmdId = getCommandId(request); 75 | Message response = new Message(request.getHeader().clone()); 76 | try { 77 | IHandler handler = (IHandler) SpringContainer.getInstance() 78 | .getBeanById("handler" + cmdId); 79 | if (handler == null) { 80 | setErrorMsg(ErrorCode.PACKAGE_TAG_ERROR, response); 81 | return response; 82 | } 83 | handler.execute(request); 84 | } catch (GsException e) { 85 | setErrorMsg(e.getErrorCode(), response); 86 | } catch (Exception ex) { 87 | setErrorMsg(ErrorCode.SERVER_ERROR, response); 88 | logger.error("processRequest error", ex); 89 | } 90 | return response; 91 | } 92 | 93 | /** 94 | * 获取协议号 95 | * 96 | * @param message 97 | * 消息 98 | * @return 99 | */ 100 | private int getCommandId(Message message) { 101 | return message.getHeader().getCommandId(); 102 | } 103 | 104 | private void setErrorMsg(int errcode, Message response) { 105 | S2CErrorCode.Builder builder = S2CErrorCode.newBuilder(); 106 | builder.setErrorCode(errcode); 107 | response.setContent(CommandEnum.S2C_ERROR_CODE.getId(), builder.build() 108 | .toByteArray()); 109 | } 110 | 111 | @Override 112 | public void channelClosed(ChannelHandlerContext ctx, ChannelStateEvent e) 113 | throws Exception { 114 | ChannelPoolManager.getInstance().removeChannel(e.getChannel()); 115 | logger.info("channelClosed:" + e.getChannel().toString()); 116 | } 117 | 118 | @Override 119 | public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) { 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /gserver-logic/src/main/java/org/gserver/logic/LogicPipelineFactory.java: -------------------------------------------------------------------------------- 1 | package org.gserver.logic; 2 | 3 | import org.gserver.core.net.codec.HeaderDecoder; 4 | import org.gserver.core.net.codec.HeaderEncoder; 5 | import org.gserver.core.net.codec.encoder.ProtobufEncoder; 6 | import org.jboss.netty.channel.ChannelPipeline; 7 | import org.jboss.netty.channel.ChannelPipelineFactory; 8 | import org.jboss.netty.channel.Channels; 9 | 10 | public class LogicPipelineFactory implements ChannelPipelineFactory { 11 | 12 | @Override 13 | public ChannelPipeline getPipeline() throws Exception { 14 | final LogicHandler handler = new LogicHandler(); 15 | 16 | ChannelPipeline pipeline = Channels.pipeline(); 17 | pipeline.addLast("decoder", new HeaderDecoder()); 18 | 19 | pipeline.addLast("encoder", new HeaderEncoder()); 20 | pipeline.addLast("pEncoder", new ProtobufEncoder()); 21 | pipeline.addLast("handler", handler); 22 | return pipeline; 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /gserver-logic/src/main/java/org/gserver/logic/LogicServer.java: -------------------------------------------------------------------------------- 1 | package org.gserver.logic; 2 | 3 | import org.gserver.core.server.impl.Server; 4 | import org.gserver.util.ServerType; 5 | import org.gserver.util.SpringContainer; 6 | import org.jboss.netty.channel.ChannelPipelineFactory; 7 | 8 | public class LogicServer extends Server { 9 | 10 | private static final String DEFUALT_SERVER_CONFIG = "logic-config/server-config.xml"; 11 | 12 | public LogicServer() { 13 | this(DEFUALT_SERVER_CONFIG); 14 | } 15 | 16 | public LogicServer(String serverConfig) { 17 | super(serverConfig); 18 | } 19 | 20 | @Override 21 | protected void init() { 22 | super.init(); 23 | SpringContainer.getInstance().loadSpring(ServerType.LOGIC); 24 | } 25 | 26 | @Override 27 | protected ChannelPipelineFactory createPipelineFactory() { 28 | return new LogicPipelineFactory(); 29 | } 30 | 31 | @Override 32 | protected void stop() { 33 | 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /gserver-logic/src/main/resources/gs-handlers.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /gserver-logic/src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | log4j.rootLogger=INFO,fileA,consoleA 2 | 3 | log4j.appender.fileA=org.apache.log4j.DailyRollingFileAppender 4 | log4j.appender.fileA.File=./logs/logic.log 5 | log4j.appender.fileA.append=true 6 | log4j.appender.fileA.ImmediateFlush=true 7 | log4j.appender.fileA.layout=org.apache.log4j.PatternLayout 8 | log4j.appender.fileA.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%t] %L::: %-5p %C - %m%n 9 | 10 | log4j.appender.consoleA=org.apache.log4j.ConsoleAppender 11 | log4j.appender.consoleA.layout=org.apache.log4j.PatternLayout 12 | log4j.appender.consoleA.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} - %m%n -------------------------------------------------------------------------------- /gserver-redis/.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /gserver-redis/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.gserver 8 | gserver 9 | 0.0.1-SNAPSHOT 10 | 11 | gserver-redis 12 | gserver-redis 13 | http://maven.apache.org 14 | 15 | UTF-8 16 | 17 | 18 | 19 | 20 | redis.clients 21 | jedis 22 | 2.8.0 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /gserver-redis/src/main/java/org/gserver/redis/IRedisTemplateMethod.java: -------------------------------------------------------------------------------- 1 | package org.gserver.redis; 2 | 3 | import org.gserver.redis.persistence.AbstractRedisBean; 4 | 5 | /** 6 | * redis操作模板方法接口 7 | * 8 | * @author zhaohui 9 | * 10 | */ 11 | public interface IRedisTemplateMethod { 12 | 13 | /** 14 | * 创建新对象 15 | * 16 | * @param bean 17 | * 实例对象 18 | * @return 19 | */ 20 | public T create(T bean); 21 | 22 | public T create(String beanKey, T bean); 23 | 24 | /** 25 | * 查询对象 26 | * 27 | * @param key 28 | * 对象key 29 | * @param type 30 | * 对象类型 31 | * @return 32 | */ 33 | public T query(String key, Class type); 34 | 35 | public T query(long beanId, Class type); 36 | 37 | /** 38 | * 更新对象 39 | * 40 | * @param id 41 | * @param bean 42 | */ 43 | public void update(long id, AbstractRedisBean bean); 44 | 45 | public void update(String key, AbstractRedisBean bean); 46 | 47 | /** 48 | * 删除对象 49 | * 50 | * @param beanId 51 | * @param type 52 | */ 53 | public void delete(long beanId, Class type); 54 | 55 | public void delete(String key); 56 | 57 | public Long hset(String key, String field, String value); 58 | 59 | public String hget(String key, String field); 60 | 61 | public Long hdel(final String key, final String field); 62 | } 63 | -------------------------------------------------------------------------------- /gserver-redis/src/main/java/org/gserver/redis/RedisTemplateMethod.java: -------------------------------------------------------------------------------- 1 | package org.gserver.redis; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | import java.util.Map.Entry; 6 | 7 | import org.apache.log4j.Logger; 8 | import org.gserver.redis.accessor.IRedisAccessor; 9 | import org.gserver.redis.persistence.AbstractRedisBean; 10 | import org.gserver.redis.util.BeanUtil; 11 | import org.gserver.redis.util.KeyUtil; 12 | 13 | public class RedisTemplateMethod implements IRedisTemplateMethod { 14 | 15 | private static final Logger logger = Logger 16 | .getLogger(RedisTemplateMethod.class); 17 | 18 | private IRedisAccessor redisAccessor; 19 | 20 | @Override 21 | public T create(T bean) { 22 | long beanIncrId = redisAccessor.getSequence(bean.getClass().getName()); 23 | bean.setId(beanIncrId); 24 | String beanKey = KeyUtil.getRedisBeanKey(bean.getClass(), beanIncrId); 25 | return createBean(beanKey, bean); 26 | } 27 | 28 | @Override 29 | public T create(String beanKey, T bean) { 30 | Long beanIncrId = redisAccessor.getSequence(bean.getClass().getName()); 31 | bean.setId(beanIncrId); 32 | return createBean(beanKey, bean); 33 | } 34 | 35 | private T createBean(String beanKey, T bean) { 36 | Map beanMap = bean.transToMap(); 37 | try { 38 | long startTime = System.currentTimeMillis(); 39 | redisAccessor.setHashMapValue(beanKey, beanMap); 40 | long endTime = System.currentTimeMillis(); 41 | logger.debug("【createBean】:" + beanKey + ",costTime:" 42 | + (endTime - startTime)); 43 | } catch (Exception ex) { 44 | logger.error("createBean error", ex); 45 | } 46 | return bean; 47 | } 48 | 49 | @Override 50 | public void update(long id, AbstractRedisBean bean) { 51 | String key = KeyUtil.getRedisBeanKey(bean.getClass(), id); 52 | updateBean(key, bean); 53 | } 54 | 55 | @Override 56 | public void update(String key, AbstractRedisBean bean) { 57 | updateBean(key, bean); 58 | } 59 | 60 | private void updateBean(String key, AbstractRedisBean bean) { 61 | Map map = bean.getChangedMap(); 62 | if (map.size() <= 0) 63 | return; 64 | 65 | Map updateMap = new HashMap(); 66 | for (Entry param : map.entrySet()) { 67 | if (param.getValue() instanceof String) { 68 | updateMap.put(param.getKey(), param.getValue().toString()); 69 | } else { 70 | updateMap.put(param.getKey(), String.valueOf(param.getValue())); 71 | } 72 | } 73 | 74 | try { 75 | redisAccessor.setHashMapValue(key, updateMap); 76 | bean.clearChangeMap(); 77 | } catch (Exception ex) { 78 | logger.error("updateBean error", ex); 79 | } 80 | } 81 | 82 | @Override 83 | public T query(String key, Class type) { 84 | return queryBean(key, type); 85 | } 86 | 87 | @Override 88 | public T query(long beanId, Class type) { 89 | if (beanId <= 0) 90 | return null; 91 | String key = KeyUtil.getRedisBeanKey(type, beanId); 92 | return queryBean(key, type); 93 | } 94 | 95 | private T queryBean(String key, Class type) { 96 | Map beanMap = null; 97 | try { 98 | long startTime = System.currentTimeMillis(); 99 | beanMap = redisAccessor.getHashMapValue(key); 100 | long endTime = System.currentTimeMillis(); 101 | logger.debug("【queryBean】:" + key + ",costTime:" 102 | + (endTime - startTime)); 103 | } catch (Exception ex) { 104 | logger.error("queryBean error", ex); 105 | } 106 | String checkedId = beanMap.get("id"); 107 | if (checkedId != null && !checkedId.equals("")) 108 | return BeanUtil.reverse(beanMap, type); 109 | else { 110 | return null; 111 | } 112 | } 113 | 114 | public void setRedisAccessor(IRedisAccessor redisAccessor) { 115 | this.redisAccessor = redisAccessor; 116 | } 117 | 118 | @Override 119 | public void delete(long beanId, Class type) { 120 | String key = KeyUtil.getRedisBeanKey(type, beanId); 121 | delete(key); 122 | } 123 | 124 | @Override 125 | public void delete(String key) { 126 | redisAccessor.deleteKey(key); 127 | } 128 | 129 | @Override 130 | public Long hset(String key, String field, String value) { 131 | return redisAccessor.hset(key, field, value); 132 | } 133 | 134 | @Override 135 | public String hget(String key, String field) { 136 | return redisAccessor.hget(key, field); 137 | } 138 | 139 | @Override 140 | public Long hdel(String key, String field) { 141 | return redisAccessor.hdel(key, field); 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /gserver-redis/src/main/java/org/gserver/redis/accessor/AbstractRedisAccessor.java: -------------------------------------------------------------------------------- 1 | package org.gserver.redis.accessor; 2 | 3 | import org.apache.log4j.Logger; 4 | 5 | import redis.clients.jedis.Jedis; 6 | 7 | public abstract class AbstractRedisAccessor { 8 | 9 | private static final Logger logger = Logger 10 | .getLogger(AbstractRedisAccessor.class); 11 | 12 | private RedisFactory redisFactory; 13 | 14 | protected T execute(RedisCallback action) { 15 | T result = null; 16 | Jedis jedis = null; 17 | try { 18 | jedis = redisFactory.getJedis(); 19 | result = action.doIt(jedis); 20 | } catch (Exception e) { 21 | logger.error("redis doIt error", e); 22 | } finally { 23 | if (jedis != null) { 24 | redisFactory.close(jedis); 25 | } 26 | } 27 | return result; 28 | } 29 | 30 | public RedisFactory getRedisFactory() { 31 | return redisFactory; 32 | } 33 | 34 | public void setRedisFactory(RedisFactory redisFactory) { 35 | this.redisFactory = redisFactory; 36 | } 37 | 38 | } 39 | 40 | interface RedisCallback { 41 | T doIt(Jedis jedis); 42 | } 43 | -------------------------------------------------------------------------------- /gserver-redis/src/main/java/org/gserver/redis/accessor/IRedisAccessor.java: -------------------------------------------------------------------------------- 1 | package org.gserver.redis.accessor; 2 | 3 | import java.util.Map; 4 | 5 | import redis.clients.jedis.JedisPubSub; 6 | 7 | /** 8 | * redis连接器 9 | * 10 | * @author zhaohui 11 | * 12 | */ 13 | public interface IRedisAccessor { 14 | 15 | public Integer setHashMapValue(String key, Map values); 16 | 17 | public Map getHashMapValue(String key); 18 | 19 | /** 20 | * 获取指定key的序列号 21 | * 22 | * @param key 23 | * @return 24 | */ 25 | public long getSequence(final String key); 26 | 27 | /** 28 | * 删除指定的key 29 | * 30 | * @param keys 31 | */ 32 | public void deleteKey(final String... keys); 33 | 34 | /** 35 | * 发布消息 36 | * 37 | * @param channel 38 | * @param message 39 | * @return 40 | */ 41 | public Long publishMessage(final String channel, final String message); 42 | 43 | /** 44 | * 订阅消息 45 | * 46 | * @param listener 47 | * @param channels 48 | */ 49 | public void subscribe(final JedisPubSub listener, final String... channels); 50 | 51 | public Long hset(String key, String field, String value); 52 | 53 | public String hget(String key, String field); 54 | 55 | public Long hdel(final String key, final String field); 56 | 57 | } 58 | -------------------------------------------------------------------------------- /gserver-redis/src/main/java/org/gserver/redis/accessor/RedisAccessor.java: -------------------------------------------------------------------------------- 1 | package org.gserver.redis.accessor; 2 | 3 | import java.util.Map; 4 | 5 | import redis.clients.jedis.Jedis; 6 | import redis.clients.jedis.JedisPubSub; 7 | 8 | public class RedisAccessor extends AbstractRedisAccessor implements 9 | IRedisAccessor { 10 | 11 | @Override 12 | public Integer setHashMapValue(final String key, 13 | final Map values) { 14 | return execute(new RedisCallback() { 15 | @Override 16 | public Integer doIt(Jedis jedis) { 17 | jedis.hmset(key, values); 18 | return 1; 19 | } 20 | }); 21 | } 22 | 23 | @Override 24 | public Map getHashMapValue(final String key) { 25 | return execute(new RedisCallback>() { 26 | @Override 27 | public Map doIt(Jedis jedis) { 28 | return jedis.hgetAll(key); 29 | } 30 | }); 31 | } 32 | 33 | @Override 34 | public Long publishMessage(final String channel, final String message) { 35 | return execute(new RedisCallback() { 36 | @Override 37 | public Long doIt(Jedis jedis) { 38 | return jedis.publish(channel, message); 39 | } 40 | }); 41 | } 42 | 43 | @Override 44 | public void subscribe(final JedisPubSub listener, final String... channels) { 45 | execute(new RedisCallback() { 46 | @Override 47 | public Integer doIt(Jedis jedis) { 48 | jedis.subscribe(listener, channels); 49 | return 0; 50 | } 51 | }); 52 | } 53 | 54 | @Override 55 | public long getSequence(final String key) { 56 | return execute(new RedisCallback() { 57 | @Override 58 | public Long doIt(Jedis jedis) { 59 | return jedis.incr(key); 60 | } 61 | }); 62 | } 63 | 64 | public void deleteKey(final String... keys) { 65 | execute(new RedisCallback() { 66 | @Override 67 | public Object doIt(Jedis jedis) { 68 | jedis.del(keys); 69 | return null; 70 | } 71 | }); 72 | } 73 | 74 | @Override 75 | public Long hset(final String key, final String field, final String value) { 76 | return execute(new RedisCallback() { 77 | @Override 78 | public Long doIt(Jedis jedis) { 79 | return jedis.hset(key, field, value); 80 | } 81 | }); 82 | } 83 | 84 | @Override 85 | public String hget(final String key, final String field) { 86 | return execute(new RedisCallback() { 87 | @Override 88 | public String doIt(Jedis jedis) { 89 | return jedis.hget(key, field); 90 | } 91 | }); 92 | } 93 | 94 | public Long hdel(final String key, final String field) { 95 | return execute(new RedisCallback() { 96 | @Override 97 | public Long doIt(Jedis jedis) { 98 | return jedis.hdel(key, field); 99 | } 100 | }); 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /gserver-redis/src/main/java/org/gserver/redis/accessor/RedisFactory.java: -------------------------------------------------------------------------------- 1 | package org.gserver.redis.accessor; 2 | 3 | import redis.clients.jedis.Jedis; 4 | import redis.clients.jedis.JedisPool; 5 | 6 | /** 7 | * redis工厂类 8 | * 9 | * @author zhaohui 10 | * 11 | */ 12 | public class RedisFactory { 13 | private JedisPool jedisPool; 14 | 15 | /** 16 | * 获取redis实例 17 | * 18 | * @return 19 | */ 20 | public Jedis getJedis() { 21 | return jedisPool.getResource(); 22 | } 23 | 24 | /** 25 | * 关闭redis 26 | * 27 | * @param jedis 28 | */ 29 | public void close(Jedis jedis) { 30 | jedis.close(); 31 | } 32 | 33 | public JedisPool getJedisPool() { 34 | return jedisPool; 35 | } 36 | 37 | public void setJedisPool(JedisPool jedisPool) { 38 | this.jedisPool = jedisPool; 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /gserver-redis/src/main/java/org/gserver/redis/persistence/AbstractRedisBean.java: -------------------------------------------------------------------------------- 1 | package org.gserver.redis.persistence; 2 | 3 | import java.util.HashMap; 4 | import java.util.Iterator; 5 | import java.util.Map; 6 | import org.gserver.redis.util.BeanUtil; 7 | 8 | public abstract class AbstractRedisBean { 9 | 10 | protected long version;//版本号 11 | 12 | private long id;//编号 13 | 14 | @RedisBeanField(serialize = false) 15 | protected Map changedMap = new HashMap(); 16 | 17 | final public Map transToMap() { 18 | return BeanUtil.warp(this); 19 | } 20 | 21 | final public AbstractRedisBean transToBean(Map beanMap) { 22 | return BeanUtil.reverse(beanMap, this.getClass()); 23 | } 24 | 25 | public String toString() { 26 | return viewBeans(); 27 | } 28 | 29 | public String viewBeans() { 30 | Map beanFields = transToMap(); 31 | Iterator iter = beanFields.keySet().iterator(); 32 | StringBuffer sbuffer = new StringBuffer(); 33 | sbuffer.append("\n{ \n"); 34 | while (iter.hasNext()) { 35 | String tmpKey = iter.next(); 36 | String tmpVal = beanFields.get(tmpKey); 37 | sbuffer.append(" ").append(tmpKey).append(":").append(tmpVal) 38 | .append("\n"); 39 | } 40 | sbuffer.append("}"); 41 | return sbuffer.toString(); 42 | } 43 | 44 | public void clearChangeMap() { 45 | changedMap.clear(); 46 | } 47 | 48 | @RedisBeanField(serialize = false) 49 | final public Map getChangedMap() { 50 | return changedMap; 51 | } 52 | 53 | final public long getVersion() { 54 | return version; 55 | } 56 | 57 | final public void setVersion(long version) { 58 | this.version = version; 59 | } 60 | 61 | final public long getId() { 62 | return id; 63 | } 64 | 65 | final public void setId(long id) { 66 | this.id = id; 67 | } 68 | 69 | } 70 | -------------------------------------------------------------------------------- /gserver-redis/src/main/java/org/gserver/redis/persistence/RedisBeanField.java: -------------------------------------------------------------------------------- 1 | package org.gserver.redis.persistence; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Retention(RetentionPolicy.RUNTIME) 9 | @Target({ ElementType.METHOD, ElementType.FIELD }) 10 | public @interface RedisBeanField { 11 | boolean serialize() default false; 12 | } 13 | -------------------------------------------------------------------------------- /gserver-redis/src/main/java/org/gserver/redis/util/BeanUtil.java: -------------------------------------------------------------------------------- 1 | package org.gserver.redis.util; 2 | 3 | import java.beans.Introspector; 4 | import java.beans.PropertyDescriptor; 5 | import java.lang.reflect.Method; 6 | import java.util.HashMap; 7 | import java.util.Map; 8 | 9 | import org.apache.log4j.Logger; 10 | import org.gserver.redis.persistence.AbstractRedisBean; 11 | import org.gserver.redis.persistence.RedisBeanField; 12 | 13 | /** 14 | * Bean/Map 转换工具 15 | * 16 | * @author zhaohui 17 | * 18 | */ 19 | public class BeanUtil { 20 | private static Logger logger = Logger.getLogger(BeanUtil.class); 21 | private static final String CLASS = "class"; 22 | 23 | /** 24 | * 将指定的对象数据封装成map 25 | * 26 | * @param bean 27 | * 对象数据 28 | * @return 29 | */ 30 | @SuppressWarnings("all") 31 | public static Map warp(AbstractRedisBean bean) { 32 | Map propertyMap = new HashMap(); 33 | try { 34 | PropertyDescriptor[] ps = Introspector.getBeanInfo(bean.getClass()) 35 | .getPropertyDescriptors(); 36 | for (PropertyDescriptor propertyDescriptor : ps) { 37 | String propertyName = propertyDescriptor.getName(); 38 | if (propertyName != null && !propertyName.equals(CLASS)) { 39 | Method getter = propertyDescriptor.getReadMethod(); 40 | if (getter != null) { 41 | RedisBeanField mannota = getter 42 | .getAnnotation(RedisBeanField.class); 43 | if (mannota != null && mannota.serialize() == false) { 44 | continue; 45 | } 46 | propertyMap.put(propertyName, 47 | String.valueOf(getter.invoke(bean, null))); 48 | } 49 | } 50 | } 51 | } catch (Exception e) { 52 | logger.error(e); 53 | } 54 | return propertyMap; 55 | } 56 | 57 | /** 58 | * 将map转成指定的对象 59 | * 60 | * @param beanMap 61 | * map数据 62 | * @param clazz 63 | * 指定的类对象 64 | * @return 65 | */ 66 | public static T reverse( 67 | Map beanMap, Class clazz) { 68 | T bean = getRedisBean(clazz); 69 | try { 70 | PropertyDescriptor[] ps = Introspector.getBeanInfo(clazz) 71 | .getPropertyDescriptors(); 72 | for (PropertyDescriptor propertyDescriptor : ps) { 73 | String propertyName = propertyDescriptor.getName(); 74 | if (propertyName != null && !propertyName.equals(CLASS)) { 75 | Method setter = propertyDescriptor.getWriteMethod(); 76 | String value = beanMap.get(propertyName); 77 | String type = propertyDescriptor.getPropertyType() 78 | .getName(); 79 | if (setter != null && value != null 80 | && !value.equalsIgnoreCase("null")) { 81 | Object obj = value(value, type); 82 | if (obj != null) { 83 | setter.invoke(bean, obj); 84 | } 85 | } 86 | } 87 | } 88 | } catch (Exception e) { 89 | logger.error(e); 90 | e.printStackTrace(); 91 | } 92 | bean.clearChangeMap(); 93 | return bean; 94 | } 95 | 96 | /** 97 | * 将String类型数值转换成指定的类型 98 | * 99 | * @param value 100 | * 数值 101 | * @param type 102 | * 指定的类型 103 | * @return 104 | */ 105 | private static Object value(String value, String type) { 106 | if (type.equals("boolean")) { 107 | return Boolean.valueOf(value); 108 | } else if (type.equals("byte")) { 109 | return Byte.valueOf(value); 110 | } else if (type.equals("short")) { 111 | return Short.valueOf(value); 112 | } else if (type.equals("float")) { 113 | return Float.valueOf(value); 114 | } else if (type.equals("int")) { 115 | return Integer.valueOf(value); 116 | } else if (type.equals("java.lang.String")) { 117 | return value; 118 | } else if (type.equals("long")) { 119 | return Long.valueOf(value); 120 | } 121 | return null; 122 | } 123 | 124 | @SuppressWarnings("unchecked") 125 | private static T getRedisBean(Class _class) { 126 | try { 127 | return (T) Class.forName(_class.getName()).newInstance(); 128 | } catch (Exception e) { 129 | logger.error(e); 130 | } 131 | return null; 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /gserver-redis/src/main/java/org/gserver/redis/util/KeyUtil.java: -------------------------------------------------------------------------------- 1 | package org.gserver.redis.util; 2 | 3 | /** 4 | * 生成key工具类 5 | * 6 | * @author zhaohui 7 | * 8 | */ 9 | public class KeyUtil { 10 | 11 | public static final String Suffix = ":"; 12 | 13 | public static String getRedisBeanKey(Class _class, long beanId) { 14 | return _class.getName() + Suffix + beanId; 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /gserver-redis/src/main/resources/gs-context.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | classpath:redis.properties 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /gserver-redis/src/main/resources/gs-redis.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /gserver-redis/src/main/resources/redis.properties: -------------------------------------------------------------------------------- 1 | redis_connections=100 2 | redis.server.ip=127.0.0.1 3 | redis.server.port=6379 4 | 5 | redis.pool.maxTotal=50 6 | redis.pool.maxIdle=50 7 | #当池内没有返回对象时,最大等待时间 8 | redis.pool.maxWaitMillis=1000 9 | #当调用borrow Object方法时,是否进行有效性检查 10 | redis.pool.testOnBorrow=true 11 | #当调用return Object方法时,是否进行有效性检查 12 | redis.pool.testOnReturn=true -------------------------------------------------------------------------------- /gserver-services/.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /gserver-services/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.gserver 8 | gserver 9 | 0.0.1-SNAPSHOT 10 | 11 | gserver-services 12 | gserver-services 13 | http://maven.apache.org 14 | 15 | UTF-8 16 | 17 | 18 | 19 | 20 | com.gserver 21 | gserver-redis 22 | 0.0.1-SNAPSHOT 23 | 24 | 25 | com.gserver 26 | gserver-core 27 | 0.0.1-SNAPSHOT 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /gserver-services/src/main/java/org/gserver/dao/BaseDao.java: -------------------------------------------------------------------------------- 1 | package org.gserver.dao; 2 | 3 | import org.gserver.redis.IRedisTemplateMethod; 4 | 5 | public abstract class BaseDao { 6 | 7 | protected IRedisTemplateMethod redisTemplateMethod; 8 | 9 | public void setRedisTemplateMethod(IRedisTemplateMethod redisTemplateMethod) { 10 | this.redisTemplateMethod = redisTemplateMethod; 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /gserver-services/src/main/java/org/gserver/dao/IBaseDao.java: -------------------------------------------------------------------------------- 1 | package org.gserver.dao; 2 | 3 | 4 | public interface IBaseDao extends IRedisKey { 5 | 6 | /** 7 | * 获取指定ID对象 8 | * 9 | * @param id 10 | * 唯一ID 11 | * @return 12 | */ 13 | public T get(long id); 14 | 15 | /** 16 | * 添加对象 17 | * 18 | * @param bean 19 | */ 20 | public long add(T bean); 21 | 22 | /** 23 | * 更新对象 24 | * 25 | * @param bean 26 | */ 27 | public void update(T bean); 28 | 29 | /** 30 | * 删除对象 31 | * 32 | * @param id 33 | */ 34 | public void delete(long id); 35 | 36 | } 37 | -------------------------------------------------------------------------------- /gserver-services/src/main/java/org/gserver/dao/IRedisKey.java: -------------------------------------------------------------------------------- 1 | package org.gserver.dao; 2 | 3 | public interface IRedisKey { 4 | 5 | /** 所有玩家 **/ 6 | final static String sanguo_all_player_list = "sanguo.all:playerlist"; 7 | 8 | } 9 | -------------------------------------------------------------------------------- /gserver-services/src/main/java/org/gserver/handler/AbstractHandler.java: -------------------------------------------------------------------------------- 1 | package org.gserver.handler; 2 | 3 | import org.gserver.core.exception.GsException; 4 | import org.gserver.core.handler.IHandler; 5 | import org.gserver.core.net.Message; 6 | import org.gserver.services.SendMessageService; 7 | import org.gserver.services.SessionService; 8 | import org.gserver.util.CommandEnum; 9 | 10 | import com.google.protobuf.InvalidProtocolBufferException; 11 | 12 | public abstract class AbstractHandler implements IHandler { 13 | 14 | private SendMessageService sendMessageService; 15 | private SessionService sessionService; 16 | 17 | public void sendMessage(long roleId, CommandEnum command, byte data[]) { 18 | sendMessageService.sendMessage(roleId, command, data); 19 | } 20 | 21 | public void sendMessage(int sessionId, CommandEnum command, byte data[]) { 22 | sendMessageService.pushMessage(sessionId, command, data); 23 | } 24 | 25 | @Override 26 | public void execute(Message request) throws GsException, 27 | InvalidProtocolBufferException { 28 | Long roleId = sessionService.getRoleId(request.getHeader() 29 | .getSessionId()); 30 | execute(roleId, request); 31 | } 32 | 33 | protected abstract void execute(Long roleId, Message request) 34 | throws GsException, InvalidProtocolBufferException; 35 | 36 | public void setSendMessageService(SendMessageService sendMessageService) { 37 | this.sendMessageService = sendMessageService; 38 | } 39 | 40 | public void setSessionService(SessionService sessionService) { 41 | this.sessionService = sessionService; 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /gserver-services/src/main/java/org/gserver/services/SendMessageService.java: -------------------------------------------------------------------------------- 1 | package org.gserver.services; 2 | 3 | import org.apache.log4j.Logger; 4 | import org.gserver.core.net.Header; 5 | import org.gserver.core.net.Message; 6 | import org.gserver.core.util.ChannelPoolManager; 7 | import org.gserver.util.CommandEnum; 8 | import org.jboss.netty.channel.Channel; 9 | 10 | /** 11 | * 推送消息 12 | * 13 | * @author zhaohui 14 | * 15 | */ 16 | public class SendMessageService { 17 | 18 | private final static Logger logger = Logger 19 | .getLogger(SendMessageService.class); 20 | 21 | private SessionService sessionService; 22 | 23 | /** 24 | * 推送消息 25 | * 26 | * @param sessionId 27 | * 回话id 28 | * @param comId 29 | * 协议号 30 | * @param data 31 | * 二进制数据包 32 | */ 33 | public void pushMessage(Integer sessionId, CommandEnum command, byte[] data) { 34 | if (sessionId != null) { 35 | Header header = new Header(sessionId, command.getId()); 36 | Message message = new Message(header, data); 37 | 38 | writeMessage(message); 39 | } 40 | } 41 | 42 | /** 43 | * 发送消息 44 | * 45 | * @param roleId 46 | * @param command 47 | * @param data 48 | */ 49 | public void sendMessage(long roleId, CommandEnum command, byte[] data) { 50 | Integer sessionId = sessionService.getSessionId(roleId); 51 | pushMessage(sessionId, command, data); 52 | } 53 | 54 | private void writeMessage(Message message) { 55 | try { 56 | Channel channel = ChannelPoolManager.getInstance().getChannel(); 57 | channel.write(message); 58 | } catch (Exception e) { 59 | logger.error("push message error", e); 60 | } 61 | } 62 | 63 | public void setSessionService(SessionService sessionService) { 64 | this.sessionService = sessionService; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /gserver-services/src/main/java/org/gserver/services/SessionService.java: -------------------------------------------------------------------------------- 1 | package org.gserver.services; 2 | 3 | import org.gserver.redis.IRedisTemplateMethod; 4 | 5 | /** 6 | * session管理 7 | * 8 | * @author zhaohui 9 | * 10 | */ 11 | public class SessionService { 12 | 13 | private static final String player_session_relation = "player.session.relation"; 14 | private static final String session_player_relation = "session.player.relation"; 15 | 16 | private IRedisTemplateMethod redisTemplateMethod; 17 | 18 | /** 19 | * 获取指定玩家的sessionId 20 | * 21 | * @param roleId 22 | * @return 23 | */ 24 | public Integer getSessionId(long roleId) { 25 | String sessionId = redisTemplateMethod.hget(player_session_relation, 26 | String.valueOf(roleId)); 27 | if (sessionId == null) { 28 | return null; 29 | } 30 | return Integer.valueOf(sessionId); 31 | } 32 | 33 | /** 34 | * 通过session获取指定玩家 35 | * 36 | * @param sessionId 37 | * @return 38 | */ 39 | public Long getRoleId(int sessionId) { 40 | String roleId = redisTemplateMethod.hget(session_player_relation, 41 | String.valueOf(sessionId)); 42 | if (roleId == null) { 43 | return null; 44 | } 45 | return Long.valueOf(roleId); 46 | } 47 | 48 | /** 49 | * 从redis中移除session 50 | * 51 | * @param sessionId 52 | */ 53 | public void removeSession(int sessionId) { 54 | Long roleId = getRoleId(sessionId); 55 | if (roleId != null) { 56 | redisTemplateMethod.hdel(player_session_relation, 57 | String.valueOf(roleId)); 58 | } 59 | redisTemplateMethod.hdel(session_player_relation, 60 | String.valueOf(sessionId)); 61 | } 62 | 63 | /** 64 | * 向redis中添加session 65 | * 66 | * @param sessionId 67 | * @param roleId 68 | */ 69 | public void addSession(int sessionId, long roleId) { 70 | redisTemplateMethod.hset(player_session_relation, 71 | String.valueOf(roleId), String.valueOf(sessionId)); 72 | redisTemplateMethod.hset(session_player_relation, 73 | String.valueOf(sessionId), String.valueOf(roleId)); 74 | } 75 | 76 | public void setRedisTemplateMethod(IRedisTemplateMethod redisTemplateMethod) { 77 | this.redisTemplateMethod = redisTemplateMethod; 78 | } 79 | 80 | } 81 | -------------------------------------------------------------------------------- /gserver-services/src/main/java/org/gserver/util/CommandEnum.java: -------------------------------------------------------------------------------- 1 | package org.gserver.util; 2 | 3 | public enum CommandEnum { 4 | 5 | C2S_LOGIN(100001) 6 | ,S2C_ERROR_CODE(1000) 7 | ,S2C_LOGIN(100001) 8 | ; 9 | CommandEnum(int id){ 10 | this.id = id; 11 | } 12 | 13 | private int id; 14 | 15 | public int getId() { 16 | return id; 17 | } 18 | 19 | public String getName() { 20 | return this.toString(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /gserver-services/src/main/java/org/gserver/util/CommandEnumUtil.java: -------------------------------------------------------------------------------- 1 | package org.gserver.util; 2 | 3 | import java.util.HashMap; 4 | import java.util.Map; 5 | 6 | public class CommandEnumUtil { 7 | 8 | private static Map commandMap = new HashMap(); 9 | 10 | static { 11 | for (CommandEnum ce : CommandEnum.values()) { 12 | if (ce.getName().startsWith("C2S")) { 13 | commandMap.put(ce.getId(), ce); 14 | } 15 | } 16 | } 17 | 18 | public static boolean isValid(int commandId) { 19 | return commandMap.containsKey(commandId); 20 | } 21 | 22 | public static CommandEnum getCommand(int commandId) { 23 | return commandMap.get(commandId); 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /gserver-services/src/main/java/org/gserver/util/Components.java: -------------------------------------------------------------------------------- 1 | package org.gserver.util; 2 | 3 | import org.springframework.context.ApplicationContext; 4 | import org.springframework.context.ApplicationContextAware; 5 | 6 | public class Components implements ApplicationContextAware { 7 | 8 | private static ApplicationContext context; 9 | 10 | @Override 11 | public void setApplicationContext(ApplicationContext ctx) { 12 | Components.context = ctx; 13 | } 14 | 15 | public static Object getBeanById(String beanId) { 16 | return context.getBean(beanId); 17 | } 18 | 19 | } 20 | -------------------------------------------------------------------------------- /gserver-services/src/main/java/org/gserver/util/ErrorCode.java: -------------------------------------------------------------------------------- 1 | package org.gserver.util; 2 | 3 | public class ErrorCode { 4 | 5 | public static final int SERVER_ERROR = -100;//服务器内部错误 6 | public static final int PACKAGE_TAG_ERROR = -101;//非法协议包 7 | 8 | } 9 | -------------------------------------------------------------------------------- /gserver-services/src/main/java/org/gserver/util/ServerType.java: -------------------------------------------------------------------------------- 1 | package org.gserver.util; 2 | 3 | public enum ServerType { 4 | 5 | GATE(1), LOGIC(2); 6 | ServerType(int id) { 7 | this.id = id; 8 | } 9 | 10 | private int id; 11 | 12 | public int getId() { 13 | return id; 14 | } 15 | 16 | public String getName() { 17 | return this.toString(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /gserver-services/src/main/java/org/gserver/util/SpringContainer.java: -------------------------------------------------------------------------------- 1 | package org.gserver.util; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | import org.springframework.context.ApplicationContext; 7 | import org.springframework.context.support.ClassPathXmlApplicationContext; 8 | 9 | /** 10 | * 加载spring配置文件 11 | * 12 | * @author ksfzhaohui 13 | * 14 | */ 15 | public class SpringContainer { 16 | private static SpringContainer _instance = new SpringContainer(); 17 | private ApplicationContext ctx = null; 18 | 19 | private SpringContainer() { 20 | 21 | } 22 | 23 | public void loadSpring(ServerType type) { 24 | List cfigList = new ArrayList(); 25 | if (type == ServerType.GATE) { 26 | cfigList.add("gs-application.xml"); 27 | } else if (type == ServerType.LOGIC) { 28 | cfigList.add("gs-handlers.xml"); 29 | } 30 | cfigList.add("gs-context.xml"); 31 | cfigList.add("gs-service.xml"); 32 | cfigList.add("gs-redis.xml"); 33 | ctx = new ClassPathXmlApplicationContext( 34 | cfigList.toArray(new String[] {})); 35 | } 36 | 37 | public static SpringContainer getInstance() { 38 | return _instance; 39 | } 40 | 41 | public Object getBeanById(String beanId) { 42 | return ctx.getBean(beanId); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /gserver-services/src/main/java/protocol/BaseType.java: -------------------------------------------------------------------------------- 1 | // Generated by the protocol buffer compiler. DO NOT EDIT! 2 | // source: P_BaseType.proto 3 | 4 | package protocol; 5 | 6 | public final class BaseType { 7 | private BaseType() {} 8 | public static void registerAllExtensions( 9 | com.google.protobuf.ExtensionRegistry registry) { 10 | } 11 | public interface PBLoginOrBuilder 12 | extends com.google.protobuf.MessageOrBuilder { 13 | 14 | // required string user = 1; 15 | /** 16 | * required string user = 1; 17 | */ 18 | boolean hasUser(); 19 | /** 20 | * required string user = 1; 21 | */ 22 | java.lang.String getUser(); 23 | /** 24 | * required string user = 1; 25 | */ 26 | com.google.protobuf.ByteString 27 | getUserBytes(); 28 | 29 | // required string pswd = 2; 30 | /** 31 | * required string pswd = 2; 32 | */ 33 | boolean hasPswd(); 34 | /** 35 | * required string pswd = 2; 36 | */ 37 | java.lang.String getPswd(); 38 | /** 39 | * required string pswd = 2; 40 | */ 41 | com.google.protobuf.ByteString 42 | getPswdBytes(); 43 | } 44 | /** 45 | * Protobuf type {@code PBLogin} 46 | */ 47 | public static final class PBLogin extends 48 | com.google.protobuf.GeneratedMessage 49 | implements PBLoginOrBuilder { 50 | // Use PBLogin.newBuilder() to construct. 51 | private PBLogin(com.google.protobuf.GeneratedMessage.Builder builder) { 52 | super(builder); 53 | this.unknownFields = builder.getUnknownFields(); 54 | } 55 | private PBLogin(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } 56 | 57 | private static final PBLogin defaultInstance; 58 | public static PBLogin getDefaultInstance() { 59 | return defaultInstance; 60 | } 61 | 62 | public PBLogin getDefaultInstanceForType() { 63 | return defaultInstance; 64 | } 65 | 66 | private final com.google.protobuf.UnknownFieldSet unknownFields; 67 | @java.lang.Override 68 | public final com.google.protobuf.UnknownFieldSet 69 | getUnknownFields() { 70 | return this.unknownFields; 71 | } 72 | private PBLogin( 73 | com.google.protobuf.CodedInputStream input, 74 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 75 | throws com.google.protobuf.InvalidProtocolBufferException { 76 | initFields(); 77 | int mutable_bitField0_ = 0; 78 | com.google.protobuf.UnknownFieldSet.Builder unknownFields = 79 | com.google.protobuf.UnknownFieldSet.newBuilder(); 80 | try { 81 | boolean done = false; 82 | while (!done) { 83 | int tag = input.readTag(); 84 | switch (tag) { 85 | case 0: 86 | done = true; 87 | break; 88 | default: { 89 | if (!parseUnknownField(input, unknownFields, 90 | extensionRegistry, tag)) { 91 | done = true; 92 | } 93 | break; 94 | } 95 | case 10: { 96 | bitField0_ |= 0x00000001; 97 | user_ = input.readBytes(); 98 | break; 99 | } 100 | case 18: { 101 | bitField0_ |= 0x00000002; 102 | pswd_ = input.readBytes(); 103 | break; 104 | } 105 | } 106 | } 107 | } catch (com.google.protobuf.InvalidProtocolBufferException e) { 108 | throw e.setUnfinishedMessage(this); 109 | } catch (java.io.IOException e) { 110 | throw new com.google.protobuf.InvalidProtocolBufferException( 111 | e.getMessage()).setUnfinishedMessage(this); 112 | } finally { 113 | this.unknownFields = unknownFields.build(); 114 | makeExtensionsImmutable(); 115 | } 116 | } 117 | public static final com.google.protobuf.Descriptors.Descriptor 118 | getDescriptor() { 119 | return protocol.BaseType.internal_static_PBLogin_descriptor; 120 | } 121 | 122 | protected com.google.protobuf.GeneratedMessage.FieldAccessorTable 123 | internalGetFieldAccessorTable() { 124 | return protocol.BaseType.internal_static_PBLogin_fieldAccessorTable 125 | .ensureFieldAccessorsInitialized( 126 | protocol.BaseType.PBLogin.class, protocol.BaseType.PBLogin.Builder.class); 127 | } 128 | 129 | public static com.google.protobuf.Parser PARSER = 130 | new com.google.protobuf.AbstractParser() { 131 | public PBLogin parsePartialFrom( 132 | com.google.protobuf.CodedInputStream input, 133 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 134 | throws com.google.protobuf.InvalidProtocolBufferException { 135 | return new PBLogin(input, extensionRegistry); 136 | } 137 | }; 138 | 139 | @java.lang.Override 140 | public com.google.protobuf.Parser getParserForType() { 141 | return PARSER; 142 | } 143 | 144 | private int bitField0_; 145 | // required string user = 1; 146 | public static final int USER_FIELD_NUMBER = 1; 147 | private java.lang.Object user_; 148 | /** 149 | * required string user = 1; 150 | */ 151 | public boolean hasUser() { 152 | return ((bitField0_ & 0x00000001) == 0x00000001); 153 | } 154 | /** 155 | * required string user = 1; 156 | */ 157 | public java.lang.String getUser() { 158 | java.lang.Object ref = user_; 159 | if (ref instanceof java.lang.String) { 160 | return (java.lang.String) ref; 161 | } else { 162 | com.google.protobuf.ByteString bs = 163 | (com.google.protobuf.ByteString) ref; 164 | java.lang.String s = bs.toStringUtf8(); 165 | if (bs.isValidUtf8()) { 166 | user_ = s; 167 | } 168 | return s; 169 | } 170 | } 171 | /** 172 | * required string user = 1; 173 | */ 174 | public com.google.protobuf.ByteString 175 | getUserBytes() { 176 | java.lang.Object ref = user_; 177 | if (ref instanceof java.lang.String) { 178 | com.google.protobuf.ByteString b = 179 | com.google.protobuf.ByteString.copyFromUtf8( 180 | (java.lang.String) ref); 181 | user_ = b; 182 | return b; 183 | } else { 184 | return (com.google.protobuf.ByteString) ref; 185 | } 186 | } 187 | 188 | // required string pswd = 2; 189 | public static final int PSWD_FIELD_NUMBER = 2; 190 | private java.lang.Object pswd_; 191 | /** 192 | * required string pswd = 2; 193 | */ 194 | public boolean hasPswd() { 195 | return ((bitField0_ & 0x00000002) == 0x00000002); 196 | } 197 | /** 198 | * required string pswd = 2; 199 | */ 200 | public java.lang.String getPswd() { 201 | java.lang.Object ref = pswd_; 202 | if (ref instanceof java.lang.String) { 203 | return (java.lang.String) ref; 204 | } else { 205 | com.google.protobuf.ByteString bs = 206 | (com.google.protobuf.ByteString) ref; 207 | java.lang.String s = bs.toStringUtf8(); 208 | if (bs.isValidUtf8()) { 209 | pswd_ = s; 210 | } 211 | return s; 212 | } 213 | } 214 | /** 215 | * required string pswd = 2; 216 | */ 217 | public com.google.protobuf.ByteString 218 | getPswdBytes() { 219 | java.lang.Object ref = pswd_; 220 | if (ref instanceof java.lang.String) { 221 | com.google.protobuf.ByteString b = 222 | com.google.protobuf.ByteString.copyFromUtf8( 223 | (java.lang.String) ref); 224 | pswd_ = b; 225 | return b; 226 | } else { 227 | return (com.google.protobuf.ByteString) ref; 228 | } 229 | } 230 | 231 | private void initFields() { 232 | user_ = ""; 233 | pswd_ = ""; 234 | } 235 | private byte memoizedIsInitialized = -1; 236 | public final boolean isInitialized() { 237 | byte isInitialized = memoizedIsInitialized; 238 | if (isInitialized != -1) return isInitialized == 1; 239 | 240 | if (!hasUser()) { 241 | memoizedIsInitialized = 0; 242 | return false; 243 | } 244 | if (!hasPswd()) { 245 | memoizedIsInitialized = 0; 246 | return false; 247 | } 248 | memoizedIsInitialized = 1; 249 | return true; 250 | } 251 | 252 | public void writeTo(com.google.protobuf.CodedOutputStream output) 253 | throws java.io.IOException { 254 | getSerializedSize(); 255 | if (((bitField0_ & 0x00000001) == 0x00000001)) { 256 | output.writeBytes(1, getUserBytes()); 257 | } 258 | if (((bitField0_ & 0x00000002) == 0x00000002)) { 259 | output.writeBytes(2, getPswdBytes()); 260 | } 261 | getUnknownFields().writeTo(output); 262 | } 263 | 264 | private int memoizedSerializedSize = -1; 265 | public int getSerializedSize() { 266 | int size = memoizedSerializedSize; 267 | if (size != -1) return size; 268 | 269 | size = 0; 270 | if (((bitField0_ & 0x00000001) == 0x00000001)) { 271 | size += com.google.protobuf.CodedOutputStream 272 | .computeBytesSize(1, getUserBytes()); 273 | } 274 | if (((bitField0_ & 0x00000002) == 0x00000002)) { 275 | size += com.google.protobuf.CodedOutputStream 276 | .computeBytesSize(2, getPswdBytes()); 277 | } 278 | size += getUnknownFields().getSerializedSize(); 279 | memoizedSerializedSize = size; 280 | return size; 281 | } 282 | 283 | private static final long serialVersionUID = 0L; 284 | @java.lang.Override 285 | protected java.lang.Object writeReplace() 286 | throws java.io.ObjectStreamException { 287 | return super.writeReplace(); 288 | } 289 | 290 | public static protocol.BaseType.PBLogin parseFrom( 291 | com.google.protobuf.ByteString data) 292 | throws com.google.protobuf.InvalidProtocolBufferException { 293 | return PARSER.parseFrom(data); 294 | } 295 | public static protocol.BaseType.PBLogin parseFrom( 296 | com.google.protobuf.ByteString data, 297 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 298 | throws com.google.protobuf.InvalidProtocolBufferException { 299 | return PARSER.parseFrom(data, extensionRegistry); 300 | } 301 | public static protocol.BaseType.PBLogin parseFrom(byte[] data) 302 | throws com.google.protobuf.InvalidProtocolBufferException { 303 | return PARSER.parseFrom(data); 304 | } 305 | public static protocol.BaseType.PBLogin parseFrom( 306 | byte[] data, 307 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 308 | throws com.google.protobuf.InvalidProtocolBufferException { 309 | return PARSER.parseFrom(data, extensionRegistry); 310 | } 311 | public static protocol.BaseType.PBLogin parseFrom(java.io.InputStream input) 312 | throws java.io.IOException { 313 | return PARSER.parseFrom(input); 314 | } 315 | public static protocol.BaseType.PBLogin parseFrom( 316 | java.io.InputStream input, 317 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 318 | throws java.io.IOException { 319 | return PARSER.parseFrom(input, extensionRegistry); 320 | } 321 | public static protocol.BaseType.PBLogin parseDelimitedFrom(java.io.InputStream input) 322 | throws java.io.IOException { 323 | return PARSER.parseDelimitedFrom(input); 324 | } 325 | public static protocol.BaseType.PBLogin parseDelimitedFrom( 326 | java.io.InputStream input, 327 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 328 | throws java.io.IOException { 329 | return PARSER.parseDelimitedFrom(input, extensionRegistry); 330 | } 331 | public static protocol.BaseType.PBLogin parseFrom( 332 | com.google.protobuf.CodedInputStream input) 333 | throws java.io.IOException { 334 | return PARSER.parseFrom(input); 335 | } 336 | public static protocol.BaseType.PBLogin parseFrom( 337 | com.google.protobuf.CodedInputStream input, 338 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 339 | throws java.io.IOException { 340 | return PARSER.parseFrom(input, extensionRegistry); 341 | } 342 | 343 | public static Builder newBuilder() { return Builder.create(); } 344 | public Builder newBuilderForType() { return newBuilder(); } 345 | public static Builder newBuilder(protocol.BaseType.PBLogin prototype) { 346 | return newBuilder().mergeFrom(prototype); 347 | } 348 | public Builder toBuilder() { return newBuilder(this); } 349 | 350 | @java.lang.Override 351 | protected Builder newBuilderForType( 352 | com.google.protobuf.GeneratedMessage.BuilderParent parent) { 353 | Builder builder = new Builder(parent); 354 | return builder; 355 | } 356 | /** 357 | * Protobuf type {@code PBLogin} 358 | */ 359 | public static final class Builder extends 360 | com.google.protobuf.GeneratedMessage.Builder 361 | implements protocol.BaseType.PBLoginOrBuilder { 362 | public static final com.google.protobuf.Descriptors.Descriptor 363 | getDescriptor() { 364 | return protocol.BaseType.internal_static_PBLogin_descriptor; 365 | } 366 | 367 | protected com.google.protobuf.GeneratedMessage.FieldAccessorTable 368 | internalGetFieldAccessorTable() { 369 | return protocol.BaseType.internal_static_PBLogin_fieldAccessorTable 370 | .ensureFieldAccessorsInitialized( 371 | protocol.BaseType.PBLogin.class, protocol.BaseType.PBLogin.Builder.class); 372 | } 373 | 374 | // Construct using protocol.BaseType.PBLogin.newBuilder() 375 | private Builder() { 376 | maybeForceBuilderInitialization(); 377 | } 378 | 379 | private Builder( 380 | com.google.protobuf.GeneratedMessage.BuilderParent parent) { 381 | super(parent); 382 | maybeForceBuilderInitialization(); 383 | } 384 | private void maybeForceBuilderInitialization() { 385 | if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { 386 | } 387 | } 388 | private static Builder create() { 389 | return new Builder(); 390 | } 391 | 392 | public Builder clear() { 393 | super.clear(); 394 | user_ = ""; 395 | bitField0_ = (bitField0_ & ~0x00000001); 396 | pswd_ = ""; 397 | bitField0_ = (bitField0_ & ~0x00000002); 398 | return this; 399 | } 400 | 401 | public Builder clone() { 402 | return create().mergeFrom(buildPartial()); 403 | } 404 | 405 | public com.google.protobuf.Descriptors.Descriptor 406 | getDescriptorForType() { 407 | return protocol.BaseType.internal_static_PBLogin_descriptor; 408 | } 409 | 410 | public protocol.BaseType.PBLogin getDefaultInstanceForType() { 411 | return protocol.BaseType.PBLogin.getDefaultInstance(); 412 | } 413 | 414 | public protocol.BaseType.PBLogin build() { 415 | protocol.BaseType.PBLogin result = buildPartial(); 416 | if (!result.isInitialized()) { 417 | throw newUninitializedMessageException(result); 418 | } 419 | return result; 420 | } 421 | 422 | public protocol.BaseType.PBLogin buildPartial() { 423 | protocol.BaseType.PBLogin result = new protocol.BaseType.PBLogin(this); 424 | int from_bitField0_ = bitField0_; 425 | int to_bitField0_ = 0; 426 | if (((from_bitField0_ & 0x00000001) == 0x00000001)) { 427 | to_bitField0_ |= 0x00000001; 428 | } 429 | result.user_ = user_; 430 | if (((from_bitField0_ & 0x00000002) == 0x00000002)) { 431 | to_bitField0_ |= 0x00000002; 432 | } 433 | result.pswd_ = pswd_; 434 | result.bitField0_ = to_bitField0_; 435 | onBuilt(); 436 | return result; 437 | } 438 | 439 | public Builder mergeFrom(com.google.protobuf.Message other) { 440 | if (other instanceof protocol.BaseType.PBLogin) { 441 | return mergeFrom((protocol.BaseType.PBLogin)other); 442 | } else { 443 | super.mergeFrom(other); 444 | return this; 445 | } 446 | } 447 | 448 | public Builder mergeFrom(protocol.BaseType.PBLogin other) { 449 | if (other == protocol.BaseType.PBLogin.getDefaultInstance()) return this; 450 | if (other.hasUser()) { 451 | bitField0_ |= 0x00000001; 452 | user_ = other.user_; 453 | onChanged(); 454 | } 455 | if (other.hasPswd()) { 456 | bitField0_ |= 0x00000002; 457 | pswd_ = other.pswd_; 458 | onChanged(); 459 | } 460 | this.mergeUnknownFields(other.getUnknownFields()); 461 | return this; 462 | } 463 | 464 | public final boolean isInitialized() { 465 | if (!hasUser()) { 466 | 467 | return false; 468 | } 469 | if (!hasPswd()) { 470 | 471 | return false; 472 | } 473 | return true; 474 | } 475 | 476 | public Builder mergeFrom( 477 | com.google.protobuf.CodedInputStream input, 478 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 479 | throws java.io.IOException { 480 | protocol.BaseType.PBLogin parsedMessage = null; 481 | try { 482 | parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); 483 | } catch (com.google.protobuf.InvalidProtocolBufferException e) { 484 | parsedMessage = (protocol.BaseType.PBLogin) e.getUnfinishedMessage(); 485 | throw e; 486 | } finally { 487 | if (parsedMessage != null) { 488 | mergeFrom(parsedMessage); 489 | } 490 | } 491 | return this; 492 | } 493 | private int bitField0_; 494 | 495 | // required string user = 1; 496 | private java.lang.Object user_ = ""; 497 | /** 498 | * required string user = 1; 499 | */ 500 | public boolean hasUser() { 501 | return ((bitField0_ & 0x00000001) == 0x00000001); 502 | } 503 | /** 504 | * required string user = 1; 505 | */ 506 | public java.lang.String getUser() { 507 | java.lang.Object ref = user_; 508 | if (!(ref instanceof java.lang.String)) { 509 | java.lang.String s = ((com.google.protobuf.ByteString) ref) 510 | .toStringUtf8(); 511 | user_ = s; 512 | return s; 513 | } else { 514 | return (java.lang.String) ref; 515 | } 516 | } 517 | /** 518 | * required string user = 1; 519 | */ 520 | public com.google.protobuf.ByteString 521 | getUserBytes() { 522 | java.lang.Object ref = user_; 523 | if (ref instanceof String) { 524 | com.google.protobuf.ByteString b = 525 | com.google.protobuf.ByteString.copyFromUtf8( 526 | (java.lang.String) ref); 527 | user_ = b; 528 | return b; 529 | } else { 530 | return (com.google.protobuf.ByteString) ref; 531 | } 532 | } 533 | /** 534 | * required string user = 1; 535 | */ 536 | public Builder setUser( 537 | java.lang.String value) { 538 | if (value == null) { 539 | throw new NullPointerException(); 540 | } 541 | bitField0_ |= 0x00000001; 542 | user_ = value; 543 | onChanged(); 544 | return this; 545 | } 546 | /** 547 | * required string user = 1; 548 | */ 549 | public Builder clearUser() { 550 | bitField0_ = (bitField0_ & ~0x00000001); 551 | user_ = getDefaultInstance().getUser(); 552 | onChanged(); 553 | return this; 554 | } 555 | /** 556 | * required string user = 1; 557 | */ 558 | public Builder setUserBytes( 559 | com.google.protobuf.ByteString value) { 560 | if (value == null) { 561 | throw new NullPointerException(); 562 | } 563 | bitField0_ |= 0x00000001; 564 | user_ = value; 565 | onChanged(); 566 | return this; 567 | } 568 | 569 | // required string pswd = 2; 570 | private java.lang.Object pswd_ = ""; 571 | /** 572 | * required string pswd = 2; 573 | */ 574 | public boolean hasPswd() { 575 | return ((bitField0_ & 0x00000002) == 0x00000002); 576 | } 577 | /** 578 | * required string pswd = 2; 579 | */ 580 | public java.lang.String getPswd() { 581 | java.lang.Object ref = pswd_; 582 | if (!(ref instanceof java.lang.String)) { 583 | java.lang.String s = ((com.google.protobuf.ByteString) ref) 584 | .toStringUtf8(); 585 | pswd_ = s; 586 | return s; 587 | } else { 588 | return (java.lang.String) ref; 589 | } 590 | } 591 | /** 592 | * required string pswd = 2; 593 | */ 594 | public com.google.protobuf.ByteString 595 | getPswdBytes() { 596 | java.lang.Object ref = pswd_; 597 | if (ref instanceof String) { 598 | com.google.protobuf.ByteString b = 599 | com.google.protobuf.ByteString.copyFromUtf8( 600 | (java.lang.String) ref); 601 | pswd_ = b; 602 | return b; 603 | } else { 604 | return (com.google.protobuf.ByteString) ref; 605 | } 606 | } 607 | /** 608 | * required string pswd = 2; 609 | */ 610 | public Builder setPswd( 611 | java.lang.String value) { 612 | if (value == null) { 613 | throw new NullPointerException(); 614 | } 615 | bitField0_ |= 0x00000002; 616 | pswd_ = value; 617 | onChanged(); 618 | return this; 619 | } 620 | /** 621 | * required string pswd = 2; 622 | */ 623 | public Builder clearPswd() { 624 | bitField0_ = (bitField0_ & ~0x00000002); 625 | pswd_ = getDefaultInstance().getPswd(); 626 | onChanged(); 627 | return this; 628 | } 629 | /** 630 | * required string pswd = 2; 631 | */ 632 | public Builder setPswdBytes( 633 | com.google.protobuf.ByteString value) { 634 | if (value == null) { 635 | throw new NullPointerException(); 636 | } 637 | bitField0_ |= 0x00000002; 638 | pswd_ = value; 639 | onChanged(); 640 | return this; 641 | } 642 | 643 | // @@protoc_insertion_point(builder_scope:PBLogin) 644 | } 645 | 646 | static { 647 | defaultInstance = new PBLogin(true); 648 | defaultInstance.initFields(); 649 | } 650 | 651 | // @@protoc_insertion_point(class_scope:PBLogin) 652 | } 653 | 654 | private static com.google.protobuf.Descriptors.Descriptor 655 | internal_static_PBLogin_descriptor; 656 | private static 657 | com.google.protobuf.GeneratedMessage.FieldAccessorTable 658 | internal_static_PBLogin_fieldAccessorTable; 659 | 660 | public static com.google.protobuf.Descriptors.FileDescriptor 661 | getDescriptor() { 662 | return descriptor; 663 | } 664 | private static com.google.protobuf.Descriptors.FileDescriptor 665 | descriptor; 666 | static { 667 | java.lang.String[] descriptorData = { 668 | "\n\020P_BaseType.proto\"%\n\007PBLogin\022\014\n\004user\030\001 " + 669 | "\002(\t\022\014\n\004pswd\030\002 \002(\tB\024\n\010protocolB\010BaseType" 670 | }; 671 | com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = 672 | new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { 673 | public com.google.protobuf.ExtensionRegistry assignDescriptors( 674 | com.google.protobuf.Descriptors.FileDescriptor root) { 675 | descriptor = root; 676 | internal_static_PBLogin_descriptor = 677 | getDescriptor().getMessageTypes().get(0); 678 | internal_static_PBLogin_fieldAccessorTable = new 679 | com.google.protobuf.GeneratedMessage.FieldAccessorTable( 680 | internal_static_PBLogin_descriptor, 681 | new java.lang.String[] { "User", "Pswd", }); 682 | return null; 683 | } 684 | }; 685 | com.google.protobuf.Descriptors.FileDescriptor 686 | .internalBuildGeneratedFileFrom(descriptorData, 687 | new com.google.protobuf.Descriptors.FileDescriptor[] { 688 | }, assigner); 689 | } 690 | 691 | // @@protoc_insertion_point(outer_class_scope) 692 | } 693 | -------------------------------------------------------------------------------- /gserver-services/src/main/java/protocol/ClientServerProtocol.java: -------------------------------------------------------------------------------- 1 | // Generated by the protocol buffer compiler. DO NOT EDIT! 2 | // source: P_ClientServer.proto 3 | 4 | package protocol; 5 | 6 | public final class ClientServerProtocol { 7 | private ClientServerProtocol() {} 8 | public static void registerAllExtensions( 9 | com.google.protobuf.ExtensionRegistry registry) { 10 | } 11 | public interface C2SLoginOrBuilder 12 | extends com.google.protobuf.MessageOrBuilder { 13 | 14 | // required .PBLogin login = 1; 15 | /** 16 | * required .PBLogin login = 1; 17 | */ 18 | boolean hasLogin(); 19 | /** 20 | * required .PBLogin login = 1; 21 | */ 22 | protocol.BaseType.PBLogin getLogin(); 23 | /** 24 | * required .PBLogin login = 1; 25 | */ 26 | protocol.BaseType.PBLoginOrBuilder getLoginOrBuilder(); 27 | } 28 | /** 29 | * Protobuf type {@code C2SLogin} 30 | */ 31 | public static final class C2SLogin extends 32 | com.google.protobuf.GeneratedMessage 33 | implements C2SLoginOrBuilder { 34 | // Use C2SLogin.newBuilder() to construct. 35 | private C2SLogin(com.google.protobuf.GeneratedMessage.Builder builder) { 36 | super(builder); 37 | this.unknownFields = builder.getUnknownFields(); 38 | } 39 | private C2SLogin(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } 40 | 41 | private static final C2SLogin defaultInstance; 42 | public static C2SLogin getDefaultInstance() { 43 | return defaultInstance; 44 | } 45 | 46 | public C2SLogin getDefaultInstanceForType() { 47 | return defaultInstance; 48 | } 49 | 50 | private final com.google.protobuf.UnknownFieldSet unknownFields; 51 | @java.lang.Override 52 | public final com.google.protobuf.UnknownFieldSet 53 | getUnknownFields() { 54 | return this.unknownFields; 55 | } 56 | private C2SLogin( 57 | com.google.protobuf.CodedInputStream input, 58 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 59 | throws com.google.protobuf.InvalidProtocolBufferException { 60 | initFields(); 61 | int mutable_bitField0_ = 0; 62 | com.google.protobuf.UnknownFieldSet.Builder unknownFields = 63 | com.google.protobuf.UnknownFieldSet.newBuilder(); 64 | try { 65 | boolean done = false; 66 | while (!done) { 67 | int tag = input.readTag(); 68 | switch (tag) { 69 | case 0: 70 | done = true; 71 | break; 72 | default: { 73 | if (!parseUnknownField(input, unknownFields, 74 | extensionRegistry, tag)) { 75 | done = true; 76 | } 77 | break; 78 | } 79 | case 10: { 80 | protocol.BaseType.PBLogin.Builder subBuilder = null; 81 | if (((bitField0_ & 0x00000001) == 0x00000001)) { 82 | subBuilder = login_.toBuilder(); 83 | } 84 | login_ = input.readMessage(protocol.BaseType.PBLogin.PARSER, extensionRegistry); 85 | if (subBuilder != null) { 86 | subBuilder.mergeFrom(login_); 87 | login_ = subBuilder.buildPartial(); 88 | } 89 | bitField0_ |= 0x00000001; 90 | break; 91 | } 92 | } 93 | } 94 | } catch (com.google.protobuf.InvalidProtocolBufferException e) { 95 | throw e.setUnfinishedMessage(this); 96 | } catch (java.io.IOException e) { 97 | throw new com.google.protobuf.InvalidProtocolBufferException( 98 | e.getMessage()).setUnfinishedMessage(this); 99 | } finally { 100 | this.unknownFields = unknownFields.build(); 101 | makeExtensionsImmutable(); 102 | } 103 | } 104 | public static final com.google.protobuf.Descriptors.Descriptor 105 | getDescriptor() { 106 | return protocol.ClientServerProtocol.internal_static_C2SLogin_descriptor; 107 | } 108 | 109 | protected com.google.protobuf.GeneratedMessage.FieldAccessorTable 110 | internalGetFieldAccessorTable() { 111 | return protocol.ClientServerProtocol.internal_static_C2SLogin_fieldAccessorTable 112 | .ensureFieldAccessorsInitialized( 113 | protocol.ClientServerProtocol.C2SLogin.class, protocol.ClientServerProtocol.C2SLogin.Builder.class); 114 | } 115 | 116 | public static com.google.protobuf.Parser PARSER = 117 | new com.google.protobuf.AbstractParser() { 118 | public C2SLogin parsePartialFrom( 119 | com.google.protobuf.CodedInputStream input, 120 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 121 | throws com.google.protobuf.InvalidProtocolBufferException { 122 | return new C2SLogin(input, extensionRegistry); 123 | } 124 | }; 125 | 126 | @java.lang.Override 127 | public com.google.protobuf.Parser getParserForType() { 128 | return PARSER; 129 | } 130 | 131 | private int bitField0_; 132 | // required .PBLogin login = 1; 133 | public static final int LOGIN_FIELD_NUMBER = 1; 134 | private protocol.BaseType.PBLogin login_; 135 | /** 136 | * required .PBLogin login = 1; 137 | */ 138 | public boolean hasLogin() { 139 | return ((bitField0_ & 0x00000001) == 0x00000001); 140 | } 141 | /** 142 | * required .PBLogin login = 1; 143 | */ 144 | public protocol.BaseType.PBLogin getLogin() { 145 | return login_; 146 | } 147 | /** 148 | * required .PBLogin login = 1; 149 | */ 150 | public protocol.BaseType.PBLoginOrBuilder getLoginOrBuilder() { 151 | return login_; 152 | } 153 | 154 | private void initFields() { 155 | login_ = protocol.BaseType.PBLogin.getDefaultInstance(); 156 | } 157 | private byte memoizedIsInitialized = -1; 158 | public final boolean isInitialized() { 159 | byte isInitialized = memoizedIsInitialized; 160 | if (isInitialized != -1) return isInitialized == 1; 161 | 162 | if (!hasLogin()) { 163 | memoizedIsInitialized = 0; 164 | return false; 165 | } 166 | if (!getLogin().isInitialized()) { 167 | memoizedIsInitialized = 0; 168 | return false; 169 | } 170 | memoizedIsInitialized = 1; 171 | return true; 172 | } 173 | 174 | public void writeTo(com.google.protobuf.CodedOutputStream output) 175 | throws java.io.IOException { 176 | getSerializedSize(); 177 | if (((bitField0_ & 0x00000001) == 0x00000001)) { 178 | output.writeMessage(1, login_); 179 | } 180 | getUnknownFields().writeTo(output); 181 | } 182 | 183 | private int memoizedSerializedSize = -1; 184 | public int getSerializedSize() { 185 | int size = memoizedSerializedSize; 186 | if (size != -1) return size; 187 | 188 | size = 0; 189 | if (((bitField0_ & 0x00000001) == 0x00000001)) { 190 | size += com.google.protobuf.CodedOutputStream 191 | .computeMessageSize(1, login_); 192 | } 193 | size += getUnknownFields().getSerializedSize(); 194 | memoizedSerializedSize = size; 195 | return size; 196 | } 197 | 198 | private static final long serialVersionUID = 0L; 199 | @java.lang.Override 200 | protected java.lang.Object writeReplace() 201 | throws java.io.ObjectStreamException { 202 | return super.writeReplace(); 203 | } 204 | 205 | public static protocol.ClientServerProtocol.C2SLogin parseFrom( 206 | com.google.protobuf.ByteString data) 207 | throws com.google.protobuf.InvalidProtocolBufferException { 208 | return PARSER.parseFrom(data); 209 | } 210 | public static protocol.ClientServerProtocol.C2SLogin parseFrom( 211 | com.google.protobuf.ByteString data, 212 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 213 | throws com.google.protobuf.InvalidProtocolBufferException { 214 | return PARSER.parseFrom(data, extensionRegistry); 215 | } 216 | public static protocol.ClientServerProtocol.C2SLogin parseFrom(byte[] data) 217 | throws com.google.protobuf.InvalidProtocolBufferException { 218 | return PARSER.parseFrom(data); 219 | } 220 | public static protocol.ClientServerProtocol.C2SLogin parseFrom( 221 | byte[] data, 222 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 223 | throws com.google.protobuf.InvalidProtocolBufferException { 224 | return PARSER.parseFrom(data, extensionRegistry); 225 | } 226 | public static protocol.ClientServerProtocol.C2SLogin parseFrom(java.io.InputStream input) 227 | throws java.io.IOException { 228 | return PARSER.parseFrom(input); 229 | } 230 | public static protocol.ClientServerProtocol.C2SLogin parseFrom( 231 | java.io.InputStream input, 232 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 233 | throws java.io.IOException { 234 | return PARSER.parseFrom(input, extensionRegistry); 235 | } 236 | public static protocol.ClientServerProtocol.C2SLogin parseDelimitedFrom(java.io.InputStream input) 237 | throws java.io.IOException { 238 | return PARSER.parseDelimitedFrom(input); 239 | } 240 | public static protocol.ClientServerProtocol.C2SLogin parseDelimitedFrom( 241 | java.io.InputStream input, 242 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 243 | throws java.io.IOException { 244 | return PARSER.parseDelimitedFrom(input, extensionRegistry); 245 | } 246 | public static protocol.ClientServerProtocol.C2SLogin parseFrom( 247 | com.google.protobuf.CodedInputStream input) 248 | throws java.io.IOException { 249 | return PARSER.parseFrom(input); 250 | } 251 | public static protocol.ClientServerProtocol.C2SLogin parseFrom( 252 | com.google.protobuf.CodedInputStream input, 253 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 254 | throws java.io.IOException { 255 | return PARSER.parseFrom(input, extensionRegistry); 256 | } 257 | 258 | public static Builder newBuilder() { return Builder.create(); } 259 | public Builder newBuilderForType() { return newBuilder(); } 260 | public static Builder newBuilder(protocol.ClientServerProtocol.C2SLogin prototype) { 261 | return newBuilder().mergeFrom(prototype); 262 | } 263 | public Builder toBuilder() { return newBuilder(this); } 264 | 265 | @java.lang.Override 266 | protected Builder newBuilderForType( 267 | com.google.protobuf.GeneratedMessage.BuilderParent parent) { 268 | Builder builder = new Builder(parent); 269 | return builder; 270 | } 271 | /** 272 | * Protobuf type {@code C2SLogin} 273 | */ 274 | public static final class Builder extends 275 | com.google.protobuf.GeneratedMessage.Builder 276 | implements protocol.ClientServerProtocol.C2SLoginOrBuilder { 277 | public static final com.google.protobuf.Descriptors.Descriptor 278 | getDescriptor() { 279 | return protocol.ClientServerProtocol.internal_static_C2SLogin_descriptor; 280 | } 281 | 282 | protected com.google.protobuf.GeneratedMessage.FieldAccessorTable 283 | internalGetFieldAccessorTable() { 284 | return protocol.ClientServerProtocol.internal_static_C2SLogin_fieldAccessorTable 285 | .ensureFieldAccessorsInitialized( 286 | protocol.ClientServerProtocol.C2SLogin.class, protocol.ClientServerProtocol.C2SLogin.Builder.class); 287 | } 288 | 289 | // Construct using protocol.ClientServerProtocol.C2SLogin.newBuilder() 290 | private Builder() { 291 | maybeForceBuilderInitialization(); 292 | } 293 | 294 | private Builder( 295 | com.google.protobuf.GeneratedMessage.BuilderParent parent) { 296 | super(parent); 297 | maybeForceBuilderInitialization(); 298 | } 299 | private void maybeForceBuilderInitialization() { 300 | if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { 301 | getLoginFieldBuilder(); 302 | } 303 | } 304 | private static Builder create() { 305 | return new Builder(); 306 | } 307 | 308 | public Builder clear() { 309 | super.clear(); 310 | if (loginBuilder_ == null) { 311 | login_ = protocol.BaseType.PBLogin.getDefaultInstance(); 312 | } else { 313 | loginBuilder_.clear(); 314 | } 315 | bitField0_ = (bitField0_ & ~0x00000001); 316 | return this; 317 | } 318 | 319 | public Builder clone() { 320 | return create().mergeFrom(buildPartial()); 321 | } 322 | 323 | public com.google.protobuf.Descriptors.Descriptor 324 | getDescriptorForType() { 325 | return protocol.ClientServerProtocol.internal_static_C2SLogin_descriptor; 326 | } 327 | 328 | public protocol.ClientServerProtocol.C2SLogin getDefaultInstanceForType() { 329 | return protocol.ClientServerProtocol.C2SLogin.getDefaultInstance(); 330 | } 331 | 332 | public protocol.ClientServerProtocol.C2SLogin build() { 333 | protocol.ClientServerProtocol.C2SLogin result = buildPartial(); 334 | if (!result.isInitialized()) { 335 | throw newUninitializedMessageException(result); 336 | } 337 | return result; 338 | } 339 | 340 | public protocol.ClientServerProtocol.C2SLogin buildPartial() { 341 | protocol.ClientServerProtocol.C2SLogin result = new protocol.ClientServerProtocol.C2SLogin(this); 342 | int from_bitField0_ = bitField0_; 343 | int to_bitField0_ = 0; 344 | if (((from_bitField0_ & 0x00000001) == 0x00000001)) { 345 | to_bitField0_ |= 0x00000001; 346 | } 347 | if (loginBuilder_ == null) { 348 | result.login_ = login_; 349 | } else { 350 | result.login_ = loginBuilder_.build(); 351 | } 352 | result.bitField0_ = to_bitField0_; 353 | onBuilt(); 354 | return result; 355 | } 356 | 357 | public Builder mergeFrom(com.google.protobuf.Message other) { 358 | if (other instanceof protocol.ClientServerProtocol.C2SLogin) { 359 | return mergeFrom((protocol.ClientServerProtocol.C2SLogin)other); 360 | } else { 361 | super.mergeFrom(other); 362 | return this; 363 | } 364 | } 365 | 366 | public Builder mergeFrom(protocol.ClientServerProtocol.C2SLogin other) { 367 | if (other == protocol.ClientServerProtocol.C2SLogin.getDefaultInstance()) return this; 368 | if (other.hasLogin()) { 369 | mergeLogin(other.getLogin()); 370 | } 371 | this.mergeUnknownFields(other.getUnknownFields()); 372 | return this; 373 | } 374 | 375 | public final boolean isInitialized() { 376 | if (!hasLogin()) { 377 | 378 | return false; 379 | } 380 | if (!getLogin().isInitialized()) { 381 | 382 | return false; 383 | } 384 | return true; 385 | } 386 | 387 | public Builder mergeFrom( 388 | com.google.protobuf.CodedInputStream input, 389 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 390 | throws java.io.IOException { 391 | protocol.ClientServerProtocol.C2SLogin parsedMessage = null; 392 | try { 393 | parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); 394 | } catch (com.google.protobuf.InvalidProtocolBufferException e) { 395 | parsedMessage = (protocol.ClientServerProtocol.C2SLogin) e.getUnfinishedMessage(); 396 | throw e; 397 | } finally { 398 | if (parsedMessage != null) { 399 | mergeFrom(parsedMessage); 400 | } 401 | } 402 | return this; 403 | } 404 | private int bitField0_; 405 | 406 | // required .PBLogin login = 1; 407 | private protocol.BaseType.PBLogin login_ = protocol.BaseType.PBLogin.getDefaultInstance(); 408 | private com.google.protobuf.SingleFieldBuilder< 409 | protocol.BaseType.PBLogin, protocol.BaseType.PBLogin.Builder, protocol.BaseType.PBLoginOrBuilder> loginBuilder_; 410 | /** 411 | * required .PBLogin login = 1; 412 | */ 413 | public boolean hasLogin() { 414 | return ((bitField0_ & 0x00000001) == 0x00000001); 415 | } 416 | /** 417 | * required .PBLogin login = 1; 418 | */ 419 | public protocol.BaseType.PBLogin getLogin() { 420 | if (loginBuilder_ == null) { 421 | return login_; 422 | } else { 423 | return loginBuilder_.getMessage(); 424 | } 425 | } 426 | /** 427 | * required .PBLogin login = 1; 428 | */ 429 | public Builder setLogin(protocol.BaseType.PBLogin value) { 430 | if (loginBuilder_ == null) { 431 | if (value == null) { 432 | throw new NullPointerException(); 433 | } 434 | login_ = value; 435 | onChanged(); 436 | } else { 437 | loginBuilder_.setMessage(value); 438 | } 439 | bitField0_ |= 0x00000001; 440 | return this; 441 | } 442 | /** 443 | * required .PBLogin login = 1; 444 | */ 445 | public Builder setLogin( 446 | protocol.BaseType.PBLogin.Builder builderForValue) { 447 | if (loginBuilder_ == null) { 448 | login_ = builderForValue.build(); 449 | onChanged(); 450 | } else { 451 | loginBuilder_.setMessage(builderForValue.build()); 452 | } 453 | bitField0_ |= 0x00000001; 454 | return this; 455 | } 456 | /** 457 | * required .PBLogin login = 1; 458 | */ 459 | public Builder mergeLogin(protocol.BaseType.PBLogin value) { 460 | if (loginBuilder_ == null) { 461 | if (((bitField0_ & 0x00000001) == 0x00000001) && 462 | login_ != protocol.BaseType.PBLogin.getDefaultInstance()) { 463 | login_ = 464 | protocol.BaseType.PBLogin.newBuilder(login_).mergeFrom(value).buildPartial(); 465 | } else { 466 | login_ = value; 467 | } 468 | onChanged(); 469 | } else { 470 | loginBuilder_.mergeFrom(value); 471 | } 472 | bitField0_ |= 0x00000001; 473 | return this; 474 | } 475 | /** 476 | * required .PBLogin login = 1; 477 | */ 478 | public Builder clearLogin() { 479 | if (loginBuilder_ == null) { 480 | login_ = protocol.BaseType.PBLogin.getDefaultInstance(); 481 | onChanged(); 482 | } else { 483 | loginBuilder_.clear(); 484 | } 485 | bitField0_ = (bitField0_ & ~0x00000001); 486 | return this; 487 | } 488 | /** 489 | * required .PBLogin login = 1; 490 | */ 491 | public protocol.BaseType.PBLogin.Builder getLoginBuilder() { 492 | bitField0_ |= 0x00000001; 493 | onChanged(); 494 | return getLoginFieldBuilder().getBuilder(); 495 | } 496 | /** 497 | * required .PBLogin login = 1; 498 | */ 499 | public protocol.BaseType.PBLoginOrBuilder getLoginOrBuilder() { 500 | if (loginBuilder_ != null) { 501 | return loginBuilder_.getMessageOrBuilder(); 502 | } else { 503 | return login_; 504 | } 505 | } 506 | /** 507 | * required .PBLogin login = 1; 508 | */ 509 | private com.google.protobuf.SingleFieldBuilder< 510 | protocol.BaseType.PBLogin, protocol.BaseType.PBLogin.Builder, protocol.BaseType.PBLoginOrBuilder> 511 | getLoginFieldBuilder() { 512 | if (loginBuilder_ == null) { 513 | loginBuilder_ = new com.google.protobuf.SingleFieldBuilder< 514 | protocol.BaseType.PBLogin, protocol.BaseType.PBLogin.Builder, protocol.BaseType.PBLoginOrBuilder>( 515 | login_, 516 | getParentForChildren(), 517 | isClean()); 518 | login_ = null; 519 | } 520 | return loginBuilder_; 521 | } 522 | 523 | // @@protoc_insertion_point(builder_scope:C2SLogin) 524 | } 525 | 526 | static { 527 | defaultInstance = new C2SLogin(true); 528 | defaultInstance.initFields(); 529 | } 530 | 531 | // @@protoc_insertion_point(class_scope:C2SLogin) 532 | } 533 | 534 | private static com.google.protobuf.Descriptors.Descriptor 535 | internal_static_C2SLogin_descriptor; 536 | private static 537 | com.google.protobuf.GeneratedMessage.FieldAccessorTable 538 | internal_static_C2SLogin_fieldAccessorTable; 539 | 540 | public static com.google.protobuf.Descriptors.FileDescriptor 541 | getDescriptor() { 542 | return descriptor; 543 | } 544 | private static com.google.protobuf.Descriptors.FileDescriptor 545 | descriptor; 546 | static { 547 | java.lang.String[] descriptorData = { 548 | "\n\024P_ClientServer.proto\032\020P_BaseType.proto" + 549 | "\"#\n\010C2SLogin\022\027\n\005login\030\001 \002(\0132\010.PBLoginB \n" + 550 | "\010protocolB\024ClientServerProtocol" 551 | }; 552 | com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = 553 | new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { 554 | public com.google.protobuf.ExtensionRegistry assignDescriptors( 555 | com.google.protobuf.Descriptors.FileDescriptor root) { 556 | descriptor = root; 557 | internal_static_C2SLogin_descriptor = 558 | getDescriptor().getMessageTypes().get(0); 559 | internal_static_C2SLogin_fieldAccessorTable = new 560 | com.google.protobuf.GeneratedMessage.FieldAccessorTable( 561 | internal_static_C2SLogin_descriptor, 562 | new java.lang.String[] { "Login", }); 563 | return null; 564 | } 565 | }; 566 | com.google.protobuf.Descriptors.FileDescriptor 567 | .internalBuildGeneratedFileFrom(descriptorData, 568 | new com.google.protobuf.Descriptors.FileDescriptor[] { 569 | protocol.BaseType.getDescriptor(), 570 | }, assigner); 571 | } 572 | 573 | // @@protoc_insertion_point(outer_class_scope) 574 | } 575 | -------------------------------------------------------------------------------- /gserver-services/src/main/java/protocol/ServerClientProtocol.java: -------------------------------------------------------------------------------- 1 | // Generated by the protocol buffer compiler. DO NOT EDIT! 2 | // source: P_ServerClient.proto 3 | 4 | package protocol; 5 | 6 | public final class ServerClientProtocol { 7 | private ServerClientProtocol() {} 8 | public static void registerAllExtensions( 9 | com.google.protobuf.ExtensionRegistry registry) { 10 | } 11 | public interface S2CLoginOrBuilder 12 | extends com.google.protobuf.MessageOrBuilder { 13 | 14 | // required int32 result = 1; 15 | /** 16 | * required int32 result = 1; 17 | */ 18 | boolean hasResult(); 19 | /** 20 | * required int32 result = 1; 21 | */ 22 | int getResult(); 23 | } 24 | /** 25 | * Protobuf type {@code S2CLogin} 26 | */ 27 | public static final class S2CLogin extends 28 | com.google.protobuf.GeneratedMessage 29 | implements S2CLoginOrBuilder { 30 | // Use S2CLogin.newBuilder() to construct. 31 | private S2CLogin(com.google.protobuf.GeneratedMessage.Builder builder) { 32 | super(builder); 33 | this.unknownFields = builder.getUnknownFields(); 34 | } 35 | private S2CLogin(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } 36 | 37 | private static final S2CLogin defaultInstance; 38 | public static S2CLogin getDefaultInstance() { 39 | return defaultInstance; 40 | } 41 | 42 | public S2CLogin getDefaultInstanceForType() { 43 | return defaultInstance; 44 | } 45 | 46 | private final com.google.protobuf.UnknownFieldSet unknownFields; 47 | @java.lang.Override 48 | public final com.google.protobuf.UnknownFieldSet 49 | getUnknownFields() { 50 | return this.unknownFields; 51 | } 52 | private S2CLogin( 53 | com.google.protobuf.CodedInputStream input, 54 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 55 | throws com.google.protobuf.InvalidProtocolBufferException { 56 | initFields(); 57 | int mutable_bitField0_ = 0; 58 | com.google.protobuf.UnknownFieldSet.Builder unknownFields = 59 | com.google.protobuf.UnknownFieldSet.newBuilder(); 60 | try { 61 | boolean done = false; 62 | while (!done) { 63 | int tag = input.readTag(); 64 | switch (tag) { 65 | case 0: 66 | done = true; 67 | break; 68 | default: { 69 | if (!parseUnknownField(input, unknownFields, 70 | extensionRegistry, tag)) { 71 | done = true; 72 | } 73 | break; 74 | } 75 | case 8: { 76 | bitField0_ |= 0x00000001; 77 | result_ = input.readInt32(); 78 | break; 79 | } 80 | } 81 | } 82 | } catch (com.google.protobuf.InvalidProtocolBufferException e) { 83 | throw e.setUnfinishedMessage(this); 84 | } catch (java.io.IOException e) { 85 | throw new com.google.protobuf.InvalidProtocolBufferException( 86 | e.getMessage()).setUnfinishedMessage(this); 87 | } finally { 88 | this.unknownFields = unknownFields.build(); 89 | makeExtensionsImmutable(); 90 | } 91 | } 92 | public static final com.google.protobuf.Descriptors.Descriptor 93 | getDescriptor() { 94 | return protocol.ServerClientProtocol.internal_static_S2CLogin_descriptor; 95 | } 96 | 97 | protected com.google.protobuf.GeneratedMessage.FieldAccessorTable 98 | internalGetFieldAccessorTable() { 99 | return protocol.ServerClientProtocol.internal_static_S2CLogin_fieldAccessorTable 100 | .ensureFieldAccessorsInitialized( 101 | protocol.ServerClientProtocol.S2CLogin.class, protocol.ServerClientProtocol.S2CLogin.Builder.class); 102 | } 103 | 104 | public static com.google.protobuf.Parser PARSER = 105 | new com.google.protobuf.AbstractParser() { 106 | public S2CLogin parsePartialFrom( 107 | com.google.protobuf.CodedInputStream input, 108 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 109 | throws com.google.protobuf.InvalidProtocolBufferException { 110 | return new S2CLogin(input, extensionRegistry); 111 | } 112 | }; 113 | 114 | @java.lang.Override 115 | public com.google.protobuf.Parser getParserForType() { 116 | return PARSER; 117 | } 118 | 119 | private int bitField0_; 120 | // required int32 result = 1; 121 | public static final int RESULT_FIELD_NUMBER = 1; 122 | private int result_; 123 | /** 124 | * required int32 result = 1; 125 | */ 126 | public boolean hasResult() { 127 | return ((bitField0_ & 0x00000001) == 0x00000001); 128 | } 129 | /** 130 | * required int32 result = 1; 131 | */ 132 | public int getResult() { 133 | return result_; 134 | } 135 | 136 | private void initFields() { 137 | result_ = 0; 138 | } 139 | private byte memoizedIsInitialized = -1; 140 | public final boolean isInitialized() { 141 | byte isInitialized = memoizedIsInitialized; 142 | if (isInitialized != -1) return isInitialized == 1; 143 | 144 | if (!hasResult()) { 145 | memoizedIsInitialized = 0; 146 | return false; 147 | } 148 | memoizedIsInitialized = 1; 149 | return true; 150 | } 151 | 152 | public void writeTo(com.google.protobuf.CodedOutputStream output) 153 | throws java.io.IOException { 154 | getSerializedSize(); 155 | if (((bitField0_ & 0x00000001) == 0x00000001)) { 156 | output.writeInt32(1, result_); 157 | } 158 | getUnknownFields().writeTo(output); 159 | } 160 | 161 | private int memoizedSerializedSize = -1; 162 | public int getSerializedSize() { 163 | int size = memoizedSerializedSize; 164 | if (size != -1) return size; 165 | 166 | size = 0; 167 | if (((bitField0_ & 0x00000001) == 0x00000001)) { 168 | size += com.google.protobuf.CodedOutputStream 169 | .computeInt32Size(1, result_); 170 | } 171 | size += getUnknownFields().getSerializedSize(); 172 | memoizedSerializedSize = size; 173 | return size; 174 | } 175 | 176 | private static final long serialVersionUID = 0L; 177 | @java.lang.Override 178 | protected java.lang.Object writeReplace() 179 | throws java.io.ObjectStreamException { 180 | return super.writeReplace(); 181 | } 182 | 183 | public static protocol.ServerClientProtocol.S2CLogin parseFrom( 184 | com.google.protobuf.ByteString data) 185 | throws com.google.protobuf.InvalidProtocolBufferException { 186 | return PARSER.parseFrom(data); 187 | } 188 | public static protocol.ServerClientProtocol.S2CLogin parseFrom( 189 | com.google.protobuf.ByteString data, 190 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 191 | throws com.google.protobuf.InvalidProtocolBufferException { 192 | return PARSER.parseFrom(data, extensionRegistry); 193 | } 194 | public static protocol.ServerClientProtocol.S2CLogin parseFrom(byte[] data) 195 | throws com.google.protobuf.InvalidProtocolBufferException { 196 | return PARSER.parseFrom(data); 197 | } 198 | public static protocol.ServerClientProtocol.S2CLogin parseFrom( 199 | byte[] data, 200 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 201 | throws com.google.protobuf.InvalidProtocolBufferException { 202 | return PARSER.parseFrom(data, extensionRegistry); 203 | } 204 | public static protocol.ServerClientProtocol.S2CLogin parseFrom(java.io.InputStream input) 205 | throws java.io.IOException { 206 | return PARSER.parseFrom(input); 207 | } 208 | public static protocol.ServerClientProtocol.S2CLogin parseFrom( 209 | java.io.InputStream input, 210 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 211 | throws java.io.IOException { 212 | return PARSER.parseFrom(input, extensionRegistry); 213 | } 214 | public static protocol.ServerClientProtocol.S2CLogin parseDelimitedFrom(java.io.InputStream input) 215 | throws java.io.IOException { 216 | return PARSER.parseDelimitedFrom(input); 217 | } 218 | public static protocol.ServerClientProtocol.S2CLogin parseDelimitedFrom( 219 | java.io.InputStream input, 220 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 221 | throws java.io.IOException { 222 | return PARSER.parseDelimitedFrom(input, extensionRegistry); 223 | } 224 | public static protocol.ServerClientProtocol.S2CLogin parseFrom( 225 | com.google.protobuf.CodedInputStream input) 226 | throws java.io.IOException { 227 | return PARSER.parseFrom(input); 228 | } 229 | public static protocol.ServerClientProtocol.S2CLogin parseFrom( 230 | com.google.protobuf.CodedInputStream input, 231 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 232 | throws java.io.IOException { 233 | return PARSER.parseFrom(input, extensionRegistry); 234 | } 235 | 236 | public static Builder newBuilder() { return Builder.create(); } 237 | public Builder newBuilderForType() { return newBuilder(); } 238 | public static Builder newBuilder(protocol.ServerClientProtocol.S2CLogin prototype) { 239 | return newBuilder().mergeFrom(prototype); 240 | } 241 | public Builder toBuilder() { return newBuilder(this); } 242 | 243 | @java.lang.Override 244 | protected Builder newBuilderForType( 245 | com.google.protobuf.GeneratedMessage.BuilderParent parent) { 246 | Builder builder = new Builder(parent); 247 | return builder; 248 | } 249 | /** 250 | * Protobuf type {@code S2CLogin} 251 | */ 252 | public static final class Builder extends 253 | com.google.protobuf.GeneratedMessage.Builder 254 | implements protocol.ServerClientProtocol.S2CLoginOrBuilder { 255 | public static final com.google.protobuf.Descriptors.Descriptor 256 | getDescriptor() { 257 | return protocol.ServerClientProtocol.internal_static_S2CLogin_descriptor; 258 | } 259 | 260 | protected com.google.protobuf.GeneratedMessage.FieldAccessorTable 261 | internalGetFieldAccessorTable() { 262 | return protocol.ServerClientProtocol.internal_static_S2CLogin_fieldAccessorTable 263 | .ensureFieldAccessorsInitialized( 264 | protocol.ServerClientProtocol.S2CLogin.class, protocol.ServerClientProtocol.S2CLogin.Builder.class); 265 | } 266 | 267 | // Construct using protocol.ServerClientProtocol.S2CLogin.newBuilder() 268 | private Builder() { 269 | maybeForceBuilderInitialization(); 270 | } 271 | 272 | private Builder( 273 | com.google.protobuf.GeneratedMessage.BuilderParent parent) { 274 | super(parent); 275 | maybeForceBuilderInitialization(); 276 | } 277 | private void maybeForceBuilderInitialization() { 278 | if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { 279 | } 280 | } 281 | private static Builder create() { 282 | return new Builder(); 283 | } 284 | 285 | public Builder clear() { 286 | super.clear(); 287 | result_ = 0; 288 | bitField0_ = (bitField0_ & ~0x00000001); 289 | return this; 290 | } 291 | 292 | public Builder clone() { 293 | return create().mergeFrom(buildPartial()); 294 | } 295 | 296 | public com.google.protobuf.Descriptors.Descriptor 297 | getDescriptorForType() { 298 | return protocol.ServerClientProtocol.internal_static_S2CLogin_descriptor; 299 | } 300 | 301 | public protocol.ServerClientProtocol.S2CLogin getDefaultInstanceForType() { 302 | return protocol.ServerClientProtocol.S2CLogin.getDefaultInstance(); 303 | } 304 | 305 | public protocol.ServerClientProtocol.S2CLogin build() { 306 | protocol.ServerClientProtocol.S2CLogin result = buildPartial(); 307 | if (!result.isInitialized()) { 308 | throw newUninitializedMessageException(result); 309 | } 310 | return result; 311 | } 312 | 313 | public protocol.ServerClientProtocol.S2CLogin buildPartial() { 314 | protocol.ServerClientProtocol.S2CLogin result = new protocol.ServerClientProtocol.S2CLogin(this); 315 | int from_bitField0_ = bitField0_; 316 | int to_bitField0_ = 0; 317 | if (((from_bitField0_ & 0x00000001) == 0x00000001)) { 318 | to_bitField0_ |= 0x00000001; 319 | } 320 | result.result_ = result_; 321 | result.bitField0_ = to_bitField0_; 322 | onBuilt(); 323 | return result; 324 | } 325 | 326 | public Builder mergeFrom(com.google.protobuf.Message other) { 327 | if (other instanceof protocol.ServerClientProtocol.S2CLogin) { 328 | return mergeFrom((protocol.ServerClientProtocol.S2CLogin)other); 329 | } else { 330 | super.mergeFrom(other); 331 | return this; 332 | } 333 | } 334 | 335 | public Builder mergeFrom(protocol.ServerClientProtocol.S2CLogin other) { 336 | if (other == protocol.ServerClientProtocol.S2CLogin.getDefaultInstance()) return this; 337 | if (other.hasResult()) { 338 | setResult(other.getResult()); 339 | } 340 | this.mergeUnknownFields(other.getUnknownFields()); 341 | return this; 342 | } 343 | 344 | public final boolean isInitialized() { 345 | if (!hasResult()) { 346 | 347 | return false; 348 | } 349 | return true; 350 | } 351 | 352 | public Builder mergeFrom( 353 | com.google.protobuf.CodedInputStream input, 354 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 355 | throws java.io.IOException { 356 | protocol.ServerClientProtocol.S2CLogin parsedMessage = null; 357 | try { 358 | parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); 359 | } catch (com.google.protobuf.InvalidProtocolBufferException e) { 360 | parsedMessage = (protocol.ServerClientProtocol.S2CLogin) e.getUnfinishedMessage(); 361 | throw e; 362 | } finally { 363 | if (parsedMessage != null) { 364 | mergeFrom(parsedMessage); 365 | } 366 | } 367 | return this; 368 | } 369 | private int bitField0_; 370 | 371 | // required int32 result = 1; 372 | private int result_ ; 373 | /** 374 | * required int32 result = 1; 375 | */ 376 | public boolean hasResult() { 377 | return ((bitField0_ & 0x00000001) == 0x00000001); 378 | } 379 | /** 380 | * required int32 result = 1; 381 | */ 382 | public int getResult() { 383 | return result_; 384 | } 385 | /** 386 | * required int32 result = 1; 387 | */ 388 | public Builder setResult(int value) { 389 | bitField0_ |= 0x00000001; 390 | result_ = value; 391 | onChanged(); 392 | return this; 393 | } 394 | /** 395 | * required int32 result = 1; 396 | */ 397 | public Builder clearResult() { 398 | bitField0_ = (bitField0_ & ~0x00000001); 399 | result_ = 0; 400 | onChanged(); 401 | return this; 402 | } 403 | 404 | // @@protoc_insertion_point(builder_scope:S2CLogin) 405 | } 406 | 407 | static { 408 | defaultInstance = new S2CLogin(true); 409 | defaultInstance.initFields(); 410 | } 411 | 412 | // @@protoc_insertion_point(class_scope:S2CLogin) 413 | } 414 | 415 | public interface S2CErrorCodeOrBuilder 416 | extends com.google.protobuf.MessageOrBuilder { 417 | 418 | // required int32 errorCode = 1; 419 | /** 420 | * required int32 errorCode = 1; 421 | */ 422 | boolean hasErrorCode(); 423 | /** 424 | * required int32 errorCode = 1; 425 | */ 426 | int getErrorCode(); 427 | } 428 | /** 429 | * Protobuf type {@code S2CErrorCode} 430 | */ 431 | public static final class S2CErrorCode extends 432 | com.google.protobuf.GeneratedMessage 433 | implements S2CErrorCodeOrBuilder { 434 | // Use S2CErrorCode.newBuilder() to construct. 435 | private S2CErrorCode(com.google.protobuf.GeneratedMessage.Builder builder) { 436 | super(builder); 437 | this.unknownFields = builder.getUnknownFields(); 438 | } 439 | private S2CErrorCode(boolean noInit) { this.unknownFields = com.google.protobuf.UnknownFieldSet.getDefaultInstance(); } 440 | 441 | private static final S2CErrorCode defaultInstance; 442 | public static S2CErrorCode getDefaultInstance() { 443 | return defaultInstance; 444 | } 445 | 446 | public S2CErrorCode getDefaultInstanceForType() { 447 | return defaultInstance; 448 | } 449 | 450 | private final com.google.protobuf.UnknownFieldSet unknownFields; 451 | @java.lang.Override 452 | public final com.google.protobuf.UnknownFieldSet 453 | getUnknownFields() { 454 | return this.unknownFields; 455 | } 456 | private S2CErrorCode( 457 | com.google.protobuf.CodedInputStream input, 458 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 459 | throws com.google.protobuf.InvalidProtocolBufferException { 460 | initFields(); 461 | int mutable_bitField0_ = 0; 462 | com.google.protobuf.UnknownFieldSet.Builder unknownFields = 463 | com.google.protobuf.UnknownFieldSet.newBuilder(); 464 | try { 465 | boolean done = false; 466 | while (!done) { 467 | int tag = input.readTag(); 468 | switch (tag) { 469 | case 0: 470 | done = true; 471 | break; 472 | default: { 473 | if (!parseUnknownField(input, unknownFields, 474 | extensionRegistry, tag)) { 475 | done = true; 476 | } 477 | break; 478 | } 479 | case 8: { 480 | bitField0_ |= 0x00000001; 481 | errorCode_ = input.readInt32(); 482 | break; 483 | } 484 | } 485 | } 486 | } catch (com.google.protobuf.InvalidProtocolBufferException e) { 487 | throw e.setUnfinishedMessage(this); 488 | } catch (java.io.IOException e) { 489 | throw new com.google.protobuf.InvalidProtocolBufferException( 490 | e.getMessage()).setUnfinishedMessage(this); 491 | } finally { 492 | this.unknownFields = unknownFields.build(); 493 | makeExtensionsImmutable(); 494 | } 495 | } 496 | public static final com.google.protobuf.Descriptors.Descriptor 497 | getDescriptor() { 498 | return protocol.ServerClientProtocol.internal_static_S2CErrorCode_descriptor; 499 | } 500 | 501 | protected com.google.protobuf.GeneratedMessage.FieldAccessorTable 502 | internalGetFieldAccessorTable() { 503 | return protocol.ServerClientProtocol.internal_static_S2CErrorCode_fieldAccessorTable 504 | .ensureFieldAccessorsInitialized( 505 | protocol.ServerClientProtocol.S2CErrorCode.class, protocol.ServerClientProtocol.S2CErrorCode.Builder.class); 506 | } 507 | 508 | public static com.google.protobuf.Parser PARSER = 509 | new com.google.protobuf.AbstractParser() { 510 | public S2CErrorCode parsePartialFrom( 511 | com.google.protobuf.CodedInputStream input, 512 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 513 | throws com.google.protobuf.InvalidProtocolBufferException { 514 | return new S2CErrorCode(input, extensionRegistry); 515 | } 516 | }; 517 | 518 | @java.lang.Override 519 | public com.google.protobuf.Parser getParserForType() { 520 | return PARSER; 521 | } 522 | 523 | private int bitField0_; 524 | // required int32 errorCode = 1; 525 | public static final int ERRORCODE_FIELD_NUMBER = 1; 526 | private int errorCode_; 527 | /** 528 | * required int32 errorCode = 1; 529 | */ 530 | public boolean hasErrorCode() { 531 | return ((bitField0_ & 0x00000001) == 0x00000001); 532 | } 533 | /** 534 | * required int32 errorCode = 1; 535 | */ 536 | public int getErrorCode() { 537 | return errorCode_; 538 | } 539 | 540 | private void initFields() { 541 | errorCode_ = 0; 542 | } 543 | private byte memoizedIsInitialized = -1; 544 | public final boolean isInitialized() { 545 | byte isInitialized = memoizedIsInitialized; 546 | if (isInitialized != -1) return isInitialized == 1; 547 | 548 | if (!hasErrorCode()) { 549 | memoizedIsInitialized = 0; 550 | return false; 551 | } 552 | memoizedIsInitialized = 1; 553 | return true; 554 | } 555 | 556 | public void writeTo(com.google.protobuf.CodedOutputStream output) 557 | throws java.io.IOException { 558 | getSerializedSize(); 559 | if (((bitField0_ & 0x00000001) == 0x00000001)) { 560 | output.writeInt32(1, errorCode_); 561 | } 562 | getUnknownFields().writeTo(output); 563 | } 564 | 565 | private int memoizedSerializedSize = -1; 566 | public int getSerializedSize() { 567 | int size = memoizedSerializedSize; 568 | if (size != -1) return size; 569 | 570 | size = 0; 571 | if (((bitField0_ & 0x00000001) == 0x00000001)) { 572 | size += com.google.protobuf.CodedOutputStream 573 | .computeInt32Size(1, errorCode_); 574 | } 575 | size += getUnknownFields().getSerializedSize(); 576 | memoizedSerializedSize = size; 577 | return size; 578 | } 579 | 580 | private static final long serialVersionUID = 0L; 581 | @java.lang.Override 582 | protected java.lang.Object writeReplace() 583 | throws java.io.ObjectStreamException { 584 | return super.writeReplace(); 585 | } 586 | 587 | public static protocol.ServerClientProtocol.S2CErrorCode parseFrom( 588 | com.google.protobuf.ByteString data) 589 | throws com.google.protobuf.InvalidProtocolBufferException { 590 | return PARSER.parseFrom(data); 591 | } 592 | public static protocol.ServerClientProtocol.S2CErrorCode parseFrom( 593 | com.google.protobuf.ByteString data, 594 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 595 | throws com.google.protobuf.InvalidProtocolBufferException { 596 | return PARSER.parseFrom(data, extensionRegistry); 597 | } 598 | public static protocol.ServerClientProtocol.S2CErrorCode parseFrom(byte[] data) 599 | throws com.google.protobuf.InvalidProtocolBufferException { 600 | return PARSER.parseFrom(data); 601 | } 602 | public static protocol.ServerClientProtocol.S2CErrorCode parseFrom( 603 | byte[] data, 604 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 605 | throws com.google.protobuf.InvalidProtocolBufferException { 606 | return PARSER.parseFrom(data, extensionRegistry); 607 | } 608 | public static protocol.ServerClientProtocol.S2CErrorCode parseFrom(java.io.InputStream input) 609 | throws java.io.IOException { 610 | return PARSER.parseFrom(input); 611 | } 612 | public static protocol.ServerClientProtocol.S2CErrorCode parseFrom( 613 | java.io.InputStream input, 614 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 615 | throws java.io.IOException { 616 | return PARSER.parseFrom(input, extensionRegistry); 617 | } 618 | public static protocol.ServerClientProtocol.S2CErrorCode parseDelimitedFrom(java.io.InputStream input) 619 | throws java.io.IOException { 620 | return PARSER.parseDelimitedFrom(input); 621 | } 622 | public static protocol.ServerClientProtocol.S2CErrorCode parseDelimitedFrom( 623 | java.io.InputStream input, 624 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 625 | throws java.io.IOException { 626 | return PARSER.parseDelimitedFrom(input, extensionRegistry); 627 | } 628 | public static protocol.ServerClientProtocol.S2CErrorCode parseFrom( 629 | com.google.protobuf.CodedInputStream input) 630 | throws java.io.IOException { 631 | return PARSER.parseFrom(input); 632 | } 633 | public static protocol.ServerClientProtocol.S2CErrorCode parseFrom( 634 | com.google.protobuf.CodedInputStream input, 635 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 636 | throws java.io.IOException { 637 | return PARSER.parseFrom(input, extensionRegistry); 638 | } 639 | 640 | public static Builder newBuilder() { return Builder.create(); } 641 | public Builder newBuilderForType() { return newBuilder(); } 642 | public static Builder newBuilder(protocol.ServerClientProtocol.S2CErrorCode prototype) { 643 | return newBuilder().mergeFrom(prototype); 644 | } 645 | public Builder toBuilder() { return newBuilder(this); } 646 | 647 | @java.lang.Override 648 | protected Builder newBuilderForType( 649 | com.google.protobuf.GeneratedMessage.BuilderParent parent) { 650 | Builder builder = new Builder(parent); 651 | return builder; 652 | } 653 | /** 654 | * Protobuf type {@code S2CErrorCode} 655 | */ 656 | public static final class Builder extends 657 | com.google.protobuf.GeneratedMessage.Builder 658 | implements protocol.ServerClientProtocol.S2CErrorCodeOrBuilder { 659 | public static final com.google.protobuf.Descriptors.Descriptor 660 | getDescriptor() { 661 | return protocol.ServerClientProtocol.internal_static_S2CErrorCode_descriptor; 662 | } 663 | 664 | protected com.google.protobuf.GeneratedMessage.FieldAccessorTable 665 | internalGetFieldAccessorTable() { 666 | return protocol.ServerClientProtocol.internal_static_S2CErrorCode_fieldAccessorTable 667 | .ensureFieldAccessorsInitialized( 668 | protocol.ServerClientProtocol.S2CErrorCode.class, protocol.ServerClientProtocol.S2CErrorCode.Builder.class); 669 | } 670 | 671 | // Construct using protocol.ServerClientProtocol.S2CErrorCode.newBuilder() 672 | private Builder() { 673 | maybeForceBuilderInitialization(); 674 | } 675 | 676 | private Builder( 677 | com.google.protobuf.GeneratedMessage.BuilderParent parent) { 678 | super(parent); 679 | maybeForceBuilderInitialization(); 680 | } 681 | private void maybeForceBuilderInitialization() { 682 | if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) { 683 | } 684 | } 685 | private static Builder create() { 686 | return new Builder(); 687 | } 688 | 689 | public Builder clear() { 690 | super.clear(); 691 | errorCode_ = 0; 692 | bitField0_ = (bitField0_ & ~0x00000001); 693 | return this; 694 | } 695 | 696 | public Builder clone() { 697 | return create().mergeFrom(buildPartial()); 698 | } 699 | 700 | public com.google.protobuf.Descriptors.Descriptor 701 | getDescriptorForType() { 702 | return protocol.ServerClientProtocol.internal_static_S2CErrorCode_descriptor; 703 | } 704 | 705 | public protocol.ServerClientProtocol.S2CErrorCode getDefaultInstanceForType() { 706 | return protocol.ServerClientProtocol.S2CErrorCode.getDefaultInstance(); 707 | } 708 | 709 | public protocol.ServerClientProtocol.S2CErrorCode build() { 710 | protocol.ServerClientProtocol.S2CErrorCode result = buildPartial(); 711 | if (!result.isInitialized()) { 712 | throw newUninitializedMessageException(result); 713 | } 714 | return result; 715 | } 716 | 717 | public protocol.ServerClientProtocol.S2CErrorCode buildPartial() { 718 | protocol.ServerClientProtocol.S2CErrorCode result = new protocol.ServerClientProtocol.S2CErrorCode(this); 719 | int from_bitField0_ = bitField0_; 720 | int to_bitField0_ = 0; 721 | if (((from_bitField0_ & 0x00000001) == 0x00000001)) { 722 | to_bitField0_ |= 0x00000001; 723 | } 724 | result.errorCode_ = errorCode_; 725 | result.bitField0_ = to_bitField0_; 726 | onBuilt(); 727 | return result; 728 | } 729 | 730 | public Builder mergeFrom(com.google.protobuf.Message other) { 731 | if (other instanceof protocol.ServerClientProtocol.S2CErrorCode) { 732 | return mergeFrom((protocol.ServerClientProtocol.S2CErrorCode)other); 733 | } else { 734 | super.mergeFrom(other); 735 | return this; 736 | } 737 | } 738 | 739 | public Builder mergeFrom(protocol.ServerClientProtocol.S2CErrorCode other) { 740 | if (other == protocol.ServerClientProtocol.S2CErrorCode.getDefaultInstance()) return this; 741 | if (other.hasErrorCode()) { 742 | setErrorCode(other.getErrorCode()); 743 | } 744 | this.mergeUnknownFields(other.getUnknownFields()); 745 | return this; 746 | } 747 | 748 | public final boolean isInitialized() { 749 | if (!hasErrorCode()) { 750 | 751 | return false; 752 | } 753 | return true; 754 | } 755 | 756 | public Builder mergeFrom( 757 | com.google.protobuf.CodedInputStream input, 758 | com.google.protobuf.ExtensionRegistryLite extensionRegistry) 759 | throws java.io.IOException { 760 | protocol.ServerClientProtocol.S2CErrorCode parsedMessage = null; 761 | try { 762 | parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry); 763 | } catch (com.google.protobuf.InvalidProtocolBufferException e) { 764 | parsedMessage = (protocol.ServerClientProtocol.S2CErrorCode) e.getUnfinishedMessage(); 765 | throw e; 766 | } finally { 767 | if (parsedMessage != null) { 768 | mergeFrom(parsedMessage); 769 | } 770 | } 771 | return this; 772 | } 773 | private int bitField0_; 774 | 775 | // required int32 errorCode = 1; 776 | private int errorCode_ ; 777 | /** 778 | * required int32 errorCode = 1; 779 | */ 780 | public boolean hasErrorCode() { 781 | return ((bitField0_ & 0x00000001) == 0x00000001); 782 | } 783 | /** 784 | * required int32 errorCode = 1; 785 | */ 786 | public int getErrorCode() { 787 | return errorCode_; 788 | } 789 | /** 790 | * required int32 errorCode = 1; 791 | */ 792 | public Builder setErrorCode(int value) { 793 | bitField0_ |= 0x00000001; 794 | errorCode_ = value; 795 | onChanged(); 796 | return this; 797 | } 798 | /** 799 | * required int32 errorCode = 1; 800 | */ 801 | public Builder clearErrorCode() { 802 | bitField0_ = (bitField0_ & ~0x00000001); 803 | errorCode_ = 0; 804 | onChanged(); 805 | return this; 806 | } 807 | 808 | // @@protoc_insertion_point(builder_scope:S2CErrorCode) 809 | } 810 | 811 | static { 812 | defaultInstance = new S2CErrorCode(true); 813 | defaultInstance.initFields(); 814 | } 815 | 816 | // @@protoc_insertion_point(class_scope:S2CErrorCode) 817 | } 818 | 819 | private static com.google.protobuf.Descriptors.Descriptor 820 | internal_static_S2CLogin_descriptor; 821 | private static 822 | com.google.protobuf.GeneratedMessage.FieldAccessorTable 823 | internal_static_S2CLogin_fieldAccessorTable; 824 | private static com.google.protobuf.Descriptors.Descriptor 825 | internal_static_S2CErrorCode_descriptor; 826 | private static 827 | com.google.protobuf.GeneratedMessage.FieldAccessorTable 828 | internal_static_S2CErrorCode_fieldAccessorTable; 829 | 830 | public static com.google.protobuf.Descriptors.FileDescriptor 831 | getDescriptor() { 832 | return descriptor; 833 | } 834 | private static com.google.protobuf.Descriptors.FileDescriptor 835 | descriptor; 836 | static { 837 | java.lang.String[] descriptorData = { 838 | "\n\024P_ServerClient.proto\032\020P_BaseType.proto" + 839 | "\"\032\n\010S2CLogin\022\016\n\006result\030\001 \002(\005\"!\n\014S2CError" + 840 | "Code\022\021\n\terrorCode\030\001 \002(\005B \n\010protocolB\024Ser" + 841 | "verClientProtocol" 842 | }; 843 | com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = 844 | new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { 845 | public com.google.protobuf.ExtensionRegistry assignDescriptors( 846 | com.google.protobuf.Descriptors.FileDescriptor root) { 847 | descriptor = root; 848 | internal_static_S2CLogin_descriptor = 849 | getDescriptor().getMessageTypes().get(0); 850 | internal_static_S2CLogin_fieldAccessorTable = new 851 | com.google.protobuf.GeneratedMessage.FieldAccessorTable( 852 | internal_static_S2CLogin_descriptor, 853 | new java.lang.String[] { "Result", }); 854 | internal_static_S2CErrorCode_descriptor = 855 | getDescriptor().getMessageTypes().get(1); 856 | internal_static_S2CErrorCode_fieldAccessorTable = new 857 | com.google.protobuf.GeneratedMessage.FieldAccessorTable( 858 | internal_static_S2CErrorCode_descriptor, 859 | new java.lang.String[] { "ErrorCode", }); 860 | return null; 861 | } 862 | }; 863 | com.google.protobuf.Descriptors.FileDescriptor 864 | .internalBuildGeneratedFileFrom(descriptorData, 865 | new com.google.protobuf.Descriptors.FileDescriptor[] { 866 | protocol.BaseType.getDescriptor(), 867 | }, assigner); 868 | } 869 | 870 | // @@protoc_insertion_point(outer_class_scope) 871 | } 872 | -------------------------------------------------------------------------------- /gserver-services/src/main/resources/gs-service.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | com.gserver 7 | gserver 8 | 0.0.1-SNAPSHOT 9 | pom 10 | 11 | gserver 12 | http://maven.apache.org 13 | 14 | 15 | UTF-8 16 | 17 | 18 | 19 | 20 | 21 | org.apache.maven.plugins 22 | maven-compiler-plugin 23 | 2.0.2 24 | 25 | 1.6 26 | 1.6 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | log4j 35 | log4j 36 | 1.2.12 37 | 38 | 39 | io.netty 40 | netty 41 | 3.5.2.Final 42 | 43 | 44 | com.google.protobuf 45 | protobuf-java 46 | 2.5.0 47 | 48 | 49 | org.springframework 50 | spring 51 | 2.5.5 52 | 53 | 54 | 55 | gserver-core 56 | gserver-redis 57 | gserver-services 58 | gserver-gate 59 | gserver-logic 60 | gserver-db 61 | gserver-distribution 62 | 63 | --------------------------------------------------------------------------------