精华内容
下载资源
问答
  • 游戏服务器架构简介

    2019-08-27 22:55:15
    这些会为我们的开发省下不少时间,对于游戏服务器的架构设计,我们首先要了解游戏的服务器架构都有什么组成?一款游戏到上线,需要具备哪些功能?游戏架构本身代表是一体系,它包括: 1.系统初始化 系统初始化是...

      游戏的架构设计非常重要,好的架构代码清晰,责任明确,扩展性强,易于调试。这些会为我们的开发省下不少时间,对于游戏服务器的架构设计,我们首先要了解游戏的服务器架构都有什么组成?一款游戏到上线,需要具备哪些功能?游戏架构本身代表是一个体系,它包括:

    1.系统初始化

    系统初始化是在没有客户端链接的时候,服务器启动时所需要做的工作。基本上就是配置文件的读取,初始化系统参数

    但是需要注意一些问题:
    系统初始化需要的参数配置在哪儿,是配置在本地服务器还是配置在数据库。

    服务器启动的时候去数据库取;

    配置的修改需不需要重启服务器等;

    2.游戏逻辑

    代码必须分层,不然后期要修改需求,比较麻烦,Netty是目前比较流行的NIO框架。

    协议层,也叫后台交互层,它主要负责前台交互协议的解析和返回数据。在这一层基本上没有什么业务逻辑实现。与前台交互的数据都在这一层开始,也在这一层终止。比如用Netty框架,那么Netty的Ctx只能出现在这一层,他不能出现到游戏业务逻辑代码的实现中,接收到客户端的请求,在这一层把需要的参数解析出来,再把参数传到业务逻辑方法中,业务逻辑方法处理完后,把要返回给客户端的数据再返回到这一层,在这一层组织数据,返回给客户端,这样就可以把业务逻辑和网络层分离,业务逻辑只关心业务实现,而且也方便对业务逻辑进行单元测试。

    业务逻辑层,这里处理真正的游戏逻辑,该计算价格计算价格,该通关的通关,该计时的计时。该保存数据的保存数据。但是这一层不直接操作缓存或者数据库,只是处理游戏逻辑计算。因为业务逻辑层是整个游戏时间的处理核心,所以他的处理是否正确直接决定游戏的正确性。所以这一层的代码要尽量使用面向对象的方法去实现。不要出现重复代码或相似的功能进行复制粘贴

    这样修改起来十分不便,可能是修改了某一处,而忘记修改另外同样的代码。还要考虑每个方法都是可测试的,一个方法的行数最好不要超过一百行。另外可以多爱看设计模式的书,它可以帮助我们设计出灵活,整洁的代码。

    3.数据库系统

    数据库是存储数据的核心,但是游戏数据在存储到数据库的时候会经过网络和磁盘的IO,它·的访问速度相对于内存来说是很慢的。一般来说每次访问数据库都要和数据库建立链接,访问完成之后,为了节省数据库的链接资源,再把链接断开。

    但是这种链接无形中又为服务器增加额开销,在大量的数据访问时,可能会更慢,而游戏又是要求低时延的,这时该怎么办?

    有一个数据库连接池,即把访问数据库的链接放到一个地方管理,用完不断开,用的时候去拿,用完再放回去。这样不用每次都建立新的链接了。

    但是如果要我们自己去实现一套连接池管理组建的话,需要时间不说,对技术的把控又是一个考验,还要经过测试等等,幸好互联网开源的今天,有一些先成的可以使用,这里推荐Mybatis,即实现了代码与SQL的分离,又有足够的SQL编写的灵活性,是一个不错的选择。

    4.缓存系统

    游戏中,客户端与服务器的交互就是要求低时延的,延迟越低,用户体验越好。像之前说过的一样,低时延就是要求服务器处理业务尽量的快,客户端一个请求过来,要在最短的时间内相应结果,最低不得超过500ms,因为加上来回的网络传输消耗,基本上就是600ms-700ms,再长就会觉得卡。

    如果直接从数据库中取数据,处理完之后再·存回数据库的话,这个性能是跟不上的。在服务器,数据在内存中处理是最快的,所以我们要把一部分常用的数据提前加载到内存中。比如说游戏数据配置表,经常登录的玩家数据等。这样在处理业务时,就不用走数据库了,直接从内存中取就可以了,速度更快。

    游戏中常见的缓存:

    1.直接把数据存储在JVM或服务器内存中

    2.使用第三方缓存工具,推荐Redis.

    5.游戏日志

    日志一定要记录详细。它是玩家在整个游戏中的行为记录,有了这个记录,我们就可以分析玩家的行为,查找游戏的不足,在处理玩家在游戏中的问题时·,日志也是一个良好的凭证和快速处理方式。

    在游戏中,日志分为:

    1.系统日志,主要记录服务器的系统情况。比如:数据库能否正常链接,服务器是否正常启动,数据是否正常加载;

    2.玩家行为日志,比如玩家发送了什么请求,得到了什么物品,消费了多少货币等等。

    3.统计日志,这种日志是对游戏中所有玩家某种行为的一种统计,根据这个统计来分析大部分玩家的行为,得出一些共性或不同之处,以方法运营做不同的活动吸引用户消费。

    在架构设计中,日志记录一定要作为一种强制行为,因为如果不强制的话,可能由于某种原因某个功能忘记加日志了,那么当这个功能出问题了,或者运营跟我们要这个功能的一些数据库,就GG了,又得加需求,改代码了。日志一定要设计一种良好的格式。日志记录的数据要容易读取,分解。日志行为可以用枚举描述,在功能最后的处理方法里面加上这个枚举作为参数,这样不管谁在调用这个方法时,都要去加参数描述。

    6.游戏管理工具

    俗话说,工欲善其事,必先利其器。游戏管理工具是对游戏运行种的一系列问题处理的一种工具。它不仅是给开发人员用,大多是给运营是哟个。游戏上线后,我们需要针对线上的问题进行不同的处理。不可能把所有问题都让程序员去处理,于是程序员们想到了一个办法,做个工具,爱谁谁。

    这个管理工具是一个不断增涨的系统,因为它很多时候是伴随着游戏种遇到的问题而实现的。

    但是根据经验,有些是必须有的,比如:

    服务器管理,主要负责服务器的开启,关闭,服务器配置信息,玩家信息查询;

    玩家管理,比如踢人,封号;

    统计查询,玩家行为日志查询,统计查询,次留率查询,邮件服务,修改玩家数据等。

    根据游戏的不同需求,凡是可以通过工具实现的,都做到游戏管理工具里面。它是针对所有服务器的管理。

    一个好的,全的游戏管理工具,可以提高游戏运营中遇到问题处理的效率,为玩家提供更好的服务。

    7.公共服务组件

    公共服务组件是为游戏运行中提供公共的服务。例如:

    充值服务器,我们没必要一个服用一个充值,而且也不能对外提供多个充值服务器地址,和第三方公司对接,他们绝对不干。

    还有运营搞活动时的礼包码;

    还有注册用户的管理,玩家一个注册账号可以进不同的区等。

    这些都是对所有区服提供的服务,所以要单独做,与游戏逻辑分开,这样方便管理,部署和负载均衡。

    还有SDK登录验证,现在手游比较多,与渠道对接里要进行验证,这往往是很多http请求,速度慢,所以这个也要拿出来单独做,不要在游戏逻辑中去验证,因为网络IO的访问时间是不可控制的,http是阻塞的请求。

    所以,综上来看,一个游戏服务器起码有几个大的功能模块:

    游戏逻辑工程;

    日志处理工程;

    充值工程;

    游戏管理工具工程;

    用户登录工程;

    公共活动工程;

    根据游戏的不同需要,可能还有其他的。所在架构的设计中,一定要考虑到系统的分布式部署,,尽量把公共的功能拆出来做,这样可以增强系统的可扩展性。

    展开全文
  • 什么使用命令行通常,游戏开发时,服务器端会使用配置文件,如json文件来配置启动时的程序参数。这样有一问题,配置文件会导致 Docker Swarm编排脚本变的复杂,难写。相反Docker Swarm编排脚本对命令行参数...

    为什么使用命令行

    通常,游戏开发时,服务器端会使用配置文件,如json文件来配置启动时的程序参数。

    这样做有一个问题,配置文件会导致 Docker Swarm编排脚本变的复杂,难写。相反Docker Swarm编排脚本对命令行参数支持的非常好。

    道理很简单,若是配置文件,则需要做进镜像中,使得镜像做好后,镜像内的配置文件,已经没办法修改了!如果是命令行参数,则可以在编排脚本中,自由更改启动时的命令行参数!

    虽然没用过其他容器类工具,如k8s。但是按此思路推测,配置文件都会遇到这个问题!

    因此如果打算后期使用Docker Swarm来部署自己的服务器的话,推荐将启动配置文件全部转化为命令行参数的方式提供。

    go flag库

    go语言通过官方自带的flag库,可以方便的定义、解析、以及获取命令行参数。

    网上教程很多,这里不在详细介绍了。

    封装原则

    这里要讲的是,编码时需要注意的问题。还是要强调2点:

    1. 引擎和应用程序的界限要分明
    2. 功能编码时要注意内敛

    按照这个思路,通常会编码2个文件
    - common/args.go
    - server(s)/args.go

    一个用来定义所有server公共的命令行参数;一个用来定义具体服务的命令行参数

    common/args.go 示例

    package common
    
    import "flag"
    
    type IArgs interface {
        Init()
        Parse()
        GetBase() *ArgsBase
    }
    
    type ArgsBase struct {
        EtcdHosts          string
        EtcdNodeType       int64
        EtcdWatchNodeTypes string
        EtcdPutInterval    int64
    }
    
    func (this *ArgsBase) Init() {
        // 下面是个例子,所有服务节点都有的配置,用于服务发现时的参数
        // etcd 
        flag.StringVar(&this.EtcdHosts, "etcdHosts", "192.168.1.4:12379,192.168.1.4:22379,192.168.1.4:32379", "etcd hosts")
        flag.Int64Var(&this.EtcdNodeType, "etcdNodeType", 1, "etcd node type")
        flag.StringVar(&this.EtcdWatchNodeTypes, "etcdWatchNodeTypes", "1,2,3,4", "etcd watch node type")
        flag.Int64Var(&this.EtcdPutInterval, "etcdPutInterval", 1, "etcd put interval")
    }
    
    func (this *ArgsBase) Parse() {
        // 这里同理
    }
    
    func (this *ArgsBase) GetBase() *ArgsBase {
        return this
    }

    server(s)/args.go

    package main
    
    import (
        "github.com/fananchong/go-x/common"
        "github.com/fananchong/go-x/def"
    )
    
    var (
        xargs *Args = NewArgs()
    )
    
    type Args struct {
        common.ArgsBase
    }
    
    func NewArgs() *Args {
        return &Args{}
    }
    
    func (this *Args) Init() {
        this.ArgsBase.Init()
        // 登录服务,私有启动参数,可以填这里
    }
    
    func (this *Args) Parse() {
        this.ArgsBase.Parse()
        this.EtcdNodeType = int64(def.Login)
    }

    总结

    通过上述2个类的示例,可以清晰通过查找args.go文件,立刻知道有哪些公共命令行参数、及私有命令行参数。

    详细可以参见github:

    https://github.com/fananchong/go-x

    会有更多惊喜等着你!

    展开全文
  • pomelo将填补这空白, 打造一款完全开源的高性能(并发)游戏服务器框架。 pomelo的优势有以下几点: 架构的可伸缩性好。 采用多进程单线程的运行架构,扩展服务器非常方便, node.js的网络io优势提供了高可...
  • 服务器和物理机有哪些区别?

    千次阅读 2020-08-10 11:22:08
    无论是个人还是企业,在搭建网站服务器的时候,...但是如果想建一大型游戏站或下载站等,就需要高性能高配置的物理机了,价格几百元到几千元不等。我们可以具体了解下云服务器和物理服务器区别 一、云服务器(云.

    无论是个人还是企业,在搭建网站服务器的时候,成本都是需要考虑的问题,那么我们今天就简单说下搭建一个网站,租用服务器大概多少钱。

     

    不同的行业、不同类型、不同大小的网站需要租用的服务器配置都各不相同。比如我想做一个小论坛,前期的话没什么流量,只要租一个虚拟主机或云主机就可以了,成本比较低,一月估计也就几十元,很多站长都是从用虚拟主机开始学习建站的。但是如果想建一个大型游戏站或下载站等,就需要高性能高配置的物理机了,价格几百元到几千元不等。我们可以具体了解下云服务器和物理服务器区别

    一、云服务器(云主机)

    是在一组集群服务器商虚拟出多个类似独立服务器的部分,集群中每个服务器上都有该云服务器的一个镜像。形象地讲,集群服务器犹如一个大型的公共停车场,而云服务器的使用,则是卖给了你停车的权利。云主机价格比较便宜,一月也就几十元到百元 ,年付价格几百元到千元不等。

    二、独立服务器(物理机)

    顾名思义是拥有整台服务器的所有软硬件资源,可以自行分配与实行多种网络功能服务。独立服务器更像是一个私人车库,专属性强,自己单独占有。

    独立服务器价格就比较高了,便宜些的月付差不多几百元到千元不等,高配置的大概几千到万元不等,影响独立服务器价格的因素比较多,我们可以简单了解下:

    ① 网站服务器所选机房

    机房的选择很多,像是电信机房、移动机房、联通机房,三线bgp机房等,单线路服务器价格便宜些,年付大概三五千左右,bgp价格要稍微贵些,年付4千到万元不等。不过如果业务打算发展全国地区的话建议选择三线BGP机房,覆盖国内三大运营商,可以保证全国大多数地区的快速访问。不同机房采用的网络设备也不一样。就比如说交换机,质量好的和质量差的,其价格也是千差万别的,但是好的性能就能远远地甩开差的设备的性能。这一点上如果你选择的机房比较好,要价比较贵,就没有受骗当冤大头一说。

    ② 网站服务器硬件配置

    我们买手机和电脑的时候都会考虑到硬件配置的问题,其实服务器租用和这些产品是一样的,配置的高低/性能的好坏决定了服务器租用价格的高低,租用只是硬件由IDC服务商提供,正规的IDC提供正品行货、新机,其次是负责质保,机器出现问题客户不用再找这个找那个,防止客户买到水货或者售后没有保障去找他理赔等等。

    ③ 网站服务器租用带宽

    服务器带宽大小与服务器带宽方式都是直接影响着服务器价格。对于跑带宽的直播、视频、下载、素材网站来说,对于服务器带宽需求远远大于对服务器的其它需求,服务器的价格也主要体现在服务器带宽费用上。同时,共享带宽远远比独享带宽便宜很多。但是共享带宽因是多人共同使用,往往会造成网站不稳定。所以为了网站能够更稳定、访问更流畅,推荐使用独享带宽。

    关于服务器租用多少钱?其实租用的价格并不是固定的。影响服务器租用价格的因素有很多,企业或个人在选独立服务器租用的时候一定要根据自己网站的需求进行选择配置。推荐:阿里云-云小站

    展开全文
  • 需要做的就是在服务器上安装Node.js,这是一运行中且热爱的Neblio钱包/守护程序。 为了在生产环境中将其作为基于服务的适当应用程序运行,此api随附了对pm2的支持。 确保使用npm install pm2 -g全局npm install...
  • 开发小游戏的常规做法,在游戏启动后,会请求服务器个配置文件,为了便于修改,一般会使用php动态文件。 这php配置文件作用是很大的,除了定义一些不想硬编码的数值和参数,还可以随时开启和关闭游戏里面提前...

    开发小游戏的常规做法,在游戏启动后,会请求服务器一个配置文件,为了便于修改,一般会使用php动态文件。
    这个php配置文件作用是很大的,除了定义一些不想硬编码的数值和参数,还可以随时开启和关闭游戏里面提前设定好的一些开关。(至于为什么要这么做,大家都懂的哈)

    有些需求或特性,需要依赖客户端的环境来启用不同的配置,那么怎么来判断客户端环境呢?一般有3种方法:
    1 定义在客户端的版本编号。
    这个编号可以和服务端进行对应以保证功能的一致性,比如客户端这个版本修改了一个功能,如果连接服务器老的版本则会有问题,需要根据客户端版本号来判断去连接新的服务器版本或者传给服务器做逻辑。客户端版本号可以在每次编译版本时自动生成一串数字编号在代码里面,比如我们游戏定义了:
    window.game_client_version = 2020051317554900; 会在请求php时会把这个参数传递过去。

    2 平台api提供的系统信息。
    如wx.getSystemInfoSync()里面包含的信息非常详细,有用户硬件型号、软件版本等等,都传递给服务器。

    3 直接在服务器通过php获取一些信息。
    比如 USER_AGENT、IP 等等。$_SERVER[‘HTTP_USER_AGENT’] 可以统计到这些信息:

    //PC微信:
    Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat
    //安卓微信:
    Mozilla/5.0 (Linux; Android 10; BLA-AL00 Build/HUAWEIBLA-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/79.0.3945.116 Mobile Safari/537.36 MicroMessenger/7.0.13.1620(0x27000D13) Process/appbrand2 NetType/WIFI Language/zh_CN ABI/arm64 WeChat/arm64
    //开发者工具:
    Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Mobile Safari/537.36 wechatdevtools/1.02.1911082 MicroMessenger/7.0.4 webview/20000 gameservice port/27727 token/8325f7e4d4514cb251607e524ad5ac22
    //IOS微信:
    Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.12(0x17000c2d) NetType/WIFI Language/zh_CN
    

    这样的话可以通过一些关键字来区分不同的平台处理特殊逻辑:
    PC微信:“Windows WindowsWechat”,安卓微信:“Linux; Android”,IOS微信:“iPhone; CPU iPhone”

    判断客户端操作系统

    private function getOS() {
        $agent = $_SERVER['HTTP_USER_AGENT'];
        if (strpos($agent, 'iPhone') || strpos($agent, 'iPad'))
            return 1;
        if (strpos($agent, 'Android'))
            return 2;
    
        return 0;
    }
    

    如果有需要,服务器可以记录一些信息备查,通过以下代码记录信息写文件:
    fileName="/data/log".date("Ymd",time()).".txt";fileputcontents(fileName = "/data/log_".date("Ymd", time()) .".txt"; file_put_contents(fileName, date(“Y-m-d H:i:s”, time()). “,” .$_SERVER[‘HTTP_USER_AGENT’] .PHP_EOL, FILE_APPEND);

    最后,经验提醒:现在各大小游戏平台都是需要提审版本才能更新功能的,故游戏内尽可能提前规划好运营过程中可能变化的地方,用配置的形式在游戏启动时读取,以避免频繁修改客户端代码提审版本。

    展开全文
  • CentOS服务器时间同步的2种方法

    千次阅读 2017-01-09 14:55:04
    由于硬件的原因,机器或多或少的根标准时间对不上,一月的...一,用ntpdate从时间服务器更新时间如果你的linux系统根本没有ntpdate这命令yuminstallntp安装完了之后,你不要做什么配置,也不需要,直接测试一下...
  • 1.首先明白 你的是一个什么类型的项目(web,android,游戏,还是应用网页....) 2.分析需要的数据类型(视频,文字,图片量的大小) 3.了解自己开始面向的用户群体大小,每小时多少人 4.快带计算与购买,可用...
  • 使用node.js编写,是一极简的服务器,只是了一下简单的封装,仅供学习使用。 client_console:客户端测试程序,可以模拟登陆,进房间。 服务器server配置 用的是mysql,所以得先运行在mysql中创建一名为...
  • (2)就是去掉开启隐藏文件段次数和选择性共享文件段的功能,这就非常需要供源者的自觉性 (3)这功能只适合新发布的资源,对旧资源进行保源时,建议关掉这功能! 6>设置文件默认不启用"公平游戏",如需要者请自行...
  • 由于硬件的原因,机器或多或少的根标准时间对不上...  安装完了之后,你不要做什么配置,也不需要,直接测试一下  [root@localhost ~]# ntpdate time.nist.gov  22 Oct 21:11:43 ntpdate[5014]: adjust time serve
  • 常用的排序小算法

    2015-02-13 19:21:53
    快过年了,赶紧更博吧! 最近一直在搞unity,没什么...写游戏时经常会商店或者仓库,而且像商店这种界面,里面的商品是需要根据服务器消息或者配置信息动态添加的,不能事先摆好。我时常用的就是循环求除求余
  • 由于硬件的原因,机器或多或少的根标准时间对不上,一月的误差几秒到几分钟不等。对于服务器来说时间不准,会有很多麻烦。例如,支付的时候,无法下单,游戏无法...安装完了之后,你不要做什么配置,也不需要,...
  • CRON启动ntp服务

    2016-09-20 09:11:00
    由于硬件的原因,机器或多或少的根标准时间对不上,一月的误差几秒到几分钟不等。对于服务器来说时间不准,会有很多麻烦。例如,支付的时候,无法下单,游戏无法登录...安装完了之后,你不要做什么配置,也不需要...
  • 由于硬件的原因,机器或多或少的跟标准时间对不上,一月的误差几秒到几分钟不等。对于服务器来说时间不准,会有很多麻烦。...安装完了之后,你不要做什么配置,也不需要,直接测试一下 [root@snsgou-...
  • 安装完了之后,你不要做什么配置,也不需要,直接测试一下 [root@snsgou-pc src]# date 2015年 05月 20日 星期三 22:42:19 CST [root@snsgou-pc src]# ntpdate time.nist.gov 20 May 22:42:38 ntp
  • 在开发游戏服务器的过程中,我认为脚本管理器至少需要如下几好的特性。 首先,易于脚本的加载。 对于网络游戏来说,最常见的问题就是分区。任何一款网络游戏为了自己的生存都在拼命地开新区,从1区到999区。...
  • 热更是游戏服务器不可缺少的功能,ET框架使用的组件设计,可以成守望先锋的设计,组件只有成员,无方法,将所有方法成扩展方法放到热更dll中,运行时重新加载dll即可热更所有逻辑。 7.客户端使用C#热更新,热...
  • 从开始构思到完成这系统,前前后后花了一年多,了很多版本,都不尽人意。主要是我太懒了,既想达到堂课教学的目的,又想省事,于是便有了这小玩意儿。 系统主要针对本人目前上课的环璋制作的,代码方面也是...
  • Linux从入门到精通

    2010-04-25 19:58:09
    需要做什么? E.6.8 我有一Adaptec 2920. 在安装时, 我没有看到可以选择它, 为什么? 我该怎么办. 或者我有一Future Domain TMC-3260,但是我为它指定选项用来检测时, 它在安装时不能被发现. E.6.9 我有一带...
  • 《Linux从入门到精通》

    热门讨论 2008-09-04 17:05:49
    需要做什么? E.6.8 我有一Adaptec 2920. 在安装时, 我没有看到可以选择它, 为什么? 我该怎么办. 或者我有一Future Domain TMC-3260,但是我为它指定选项用来检测时, 它在安装时不能被发现. E.6.9 我有一带...
  • Java吃豆子游戏源代码 6目标文件 内容索引:JAVA源码,游戏娱乐,JAVA游戏源码 JAVA编写的吃豆子游戏,类似疯狂坦克一样,至少界面有点像。大家可以看截图。 Java从网络取得文件 1目标文件 简单 Java从压缩包中...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2目标文件 一简单的CS模式的聊天软件,用socket实现,比较简单。 ...
  • 需要注意的是,程序可以自动获取菜单,但是菜单的层级关系还是需要在后台手动配置的。 配置管理 首先需要将config/light.php配置文件中的light_config设置为true: 然后只需在配置管理页面新增配置项或编辑已存在...
  • java开源包1

    千次下载 热门讨论 2013-06-28 09:14:34
    JCaptcha4Struts2 是一 Struts2的插件,用来增加验证码的支持,使用时只需要用一 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
  • java开源包12

    热门讨论 2013-06-28 10:14:45
    JCaptcha4Struts2 是一 Struts2的插件,用来增加验证码的支持,使用时只需要用一 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...

空空如也

空空如也

1 2 3 4
收藏数 63
精华内容 25
关键字:

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