精华内容
下载资源
问答
  • 游戏服务器配置

    千次阅读 2011-04-30 18:43:00
    服务器配置: CPU: intel Xeon 5506(及以上,5420类似亦可) 两颗共八核  内存:DDR2 16GB ECC 1000人/10G  硬盘:146GB SAS <br /> 网络配置: 告知是电信或者网通线路(抑或双线)...

    服务器数量:   2 台 

    服务器配置:   CPU: intel Xeon 5506(及以上,5420类似亦可)  两颗共八核
                   内存:DDR2 16GB ECC   1000人/10G
                   硬盘:146GB SAS

    网络配置:     告知是电信或者网通线路(抑或双线)

    操作系统:     Centos5.4 (32位)只需要root,请勿创建其他不相关账户
                   确认系统时区设置为上海:CST;系统语言为English

    所需服务:     Servers(server configuration tools,其他均不要)
                   Development(development tools,其他均不要)
                   System(administration tools,其他均不要)
                   勿安装图形界面,DESKTOP下选项请勿勾选
                   *勿安装其他不相关软件

    硬盘分区(3个)  /(根目录)    /boot    swap(交换分区)



    Each server group, including 1 game server and 1 web server, can support maximum 2,000 con-current users.
    The two servers require the same hardward and software, details as bellow:

    Hardware    
         CPU: intel xeon 5506 (or above,such as 5420 is ok)   x  2 (8 core total)
         RAM: DDR2 16GB ECC
         HD:  146GB SAS(Partition as /boot(100M),/swap (4G),/ (root))

    Software
         OS:Centos5.4 (32bit, only "root" account)
         tick the following service when installing, and confirm other service is out of the check. Please do not install other softwares.
            Servers(server configuration tools、web server)
            Development(development tools)
            System(administration tools)
            no need GUI (keep the 'DESKTOP' option null)
                  

    展开全文
  • 游戏服务器架构,配置

    千次阅读 2018-01-28 15:05:18
    游戏服务器架构 ...实验时间:2009-03-18 实验人:...实验任务和目标:自己当GM做游戏服务器 以奇迹服务器为例:其他游戏原理一样!! 实验环境描述:SQL server2005 和windows2003(两台)服务器/客户机 实验拓

    转载自: http://bbs.51cto.com/thread-558871-1.html


    游戏服务器架构

    实验时间:2009-03-18 实验人:小风
    实验名称:游戏服务器架构之《奇迹》
    实验任务和目标:自己当GM做游戏服务器
    以奇迹服务器为例:其他游戏原理一样!!
    实验环境描述:SQL server2005 和windows2003(两台)服务器/客户机
    实验拓扑及网络规划:这是网络上的游戏服务器拓扑图

    实验操作过程及配置说明: 
    任务一:服务器的配置 
    1.配服务器IP地址,这里我用的是内网IP只在局域网玩,要想在公网玩

    (1). 公网IP直接拿公网IP就可以了。
    (2). ADSL家庭用户,开外网最简单办法:
    如果你是猫直接连接电脑,然后在电脑上通过帐号密码拨号登陆网络,那么只要下载花生壳,注册绑定激活免费域名(小于15位),把服务端里的IP全换成域名,就OK。
    如果你是ADSL路由内网上网,教你一个免映射端口简单的办法,在路由设置时设置开启DMZ功能,DMZ需要你输入一个居域网IP,DMZ的那个IP为你网卡IP。比如为192.168.0.125或者10.0.0.8等,就OK 不需要考虑什么端口映射了。

    2. 把MuOnline服务端文件夹放到D盘下:(一般的游戏服务默认目录都在D:盘,直接放在D:盘我们就不用再改目录了) 


    先运行-注册机.reg ,再进入Muonline目录

    下面就来教大家修改文件的了
    设置D:\MuOnline\ConnectServer里面CsConfig.ini为自己的内网,外网ip或者域名!

    设置D:\MuOnline\Data里面MapServerInfo为自己的外网ip或者域名! 注意保留最前面的S

    设置D:\MuOnline\GameServer-GC\Data里面MapServerInfo为自己的外网ip或者域名! 注意保留最前面的S

    {除了以上2处目录下的文件和04- 战盟系统快捷方式里 需要设置外,其他文件的里IP一率不要改!}
    MapServerInfo 和MapServerInfo.dat 是一个文件,告戒白菜!


    设置04-盟系统快捷方式属性中的127.0.0.1的IP设置为你的外网IP或者域名! 



    如果聊天服务器连接不了,那把快捷5的IP也修改,可以连接则不需要。
    任务二:下面来架构SQL server2005

    再把数据库备份导入到SQL server2005中

    先说下怎样开启sa账户吧(它默认是禁用的,如果用于外网最好不要用这个账户因为它拥有最大的权限)


    数据库的密码就用sjdwm.cn了,如果你要是想用自己的就把sa账户的密码修改成自己的不过要修改五去文件

    导入备份数据库








    再导入这个(方法和上面同样)


    多了两个数据库,这就是游戏的数据库


    现在数据库完了,可以为自己注册个账号来测试了

    服务器做好了,现在来安装客户端


    现在只要把服务器的服务开启客户端就可能进入游戏了
    我没有全部开启因我只是做测试,一个人玩就开这么多就行了,要是多人玩就全开



    开启服务时在winows2003中正规服务器1线到3线可能开启不了,解决方法:我的电脑-属性-高级-设置

    实验结果:

    在一台机子上我用的两个虚机太卡了所以我就不进入游戏了,有兴趣的把邮箱留下我可以把服务器软件发给你
    本文出自 “ 星辰小屋-佘佳栋-小风博客” 博客,请务必保留此出处 http://sjdwm.blog.51cto.com/445300/140067
    本文出自 51CTO.COM技术博客
    点击下载本资源>>
    免费分享IT技术资料,就在51CTO下载中心: Down.51cto.com
    展开全文
  • 棋牌游戏需要什么服务器

    千次阅读 2019-07-30 13:41:21
    棋牌游戏需要什么服务器?服务器需要什么配置,需要看具体的游戏以及玩家的数量。一般前期都会选择一基础的配置,后期不够用的话,可以随时升级...不过这样的服务器配置价格也比较贵。 2、没有棋牌运营牌照 没有棋...

    棋牌游戏需要什么服务器?服务器需要什么配置,需要看具体的游戏以及玩家的数量。一般前期都会选择一个基础的配置,后期不够用的话,可以随时升级。还要根据游戏运营者自身特点进行选择。
    1、如果有游戏运营牌照
    假如拥有国内的棋牌游戏运营牌照,可以选择国内的服务器,建议使用多线服务器,因为需要考虑南北互访的网络障碍问题,带宽最好100M独享以上。不过这样的服务器配置价格也比较贵。
    2、没有棋牌运营牌照
    没有棋牌游戏牌照的话,那只能选择香港或海外服务器。香港服务器相当于国内的多线服务器,没有电信网通的访问限制,离大陆比较近,是个不错的选择。
    3、网站易被攻击又无运营牌照
    这种情况下,建议选择高防服务器或部署ddos服务。在互联网中,最常见的就是DDOS攻击,每个网站都可能成为被攻击的目标,尤其是流量高的网站。所以,建站者在选择棋牌服务器的时候,一定要挑选高防御性能的服务器。
    4、选择售后服务好的IDC
    棋牌游戏服务器不同于其它产品,需要24小时不停的工作。因此,在选择服务器的时候,不仅要注意硬件配置、稳定性、速度等问题,更要注意服务商的售后服务以及技术支持。

    展开全文
  • Java游戏服务器开发之二十--xml配置文件  游戏中使用的配置文件很多  像游戏中的关卡,英雄等级,装备之类都是使用配置文件(xml等)  比如有一装备,配置表中有一条记录,数据库只需要存储这条记录的id,具体...

    Java游戏服务器开发之二十--xml配置文件
        游戏中使用的配置文件很多
        像游戏中的关卡,英雄等级,装备之类都是使用配置文件(xml等)
        比如有一个装备,配置表中有一条记录,数据库只需要存储这条记录的id,具体使用的时候,只需要从xml中获取这条记录就好了。
        这些配置表一般都是前后端一致的。
        
        现在我们服务器要做的就是解析xml,在项目启动的时候把这些数据加载到内存中。
        本次更新,修改的内容
            java\com\lizhaoblog
                base
                    exception
                        XmlConfigReadException.java            把解析xml中所有的错误转成XmlConfigReadException抛出
                    util
                        ReflectUtil.java                    反射工具类            --未使用
                    xml    
                        ConfigDataArr.java                    所有配置类的父接口
                        ConfigDataManager.java                配置文件的管理类
                        XmlDataLoader.java                    封装好的xml解析
                        XmlParser.java                        xml解析基础类        --未使用
                server\biz\entity\cfg
                    CfgHero.java                            对应Hero.xml中的hero标签
                    ConfigDataArrCfgHero.java                对应Hero.xml文件
            resources\cfg
                data-static-config
                    Hero.xml                                Hero的配置
                dataConfig.xml                                所有配置数据的清单文件    
            test\java\com\lizhaoblog\base\xml
                ConfigDataManagerTest.java                    测试类
            pom.xml                                            添加解析xml的包
        
        挑几个逻辑上的内容说下
            ConfigDataArr
                里面封装了一个方法getList
                因为我们的数据都是以数组的形式出来的,所以都会有一个数组类和具体类,这个就是数组类的通用接口
            ConfigDataManager
                这里面有一个map用来存放配置文件,
                还有个loadXml方法用于加载配置
                    通过调用XmlDataLoader.load方法
            XmlDataLoader
                这里面写了加载配置的整个过程,如下
                   * 假设我在resources/cfg目录中的dataConfig.xml列出了这个项目所有的配置数据
                        * ---文件的格式是,
                           * <config>
                           * <file name="Hero" />
                           * <file name="BBBBB" />
                           * </config>
                   * /config/file标签对应的类名为name标签---》resources/cfg目录的data-static-config目录下有标签对应的xml
                       * ---文件的格式是,会是一个数组,内部是Hero数据
                           * <Root>
                           * <Hero id="1" roleId="1001" name="曹操" type="1" countryType="1" icon="ui://rgylkpibej3p9" />
                           * <Hero id="2" roleId="1002" name="刘备" type="2" countryType="2" icon="ui://rgylkpibej3p8" />
                           * <Hero id="3" roleId="1003" name="孙权" type="3" countryType="3" icon="ui://rgylkpibej3p5" />
                           * </Root>
                           
                   * 这个xml对应的类在com.lizhaoblog.server.biz.entity.cfg.中,因为是一个数组,所以我们是需要一个数组类来接收
                   * 前缀就是ConfigDataArrCfg
                   
                   * 在上述的流程中依次出现的是
                   * String catalogDir = "/cfg/";
                   * String catalogFile = "dataConfig.xml";
                   * String catalogMainNode = "/config/file";
                   * String catalogAttribute = "name";
                   * String xmlFileDir = "/cfg/data-static-config/";
                   * String cfgPackageName = "com.lizhaoblog.server.biz.entity.cfg.";
                   * String cfgPrefix = "ConfigDataArrCfg";
            ConfigDataManagerTest
                当我们使用的时候就很简单了
                    ConfigDataManager.getInstance()
                            .loadXml(cfgPackageName, cfgPrefix, catalogDir, catalogFile, catalogMainNode, catalogAttribute, xmlFileDir);
                    Map<String, List<?>> configDataMap = ConfigDataManager.getInstance().getConfigDataMap();
            
            
        把代码贴出来
            
            pom.xml                                            添加解析xml的包
        

    <!-- dom4j begin -->
        <dependency>
          <groupId>dom4j</groupId>
          <artifactId>dom4j</artifactId>
          <version>1.6.1</version>
        </dependency>
        <!--xml转换 -->
        <dependency>
          <groupId>com.thoughtworks.xstream</groupId>
          <artifactId>xstream</artifactId>
          <version>1.4.3</version>
        </dependency>
    
        <!-- jaxen -->
        <!-- 不加这个xml解析时会报异常 java.lang.ClassNotFoundException: org.jaxen.JaxenException -->
        <dependency>
          <groupId>jaxen</groupId>
          <artifactId>jaxen</artifactId>
          <version>1.1.6</version>
        </dependency>
    
        <!-- dom4j end -->


            XmlConfigReadException.java            把解析xml中所有的错误转成XmlConfigReadException抛出

    /*
     * Copyright (C), 2015-2018
     * FileName: XmlConfigReadException
     * Author:   zhao
     * Date:     2018/7/24 16:15
     * Description: 读取配置文件时出现错误
     * History:
     * <author>          <time>          <version>          <desc>
     * 作者姓名           修改时间           版本号              描述
     */
    package com.lizhaoblog.base.exception;
    
    /**
     * 〈一句话功能简述〉<br>
     * 〈读取配置文件时出现错误〉
     *
     * @author zhao
     * @date 2018/7/24 16:15
     * @since 1.0.1
     */
    public class XmlConfigReadException extends Exception {
      private String errMsg;
    
      public XmlConfigReadException(String errMsg) {
        super(errMsg);
        this.errMsg = errMsg;
      }
    
      public XmlConfigReadException(Throwable cause) {
        super(cause);
      }
    
    }
    

            ReflectUtil.java                    反射工具类            --未使用

    /*
     * Copyright (C), 2015-2018
     * FileName: ReflectUtil
     * Author:   zhao
     * Date:     2018/7/24 16:07
     * Description: 反射工具类
     * History:
     * <author>          <time>          <version>          <desc>
     * 作者姓名           修改时间           版本号              描述
     */
    package com.lizhaoblog.base.util;
    
    import java.lang.reflect.Field;
    import java.sql.Timestamp;
    
    /**
     * 〈一句话功能简述〉<br>
     * 〈反射工具类〉
     *
     * @author zhao
     * @date 2018/7/24 16:07
     * @since 1.0.1
     */
    public class ReflectUtil {
      /**
       * 将obj对象的field属性设置值为value
       *
       * @param obj   对象
       * @param field 属性
       * @param value 值
       * @throws IllegalArgumentException 非法参数异常
       * @throws IllegalAccessException   安全权限异常,一般来说,是由于java在反射时调用了private方法所导致
       */
      private static void setField(Object obj, Field field, String value) throws IllegalArgumentException, IllegalAccessException {
        field.setAccessible(true);
        if (field.getType() == int.class) {
          field.setInt(obj, Integer.parseInt(value));
        } else if (field.getType() == short.class) {
          field.setShort(obj, Short.parseShort(value));
        } else if (field.getType() == byte.class) {
          field.setByte(obj, Byte.parseByte(value));
        } else if (field.getType() == long.class) {
          field.setLong(obj, Long.parseLong(value));
        } else if (field.getType() == double.class) {
          field.setDouble(obj, Double.parseDouble(value));
        } else if (field.getType() == float.class) {
          field.setFloat(obj, Float.parseFloat(value));
        } else if (field.getType() == Timestamp.class) {
          field.set(obj, Timestamp.valueOf(value));
        } else {
          field.set(obj, field.getType().cast(value));
        }
      }
    
    }
    

            ConfigDataArr.java                    所有配置类的父接口
            

    /*
     * Copyright (C), 2015-2018
     * FileName: ConfigDataArr
     * Author:   zhao
     * Date:     2018/7/24 15:09
     * Description: 配置数据数组的基类
     * History:
     * <author>          <time>          <version>          <desc>
     * 作者姓名           修改时间           版本号              描述
     */
    package com.lizhaoblog.base.xml;
    
    import java.util.List;
    
    /**
     * 〈一句话功能简述〉<br>
     * 〈配置数据数组的基类〉
     *
     * @author zhao
     * @date 2018/7/24 15:09
     * @since 1.0.1
     */
    public interface ConfigDataArr {
      /**
       * 配置数据存有一个数组,该方法将返回这个数组
       *
       * @return 返回数组
       */
      List getList();
    }
    


            ConfigDataManager.java                配置文件的管理类
            

    /*
     * Copyright (C), 2015-2018
     * FileName: ConfigDataManager
     * Author:   zhao
     * Date:     2018/7/24 15:12
     * Description: 配置数据的管理类
     * History:
     * <author>          <time>          <version>          <desc>
     * 作者姓名           修改时间           版本号              描述
     */
    package com.lizhaoblog.base.xml;
    
    import com.lizhaoblog.base.exception.XmlConfigReadException;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * 〈一句话功能简述〉<br>
     * 〈配置数据的管理类〉
     *
     * @author zhao
     * @date 2018/7/24 15:12
     * @since 1.0.1
     */
    public class ConfigDataManager {
      private static ConfigDataManager instance = null;
      /**
       * key:实体名 value:该实体下的所有模板数据
       */
      private Map<String, List<?>> configDataMap;
    
      private ConfigDataManager() {
        configDataMap = new HashMap<String, List<?>>();
      }
    
      public static ConfigDataManager getInstance() {
        if (instance == null) {
          instance = new ConfigDataManager();
        }
        return instance;
      }
    
      /**
       * 假设我在resources/cfg目录中的dataConfig.xml列出了这个项目所有的配置数据
       * ---文件的格式是,
       * <config>
       * <file name="Hero" />
       * <file name="BBBBB" />
       * </config>
       * /config/file标签对应的类名为name标签---》resources/cfg目录的data-static-config目录下有标签对应的xml
       * ---文件的格式是,会是一个数组,内部是Hero数据
       * <Root>
       * <Hero id="1" roleId="1001" name="曹操" type="1" countryType="1" icon="ui://rgylkpibej3p9" />
       * <Hero id="2" roleId="1002" name="刘备" type="2" countryType="2" icon="ui://rgylkpibej3p8" />
       * <Hero id="3" roleId="1003" name="孙权" type="3" countryType="3" icon="ui://rgylkpibej3p5" />
       * </Root>
       * <p>
       * 这个xml对应的类在com.lizhaoblog.server.biz.entity.cfg.中,因为是一个数组,所以我们是需要一个数组类来接收
       * 前缀就是ConfigDataArrCfg
       * <p>
       * 在上述的流程中依次出现的是
       * String catalogDir = "/cfg/";
       * String catalogFile = "dataConfig.xml";
       * String catalogMainNode = "/config/file";
       * String catalogAttribute = "name";
       * String xmlFileDir = "/cfg/data-static-config/";
       * String cfgPackageName = "com.lizhaoblog.server.biz.entity.cfg.";
       * String cfgPrefix = "ConfigDataArrCfg";
       *
       * @param cfgPackageName   转换出来的类所在的包名
       * @param cfgPrefix        转换出来类的前缀
       * @param catalogDir       所有配置的清单文件 所在的文件夹
       * @param catalogFile      所有配置的清单文件
       * @param catalogMainNode  清单文件的标签
       * @param catalogAttribute 清单文件的标签名称
       * @param xmlFileDir       xml文件对应的路径
       */
      public void loadXml(String cfgPackageName, String cfgPrefix, String catalogDir, String catalogFile,
              String catalogMainNode, String catalogAttribute, String xmlFileDir) throws XmlConfigReadException {
        XmlDataLoader dl = new XmlDataLoader(cfgPackageName, cfgPrefix, catalogDir, catalogFile, catalogMainNode,
                catalogAttribute, xmlFileDir);
        dl.load();
      }
    
      /**
       * 获取该实体类下所有模板数据
       *
       * @param beanName 实体类
       * @return 实体类对应的所有模板数据
       */
      @SuppressWarnings("unchecked")
      public List listAll(String beanName) {
        return configDataMap.get(beanName);
      }
    
      /**
       * 注册对象到对应类的List中
       *
       * @param key     key
       * @param dataMap 数据map
       */
      public void registerObject(Object key, Map<String, List<?>> dataMap) {
        add(key.getClass().getSimpleName(), key, dataMap);
      }
    
      @SuppressWarnings("unchecked")
      private void add(String key, Object data, Map<String, List<?>> dataMap) {
        List list = dataMap.computeIfAbsent(key, k -> new ArrayList());
        list.add(data);
      }
    
      public Map<String, List<?>> getConfigDataMap() {
        return configDataMap;
      }
    
      public void setConfigDataMap(Map<String, List<?>> configDataMap) {
        this.configDataMap = configDataMap;
      }
    
      public void afterLoad() {
        // 加载后处理
      }
    
      public void loadCanShu() {
        // 加载全局参数xml配置
      }
    }


            XmlDataLoader.java                    封装好的xml解析
            

    /*
     * Copyright (C), 2015-2018
     * FileName: XmlDataLoader
     * Author:   zhao
     * Date:     2018/7/24 12:14
     * Description: 加载配置文件获取到实际的配置类
     * History:
     * <author>          <time>          <version>          <desc>
     * 作者姓名           修改时间           版本号              描述
     */
    package com.lizhaoblog.base.xml;
    
    import com.lizhaoblog.base.exception.XmlConfigReadException;
    
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.Collections;
    import java.util.HashMap;
    import java.util.LinkedList;
    import java.util.List;
    import java.util.Map;
    
    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.JAXBException;
    import javax.xml.bind.Unmarshaller;
    
    /**
     * 〈一句话功能简述〉<br>
     * 〈加载配置文件获取到实际的配置类〉
     *
     * @author zhao
     * @date 2018/7/24 12:14
     * @since 1.0.1
     */
    public class XmlDataLoader {
      private static final Logger logger = LoggerFactory.getLogger(XmlDataLoader.class);
    
      /**
       * 业务中对应配置文件的包名全路径
       */
      private String cfgPackageName;
      /**
       * 对应配置文件的各个类的前缀
       */
      private String cfgPrefix;
      /**
       * 所有配置的清单文件 所在的文件夹
       */
      private String catalogDir;
      /**
       * 所有配置的清单文件
       */
      private String catalogFile;
      /**
       * 清单文件的标签
       */
      private String catalogMainNode;
      /**
       * 清单文件的标签名称
       */
      private String catalogAttribute;
    
      /**
       * xml文件对应的路径
       */
      private String xmlFileDir;
    
      private static final String POSTFIX_XML = ".xml";
    
      //  public XmlDataLoader(String packageName, String catalogFile) {
      //    this.cfgPackageName = packageName;
      //    this.catalogFile = catalogFile;
      //  }
    
      /**
       * 假设我在resources/cfg目录中的dataConfig.xml列出了这个项目所有的配置数据
       * ---文件的格式是,
       * <config>
       * <file name="Hero" />
       * <file name="BBBBB" />
       * </config>
       * /config/file标签对应的类名为name标签---》resources/cfg目录的data-static-config目录下有标签对应的xml
       * ---文件的格式是,会是一个数组,内部是Hero数据
       * <Root>
       * <Hero id="1" roleId="1001" name="曹操" type="1" countryType="1" icon="ui://rgylkpibej3p9" />
       * <Hero id="2" roleId="1002" name="刘备" type="2" countryType="2" icon="ui://rgylkpibej3p8" />
       * <Hero id="3" roleId="1003" name="孙权" type="3" countryType="3" icon="ui://rgylkpibej3p5" />
       * </Root>
       * <p>
       * 这个xml对应的类在com.lizhaoblog.server.biz.entity.cfg.中,因为是一个数组,所以我们是需要一个数组类来接收
       * 前缀就是ConfigDataArrCfg
       * <p>
       * 在上述的流程中依次出现的是
       * String catalogDir = "/cfg/";
       * String catalogFile = "dataConfig.xml";
       * String catalogMainNode = "/config/file";
       * String catalogAttribute = "name";
       * String xmlFileDir = "/cfg/data-static-config/";
       * String cfgPackageName = "com.lizhaoblog.server.biz.entity.cfg.";
       * String cfgPrefix = "ConfigDataArrCfg";
       *
       * @param cfgPackageName   转换出来的类所在的包名
       * @param cfgPrefix        转换出来类的前缀
       * @param catalogDir       所有配置的清单文件 所在的文件夹
       * @param catalogFile      所有配置的清单文件
       * @param catalogMainNode  清单文件的标签
       * @param catalogAttribute 清单文件的标签名称
       * @param xmlFileDir       xml文件对应的路径
       */
      public XmlDataLoader(String cfgPackageName, String cfgPrefix, String catalogDir, String catalogFile,
              String catalogMainNode, String catalogAttribute, String xmlFileDir) {
        this.cfgPackageName = cfgPackageName;
        this.cfgPrefix = cfgPrefix;
        this.catalogDir = catalogDir;
        this.catalogFile = catalogFile;
        this.catalogMainNode = catalogMainNode;
        this.catalogAttribute = catalogAttribute;
        this.xmlFileDir = xmlFileDir;
      }
    
      /**
       * 调用load方法加载所有的配置文件
       *
       * @throws XmlConfigReadException 加载配置文件时出现的错误
       */
      public void load() throws XmlConfigReadException {
        SAXReader reader = new SAXReader();
        try {
          InputStream resourceAsStream = getClass().getResourceAsStream(catalogDir + catalogFile);
          InputStreamReader inputStreamReader = new InputStreamReader(resourceAsStream);
          Document doc = reader.read(inputStreamReader);
          List<?> nodes = doc.selectNodes(catalogMainNode);
          Map<String, List<?>> dataMap = new HashMap<String, List<?>>();
          List<String> files = new LinkedList<String>();
          for (Object n : nodes) {
            Element t = (Element) n;
            String f = t.attributeValue(catalogAttribute);
            ConfigDataArr ob = (ConfigDataArr) loadFile(f);
            for (Object o : ob.getList()) {
              ConfigDataManager.getInstance().registerObject(o, dataMap);
            }
            files.add(f);
          }
          logger.info("读取配置完毕,准备afterLoad");
          ConfigDataManager.getInstance().setConfigDataMap(dataMap);
          ConfigDataManager.getInstance().afterLoad();
          logger.info("afterLoad 完毕");
        } catch (DocumentException e) {
          throw new XmlConfigReadException("载入文件出错:DocumentException " + e.getMessage());
        }
      }
    
      private Object loadFile(String className) throws XmlConfigReadException {
    
        InputStream resourceAsStream = null;
        try {
          String file = xmlFileDir + className + POSTFIX_XML;
          logger.info("load file: {}", file);
          resourceAsStream = getClass().getResourceAsStream(file);
          if (resourceAsStream == null) {
            throw new XmlConfigReadException("文件不存在:" + file);
          }
          return loadFromStream(className, resourceAsStream);
        } finally {
          try {
            if (resourceAsStream != null) {
              resourceAsStream.close();
            }
          } catch (IOException e) {
            e.printStackTrace();
          }
        }
      }
    
      public Object loadFromStream(String name, InputStream resourceAsStream) throws XmlConfigReadException {
        // get clazz
        String className = cfgPackageName + cfgPrefix + name;
        try {
          Class<?> classObject = Class.forName(className);
          if (classObject == null) {
            logger.error("未找到类" + className);
            return Collections.EMPTY_LIST;
          }
          JAXBContext context = JAXBContext.newInstance(classObject);
          Unmarshaller unmarshaller = context.createUnmarshaller();
          return unmarshaller.unmarshal(resourceAsStream);
        } catch (JAXBException | ClassNotFoundException e) {
          throw new XmlConfigReadException("loadFromStream 出现错误:" + name + "  " + e.getClass() + "  " + e.getMessage());
        }
      }
    
    }
    


            XmlParser.java                        xml解析基础类        --未使用

    /*
     * Copyright (C), 2015-2018
     * FileName: XmlParser
     * Author:   zhao
     * Date:     2018/7/24 11:55
     * Description: xml的解析类
     * History:
     * <author>          <time>          <version>          <desc>
     * 作者姓名           修改时间           版本号              描述
     */
    package com.lizhaoblog.base.xml;
    
    import org.dom4j.Attribute;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.DocumentHelper;
    import org.dom4j.Element;
    import org.dom4j.Node;
    import org.dom4j.io.OutputFormat;
    import org.dom4j.io.SAXReader;
    import org.dom4j.io.XMLWriter;
    
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    
    /**
     * 〈一句话功能简述〉<br>
     * 〈xml的解析类〉
     *
     * @author zhao
     * @date 2018/7/24 11:55
     * @since 1.0.1
     */
    public class XmlParser {
      private XmlParser() {
      }
    
      /**
       * @param xmlPath
       * 方法功能描述:生成空的xml文件头
       * 方法名:createEmptyXmlFile
       * 返回类型:Document
       * 时间:2011-4-14下午12:44:20
       */
      public static Document createEmptyXmlFile(String xmlPath) {
        if (xmlPath == null || "".equals(xmlPath)) {
          return null;
        }
    
        XMLWriter output;
        Document document = DocumentHelper.createDocument();
    
        OutputFormat format = OutputFormat.createPrettyPrint();
        try {
          output = new XMLWriter(new FileWriter(xmlPath), format);
          output.write(document);
          output.close();
        } catch (IOException e) {
          return null;
        }
        return document;
      }
    
      /**
       * 根据xml文件路径取得document对象
       *
       * @param xmlPath
       * @return
       * @throws DocumentException
       */
      public static Document getDocument(String xmlPath) {
        if (xmlPath == null || "".equals(xmlPath)) {
          return null;
        }
    
        File file = new File(xmlPath);
        if (!file.exists()) {
          return createEmptyXmlFile(xmlPath);
        }
    
        SAXReader reader = new SAXReader();
        Document document = null;
        try {
          document = reader.read(xmlPath);
        } catch (DocumentException e) {
          e.printStackTrace();
        }
        return document;
      }
    
      /**
       * @param document DOC对象
       * 方法功能描述:得到根节点
       * 方法名:getRootEleme
       * 返回类型:Element
       * 时间:2011-4-8下午12:54:02
       */
      public static Element getRootNode(Document document) {
        if (document == null) {
          return null;
        }
    
        Element root = document.getRootElement();
        return root;
      }
    
      /**
       * @param xmlPath
       * @return
       * @throws DocumentException
       * 方法功能描述: 根据路径直接拿到根节点
       * 方法名:getRootElement
       * 参数描述 :
       * 返回类型:Element
       * 时间:2011-4-14下午03:01:14
       */
      public static Element getRootNode(String xmlPath) {
        if (xmlPath == null || "".equals(xmlPath.trim())) {
          return null;
        }
        Document document = getDocument(xmlPath);
        if (document == null) {
          return null;
        }
        return getRootNode(document);
      }
    
      /**
       * @param parent
       * 方法功能描述:得到指定元素的迭代器
       * 方法名:getIterator
       * 返回类型:Iterator<Element>
       * 时间:2011-4-14上午11:29:18
       */
      @SuppressWarnings("unchecked")
      public static Iterator<Element> getIterator(Element parent) {
        if (parent == null) {
          return null;
        }
        Iterator<Element> iterator = parent.elementIterator();
        return iterator;
      }
    
      /**
       * @param parent
       * @param childName
       * 方法功能描述: 根据子节点名称得到指定的子节点
       * 方法名:getChildElement
       * 返回类型:Element
       * 时间:2011-4-14上午11:18:03
       */
      @SuppressWarnings("unchecked")
      public static List<Element> getChildElements(Element parent, String childName) {
        childName = childName.trim();
        if (parent == null) {
          return null;
        }
        childName += "//";
        List<Element> childElements = parent.selectNodes(childName);
        return childElements;
      }
    
      /**
       * @param node
       * @return 参数描述 :
       * 方法功能描述:获取子list
       * 方法名:getChildList
       * 返回类型:List<Element>
       * 时间:2011-4-14下午12:21:52
       */
      public static List<Element> getChildList(Element node) {
        if (node == null) {
          return null;
        }
        Iterator<Element> itr = getIterator(node);
        if (itr == null) {
          return null;
        }
        List<Element> childList = new ArrayList<Element>();
        while (itr.hasNext()) {
          Element kidElement = itr.next();
          if (kidElement != null) {
            childList.add(kidElement);
          }
        }
        return childList;
      }
    
      /**
       * @param parent
       * @param nodeNodeName
       * @return 参数描述 : 父节点,子节点名称
       * 方法功能描述 : 查询没有子节点的节点,使用xpath方式
       * 方法名:getSingleNode
       * 返回类型:Node
       * 时间:2011-4-14下午12:38:25
       */
      public static Node getSingleNode(Element parent, String nodeNodeName) {
        nodeNodeName = nodeNodeName.trim();
        String xpath = "//";
        if (parent == null) {
          return null;
        }
        if (nodeNodeName == null || "".equals(nodeNodeName)) {
          return null;
        }
        xpath += nodeNodeName;
        Node kid = parent.selectSingleNode(xpath);
        return kid;
      }
    
      /**
       * @param parent
       * @param childName
       * @return 参数描述 :
       * 方法功能描述:得到子节点,不使用xpath
       * 方法名:getChild
       * 返回类型:Element
       * 时间:2011-4-14下午12:53:22
       */
      @SuppressWarnings("rawtypes")
      public static Element getChild(Element parent, String childName) {
        childName = childName.trim();
        if (parent == null) {
          return null;
        }
        if (childName == null || "".equals(childName)) {
          return null;
        }
        Element e = null;
        Iterator it = getIterator(parent);
        while (it != null && it.hasNext()) {
          Element k = (Element) it.next();
          if (k == null) {
            continue;
          }
          if (k.getName().equalsIgnoreCase(childName)) {
            e = k;
            break;
          }
        }
        return e;
      }
    
      /**
       * @param e
       * 方法功能描述:判断节点是否还有子节点
       * 方法名:hasChild
       * 返回类型:boolean
       * 时间:2011-4-14下午01:43:48
       */
      public static boolean hasChild(Element e) {
        if (e == null) {
          return false;
        }
        return e.hasContent();
      }
    
      /**
       * @param e
       * 方法功能描述:得到指定节点的属性的迭代器
       * 方法名:getAttrIterator
       * 返回类型:Iterator<Attribute>
       * 时间:2011-4-14下午01:42:38
       */
      @SuppressWarnings("unchecked")
      public static Iterator<Attribute> getAttrIterator(Element e) {
        if (e == null) {
          return null;
        }
        Iterator<Attribute> attrIterator = e.attributeIterator();
        return attrIterator;
      }
    
      /**
       * @param e
       * @return 节点属性的list集合
       * 方法功能描述:遍历指定节点的所有属性
       * 方法名:getAttributeList
       * 返回类型:List<Attribute>
       * 时间:2011-4-14下午01:41:38
       */
      public static List<Attribute> getAttributeList(Element e) {
        if (e == null) {
          return null;
        }
        List<Attribute> attributeList = new ArrayList<Attribute>();
        Iterator<Attribute> atrIterator = getAttrIterator(e);
        if (atrIterator == null) {
          return null;
        }
        while (atrIterator.hasNext()) {
          Attribute attribute = atrIterator.next();
          attributeList.add(attribute);
        }
        return attributeList;
      }
    
      /**
       * @param element  指定的元素
       * @param attrName 属性名称
       * @return Attribute
       * 方法功能描述: 得到指定节点的指定属性
       * 方法名:getAttribute
       * 返回类型:Attribute
       * 时间:2011-4-14下午01:45:27
       */
      public static Attribute getAttribute(Element element, String attrName) {
        attrName = attrName.trim();
        if (element == null) {
          return null;
        }
        if (attrName == null || "".equals(attrName)) {
          return null;
        }
        Attribute attribute = element.attribute(attrName);
        return attribute;
      }
    
      /**
       * @param e
       * @param attrName
       * 方法功能描述:获取指定节点指定属性的值
       * 方法名:attrValue
       * 返回类型:String
       * 时间:2011-4-14下午02:36:48
       */
      public static String attrValue(Element e, String attrName) {
        attrName = attrName.trim();
        if (e == null) {
          return null;
        }
        if (attrName == null || "".equals(attrName)) {
          return null;
        }
        return e.attributeValue(attrName);
      }
    
      /**
       * @return 属性集合
       * 方法功能描述:得到指定节点的所有属性及属性值
       * 方法名:getNodeAttrMap
       * 返回类型:Map<String,String>
       * 时间:2011-4-15上午10:00:26
       */
      public static Map<String, String> getNodeAttrMap(Element e) {
        Map<String, String> attrMap = new HashMap<String, String>();
        if (e == null) {
          return null;
        }
        List<Attribute> attributes = getAttributeList(e);
        if (attributes == null) {
          return null;
        }
        for (Attribute attribute : attributes) {
          String attrValueString = attrValue(e, attribute.getName());
          attrMap.put(attribute.getName(), attrValueString);
        }
        return attrMap;
      }
    
      /**
       * @param e
       * @return 参数描述 :
       * 方法功能描述: 遍历指定节点的下没有子节点的元素的text值
       * 方法名:getSingleNodeText
       * 返回类型:Map<String,String>
       * 时间:2011-4-15下午12:24:38
       */
      public static Map<String, String> getSingleNodeText(Element e) {
        Map<String, String> map = new HashMap<String, String>();
        if (e == null) {
          return null;
        }
        List<Element> kids = getChildList(e);
        for (Element e2 : kids) {
          if (e2.getTextTrim() != null) {
            map.put(e2.getName(), e2.getTextTrim());
          }
        }
        return map;
      }
    
      /**
       * @param xmlFilePath
       * @return 参数描述 :
       * 方法功能描述:遍历根节点下,没有子节点的元素节点,并将此节点的text值放入map中返回
       * 方法名:getSingleNodeText
       * 返回类型:Map<String,String>
       * 时间:2011-4-15下午12:23:30
       */
      public static Map<String, String> getSingleNodeText(String xmlFilePath) {
        xmlFilePath = xmlFilePath.trim();
        if (xmlFilePath == null || "".equals(xmlFilePath)) {
          return null;
        }
        Element rootElement = getRootNode(xmlFilePath);
        if (rootElement == null || !hasChild(rootElement)) {
          return null;
        }
        return getSingleNodeText(rootElement);
      }
    
      public enum Flag {
        //节点个数 一个
        one, //节点个数 多个
        more
      }
    
      /**
       * @param xmlFilePath
       * @param tagName
       * @param flag        : 指定元素的个数
       * 方法功能描述:根据xml路径和指定的节点的名称,得到指定节点,从根节点开始找
       * 方法名:getNameNode
       * 返回类型:Element 指定的节点
       * 时间:2011-4-15下午12:22:35
       */
      @SuppressWarnings("unchecked")
      public static <T> T getNameNode(String xmlFilePath, String tagName, Flag flag) {
        xmlFilePath = xmlFilePath.trim();
        tagName = tagName.trim();
        if (xmlFilePath == null || tagName == null || "".equals(xmlFilePath) || "".equals(tagName)) {
          return null;
        }
        Element rootElement = getRootNode(xmlFilePath);
        if (rootElement == null) {
          return null;
        }
        List<Element> tagElementList = getNameElement(rootElement, tagName);
        if (tagElementList == null) {
          return null;
        }
        switch (flag) {
          case one:
            return (T) tagElementList.get(0);
          default:
            break;
        }
        return (T) tagElementList;
      }
    
      /**
       * @param parent
       * @return 参数描述 :
       * 方法功能描述:得到指定节点下所有子节点的属性集合
       * 方法名:getNameNodeAllAttributeMap
       * 返回类型:Map<Integer,Object>
       * 时间:2011-4-18下午04:40:14
       */
      public static Map<Integer, Object> getNameNodeAllKidsAttributeMap(Element parent) {
        Map<Integer, Object> allAttrMap = new HashMap<Integer, Object>();
        if (parent == null) {
          return null;
        }
        List<Element> childlElements = getChildList(parent);
        if (childlElements == null) {
          return null;
        }
        for (int i = 0; i < childlElements.size(); i++) {
          Element childElement = childlElements.get(i);
          Map<String, String> attrMap = getNodeAttrMap(childElement);
          allAttrMap.put(i, attrMap);
        }
        return allAttrMap;
      }
    
      /**
       * @param xmlFilePath xml文件名路径
       * @param nodeName  指定的节点名称
       * @return 参数描述 :
       * 方法功能描述:根据xml文件名路径和指定的节点名称得到指定节点所有子节点的所有属性集合
       * 方法名:getNameNodeAllAttributeMap
       * 返回类型:Map<Integer,Object>
       * 时间:2011-4-18下午04:51:46
       */
      @SuppressWarnings("unchecked")
      public static <T> T getNameNodeAllAttributeMap(String xmlFilePath, String nodeName, Flag flag) {
        nodeName = nodeName.trim();
        Map<String, String> allAttrMap = null;
        Map<Integer, Map<String, String>> mostKidsAllAttriMap = new HashMap<Integer, Map<String, String>>();
        if (xmlFilePath == null || nodeName == null || "".equals(xmlFilePath) || "".equals(nodeName)) {
          return null;
        }
        switch (flag) {
          case one:
            Element nameNode = getNameNode(xmlFilePath, nodeName, Flag.one);
            allAttrMap = getNodeAttrMap(nameNode);
            return (T) allAttrMap;
          case more:
            List<Element> nameKidsElements = getNameNode(xmlFilePath, nodeName, Flag.more);
            for (int i = 0; i < nameKidsElements.size(); i++) {
              Element kid = nameKidsElements.get(i);
              allAttrMap = getNodeAttrMap(kid);
              mostKidsAllAttriMap.put(i, allAttrMap);
            }
            return (T) mostKidsAllAttriMap;
          default:
            break;
        }
        return null;
      }
    
      /**
       * @param element
       * 方法功能描述:遍历指定的节点下所有的节点
       * 方法名:ransack
       * 参数描述 :
       * 返回类型:void
       * 时间:2011-4-18下午05:25:41
       */
      public static List<Element> ransack(Element element, List<Element> allkidsList) {
        if (element == null) {
          return null;
        }
        if (hasChild(element)) {
          List<Element> kids = getChildList(element);
          for (Element e : kids) {
            allkidsList.add(e);
            ransack(e, allkidsList);
          }
        }
        return allkidsList;
      }
    
      /**
       * @param element
       * @param nodeName
       * @return 参数描述 :
       * 方法功能描述:得到指定节点下的指定节点集合
       * 方法名:getNameElement
       * 返回类型:Element
       * 时间:2011-4-18下午06:18:56
       */
      public static List<Element> getNameElement(Element element, String nodeName) {
        nodeName = nodeName.trim();
        List<Element> kidsElements = new ArrayList<Element>();
        if (element == null) {
          return null;
        }
        if (nodeName == null || "".equals(nodeName)) {
          return null;
        }
        List<Element> allKids = ransack(element, new ArrayList<Element>());
        if (allKids == null) {
          return null;
        }
        for (int i = 0; i < allKids.size(); i++) {
          Element kid = allKids.get(i);
          if (nodeName.equals(kid.getName())) {
            kidsElements.add(kid);
          }
        }
        return kidsElements;
      }
    
      /**
       * @param element
       * 方法功能描述:验证节点是否唯一
       * 方法名:validateSingle
       * 返回类型:int 节点唯一返回1, 节点不唯一返回大于一的整型数据
       * 时间:2011-4-20下午04:36:22
       */
      public static int validateSingle(Element element) {
        int j = 1;
        if (element == null) {
          return j;
        }
        Element parent = element.getParent();
        List<Element> kids = getChildList(parent);
        for (Element kid : kids) {
          if (element.equals(kid)) {
            j++;
          }
        }
        return j;
      }
    
    }
    

            CfgHero.java                            对应Hero.xml中的hero标签
            

    package com.lizhaoblog.server.biz.entity.cfg;
    
    import java.io.Serializable;
    
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlAttribute;
    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement(name = "Hero")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class CfgHero implements Serializable {
        @XmlAttribute(name = "id")
        private int id;
        @XmlAttribute(name = "roleId")
        private int roleId;
        @XmlAttribute(name = "name")
        private String name;
        @XmlAttribute(name = "type")
        private int type;
        @XmlAttribute(name = "countryType")
        private int countryType;
        @XmlAttribute(name = "icon")
        private String icon;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public int getRoleId() {
            return roleId;
        }
    
        public void setRoleId(int roleId) {
            this.roleId = roleId;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getType() {
            return type;
        }
    
        public void setType(int type) {
            this.type = type;
        }
    
        public int getCountryType() {
            return countryType;
        }
    
        public void setCountryType(int countryType) {
            this.countryType = countryType;
        }
    
        public String getIcon() {
            return icon;
        }
    
        public void setIcon(String icon) {
            this.icon = icon;
        }
    }
    


            ConfigDataArrCfgHero.java                对应Hero.xml文件

    package com.lizhaoblog.server.biz.entity.cfg;
    
    import com.lizhaoblog.base.xml.ConfigDataArr;
    
    import java.util.List;
    
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlElements;
    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement(name = "Root")
    @XmlAccessorType(XmlAccessType.FIELD)
    public class ConfigDataArrCfgHero implements ConfigDataArr {
    
        @XmlElements(value = {@XmlElement(name = "Hero", type = CfgHero.class)})
        private List<CfgHero> cfgHeroes;
    
        public List<CfgHero> getCfgHeroes() {
            return cfgHeroes;
        }
    
        public void setCfgHeroes(List<CfgHero> cfgHeroes) {
            this.cfgHeroes = cfgHeroes;
        }
    
        @Override
        public List getList() {
            return getCfgHeroes();
        }
    }
    

            Hero.xml                                Hero的配置
            

    <?xml version="1.0" encoding="utf-8"?>
    
    <!--Hero-->
    <Root>
      <Hero id="1" roleId="1001" name="曹操" type="1" countryType="1" icon="ui://rgylkpibej3p9"/>
      <Hero id="2" roleId="1002" name="刘备" type="2" countryType="2" icon="ui://rgylkpibej3p8"/>
      <Hero id="3" roleId="1003" name="孙权" type="3" countryType="3" icon="ui://rgylkpibej3p5"/>
    </Root>


            dataConfig.xml                                所有配置数据的清单文件    

    <?xml version="1.0" encoding="UTF-8"?>
    <config>
    	<file name="Hero" />
    </config>

            ConfigDataManagerTest.java                    测试类
            

    /*
     * Copyright (C), 2015-2018
     * FileName: ConfigDataManagerTest
     * Author:   zhao
     * Date:     2018/7/24 16:40
     * Description: ConfigDataManager的测试类
     * History:
     * <author>          <time>          <version>          <desc>
     * 作者姓名           修改时间           版本号              描述
     */
    package com.lizhaoblog.base.xml;
    
    import com.lizhaoblog.base.exception.XmlConfigReadException;
    
    import org.junit.Test;
    
    import java.util.List;
    import java.util.Map;
    
    /**
     * 〈一句话功能简述〉<br>
     * 〈ConfigDataManager的测试类〉
     *
     * @author zhao
     * @date 2018/7/24 16:40
     * @since 1.0.1
     */
    public class ConfigDataManagerTest {
    
      @Test
      public void testLoadXml() throws XmlConfigReadException {
        String cfgPackageName = "com.lizhaoblog.server.biz.entity.cfg.";
        String cfgPrefix = "ConfigDataArrCfg";
        String catalogDir = "/cfg/";
        String catalogFile = "dataConfig.xml";
        String catalogMainNode = "/config/file";
        String catalogAttribute = "name";
        String xmlFileDir = "/cfg/data-static-config/";
        ConfigDataManager.getInstance()
                .loadXml(cfgPackageName, cfgPrefix, catalogDir, catalogFile, catalogMainNode, catalogAttribute, xmlFileDir);
        Map<String, List<?>> configDataMap = ConfigDataManager.getInstance().getConfigDataMap();
      }
    
    }
    


            上面的代码在码云上 https://gitee.com/lizhaoandroid/JgServer
            可以加qq群一起探讨Java游戏服务器开发的相关知识    676231564
            

    展开全文
  • 游戏服务器开发都要学什么

    万次阅读 多人点赞 2019-08-22 17:26:27
    近来遇到有很多人想从其它开发领域转到游戏服务器开发行业上来,他们或许觉得游戏服务器开发工资高,或许觉得做游戏服务器需要掌握的技术更高级,可以锻炼自己,或许觉得想换环境等等。不管出于什么原因吧,为一...
  • 游戏服务器开发需要什么

    千次阅读 2017-02-24 09:57:15
    近来遇到有很多人想从其它开发领域转到游戏服务器开发行业上来,他们或许觉得游戏服务器开发工资高,或许觉得做游戏服务器需要掌握的技术更高级,可以锻炼自己,或许觉得想换环境等等。不管出于什么原因吧,为一...
  • 获取更多笔记和源码 公众号:CocosCreator笔记 导读 ...配置Nginx ...配置游戏远程资源 1准备云服务器 腾讯云: https://url.cn/53X4QsE 阿里云: https://www.aliyun.com/sale-season/2...
  • 揭秘游戏服务器,不看后悔!!!

    万次阅读 多人点赞 2021-06-13 10:31:01
    游戏好玩,所有玩家看到了前端,但是一款游戏,离不开后台游戏服务器的支持,服务器都要做什么,服务器的架构是什么需要哪些技术,一系列的问题有没有思考过?下面讲下作为服务器开发中需要做的事。 1、常见...
  • 游戏服务器需要什么样的引擎?

    千次阅读 2017-03-06 06:46:27
    弹指一挥间从事游戏相关的开发工作已经十多年。在开发了六年多几经波折差点放弃的 starrydb.com项目也迎来了1.0版本的上线。虽然演示版本以及集群功能早在17年1月份就 开发完毕但修改和完善计划目前仍然排的满满当当...
  • 客户端会根据玩家所到地图,自动将地图文件,以及一些其它文件下载到玩家本地的客户端文件夹中,这样就形成了玩家一边玩游戏一边下载相关的文件到本地,这就需要游戏服务端的服务器的上传带宽足够大,因此机房就...
  • 一、下载资源: ... 将上面下载的安装包解压到一本地目录下,在得到的mysql-5.7.17-winx64文件夹目录下会有一my-default.ini配置文件,将几参数根据当前目录修改一下,要修改的参数有:basedir(...
  • [游戏技术]求生之路服务器参数配置

    千次阅读 2016-08-22 21:26:44
    server.cfg 服务器参数配置文件[文件路径:left4dead/cfg] host.txt 服务器LOGO地址[文件路径:left4dead/] motd.txt 服务器帮助文件[文件路径:left4dead/] Srcds启动文件参数配置 例子1:srcds.exe -...
  • 我选择用来进行服务器开发的语言是Java,开发流程更接近于JavaWeb,所以需要先为开发配置开发环境,需要配置的主要是Eclipse和Tomcat(Web工程的容器或管理工具)。一、资源下载:1.Eclipse:免安装,但需要先...
  • 前言: 之前的开发工作一直是在Windows开发环境下进行的,但是正真发布和外网运营势必要发布到Linux...一、准备工作:首先你需要一台安装Linux系统的机器,或者直接在Windows系统中安装虚拟机,这里我使用的就是虚拟
  • Pomelo服务器端框架简单地可分为两层,即链接层(Connector、Gate)和服务层(Logic、Master),也叫前端服务器(frontend server)和后端服务器(backend server)。 链接层直接与客户端进行网络通信,客户端的请求...
  • Nginx服务器配置

    千人学习 2017-01-01 20:16:08
    Nginx是由Igor Sysoev为俄罗斯的Rambler.ru站点开发的一高性能的HTTP和反向代理服务器,也是现在中国互联网公司使用多的代理软件,利用Nginx与各个模块的整合可以实现高效的WEB处理能力。官方QQ群:612148723。
  • Java游戏服务器开发之二十三–将xml-cfg和redis的配置内容加到properties中 之前将xml-cfg和redis的工具类都写好了,但是里面的参数都是写在程序里面的,这一篇的话就是讲这2配置文件写到properties中,不需要...
  • Photon Server是一款实时的Socket服务器和开发框架,快速、使用方便、容易扩展,服务端架构在Windows系统平台上,采用C#语言编写,Photon Server发布包括两部分,Client SDK Release和Server SDK Update,Server ...
  • 关于web服务器硬件配置

    千次阅读 2018-02-02 11:50:14
    在前几天Fish写了一篇“如果拥有一台属于自己的WEB服务器,你如何配置”的博文,上面说的是WEB服务器系统以及软件方面的配置,今天就...本博就针对一些经典的WEB服务器配置作解说吧: web服务器是一性能追求型
  • 服务器配置方案 在如今大数据流量剧增的网络应用时代,服务器租用越来越成为众多企业和运营商的首选。而性能和配置不达标的服务器选择只会给企业带来诸多运营问题;但不经过实际需求的评估,轻率的选择一台性能强劲...
  • 包括安装.NET Core运行库、MongoDB数据库1、确定.NET Core运行库版本,下载并安装2、安装MongoDB数据库和Studio 3T服务端程序编译与运行1、服务端程序编译2、资源服务器编译3、添加批处理文件客户端全局网络配置和...
  • 学习JAVA游戏服务器开发需要了解的情况

    万次阅读 多人点赞 2018-06-11 16:09:38
    一,游戏服务器开发的工作介绍近来遇到有很多人想从其它开发领域转到游戏服务器开发行业上来,他们或许觉得游戏服务器开发工资高,或许觉得做游戏服务器需要掌握的技术更高级,可以锻炼自己,或许觉得想换环境等等...
  • 服务器RAID配置全程

    万次阅读 多人点赞 2018-01-19 11:40:06
    一、RAID介绍RAID是Redundent Array of Inexpensive Disks的缩写,直译为“廉价冗余磁盘阵列”,也...可以把RAID理解成一种使用磁盘驱动器的方法,它将一组磁盘驱动器用某种逻辑方式联系起来,作为逻辑上的一磁盘驱
  • keyword/关键词: 饥荒 服务器 配置 linux ubuntu 参考链接: https://blog.csdn.net/szhiy/article/details/79996017 https://blog.csdn.net/qq_35543890/article/details/81257937 https://bl...
  • 服务器性能配置要点总结

    万次阅读 2018-04-15 20:55:43
    服务器的硬件配置2.服务器操作系统3.应用程序服务器硬件配置主要有: 图 1.0 服务器集群(1).CPU 一般来说CPU的数量越多,主频越高,那么服务器的性能也就会越好。在实际测试过程中,如果在大压力下持续观察CPU的...
  • golang Leaf 游戏服务器框架简介

    万次阅读 2017-11-04 11:43:43
    Leaf 是一由 Go 语言(golang)编写的开发效率和执行效率并重的开源游戏服务器框架。Leaf 适用于各类游戏服务器的开发,包括 H5(HTML5)游戏服务器。Leaf 的关注点:良好的使用体验。Leaf 总是尽可能的提供简洁和...
  • Minecraft多人联机服务器配置

    千次阅读 2020-05-22 22:06:18
    1Minecraft服务器(废话)我的世界官方服务器下载地址 一台好电脑(系统无所谓,我这里用Windows) 一敢于折腾的心 开始配置 解压之前下载的服务器,至于解压到哪随便你只要懂得变通就行. 我的世界官方服务器配置...
  • java游戏服务器必备

    千次阅读 2018-12-28 16:41:44
    对于一新手,想接触游戏服务器,一定会有疑问——使用Java开发服务器需要学习什么? &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Java语言,由于学习成本低,开发速度快,稳定
  • 但是,在游戏服务器端开发领域中的很多重要问题,并没有被明确的分辨出其特异性,从而得到专门的对待。我们不管是在业界开源领域,还是内部分享中,很少会有专门针对游戏业务特征进行专门设计的组件、类库或者框架。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 96,033
精华内容 38,413
关键字:

做个游戏服务器需要什么配置