精华内容
下载资源
问答
  • 命运服务端命运服务端命运服务端命运服务端命运服务端命运服务端命运服务端命运服务端
  • SVN服务端、客户端32位/64位。服务端为visual svn,可视化环境,支持windows系统。客户端分32位和64位,根据需要安装。
  • svn 服务端 客户端

    2017-09-05 10:25:24
    svn 服务端 客户端svn 服务端 客户端svn 服务端 客户端svn 服务端 客户端svn 服务端 客户端svn 服务端 客户端svn 服务端 客户端svn 服务端 客户端svn 服务端 客户端svn 服务端 客户端svn 服务端 客户端svn 服务端 ...
  • GhostServer服务端

    2008-11-18 21:39:01
    GhostServer服务端GhostServer服务端GhostServer服务端GhostServer服务端GhostServer服务端GhostServer服务端GhostServer服务端GhostServer服务端GhostServer服务端
  • VSS.exe服务端 VSS服务端 VSSVSS.exe服务端 VSS服务端 VSSVSS.exe服务端 VSS服务端 VSSVSS.exe服务端 VSS服务端 VSSVSS.exe服务端 VSS服务端 VSSVSS.exe服务端 VSS服务端 VSS
  • Minecraft forge服务端安装

    万次阅读 2019-03-01 17:38:45
    1.安装java 略 2.下载forge 在forge官网下载对应MC版本的forge ...将下载好的forge和服务端放在同一个目录下,修改服务端的文件名为 minecraft_server.xxx.jar xxx为版本号 打开CMD,执行 java -jar [fo...

    1.安装java

    2.下载forge

    forge官网下载对应MC版本的forge
    forge官网

    3.下载MC服务端

    打开MC正版启动器,在“启动选项”中选择新建

    在这里插入图片描述
    选择想要下载的版本,点击下载服务端
    在这里插入图片描述

    4.安装forge

    将下载好的forge和服务端放在同一个目录下,修改服务端的文件名为 minecraft_server.xxx.jar
    xxx为版本号
    在这里插入图片描述
    打开CMD,执行 java -jar [forge安装包文件名] --install 开始安装
    在这里插入图片描述
    安装过程中会下载一些依赖库,由于服务器在国外,可能会下载失败,多安装几次就行(或者用某些工具加速)

    如下图所示为安装成功
    在这里插入图片描述
    安装成功后目录下会多出一个jar
    在这里插入图片描述

    5.启动服务端

    执行 java -jar forge-1.12.2-14.23.5.2768-universal.jar -Xmx4096M -Xms4096M -serve 启动服务端Xmx和Xms中的数字是最大最小内存。
    第一次启动的时候会启动失败,如下图。
    在这里插入图片描述
    这时候会发现目录下生成了一个eula.txt,把其中的false改成true,然后再启动服务端。
    在这里插入图片描述
    如下图所示就算启动成功了。
    在这里插入图片描述
    启动成功后,可以用客户端连接了,端口默认为25565,可以通过修改server.properties文件修改端口。启动服务端后会生成几个目录,mods为存放mod的目录,world为世界存档,删除world后重新启动服务端会重新生成世界。

    展开全文
  • web服务端和游戏服务端的区别

    千次阅读 2018-02-26 13:59:55
    最近几天在技术交流群里讨论到游戏服务端的一些技术细节,小说君发现有些做服务端的同学因为没有接触过游戏服务端,所以对游戏服务端产生了一些误解。因此今天的文章就从web服务端和游戏服务端的区别说起,简单介绍...
      最近几天在技术交流群里讨论到游戏服务端的一些技术细节,小说君发现有些做服务端的同学因为没有接触过游戏服务端,所以对游戏服务端产生了一些误解。因此今天的文章就从web服务端和游戏服务端的区别说起,简单介绍下游戏服务端。

      首先下个定义,我们讨论的「服务端」是什么?引用一下wiki对Server的定义:

      In computing, a server is a computer program or a device that provides functionality for other programs or devices, called "clients". This architecture is called the client–server model, and a single overall computation is distributed across multiple processes or devices.

      说得比较笼统,client-server模型,分布式提供服务等等,这点对于服务端程序员来说就是日常工作。

      然后是wiki对Server的分类:

      Typical servers are database servers, file servers, mail servers, print servers, web servers, game servers, and application servers.

      其他几种Server我们都比较清楚了,跟unix差不多同时诞生。另外三种,则是程序员日常开发所接触的Server类型,为了确定下文章接下来的讨论范围,我们不妨先给三种Server划定下范围。

      Web Server,典型例子是淘宝。

      特点:所有流程均由客户端发起,客户端发个请求,服务端返回个响应。而且,根据客户端访问的服务不同,客户端可以向不同的具体服务端节点发起请求。

      Game Server,典型例子是魔兽世界。

      特点:有一个肉眼能感觉到的连接握手的过程,建立连接后,流程有可能是服务端发起(比如给你展示周边玩家),也有可能是客户端发起(比如你移动了一下)。

      同时,如果你手边有抓包工具,可以看到,如果你选中了某个玩家,在该玩家的头像框消失之前,一直是同一个场景服务器在跟你通信。

      Application Server,典型例子是QQ。

      特点:介于Web Server和Game Server之间,看着像一个web服务器,但是又有游戏服务器的特点。

      接下来正文的对比部分,Web Server就特指第一类,Game Server就特指第二类,App Server不再拿来参与对比。

      对比之前,小说君先概述下服务端在client-server模型中的扮演角色。

      服务端,在物理上表现为一或多台主机,在逻辑上向客户端暴露一组host:port二元组,接受客户端连接,为每个客户端连接维持连接会话(Session)。客户端与服务端借助连接会话传递消息,消息按一定的协议序列化与反序列化,客户端与服务端的逻辑模块由消息的内容驱动运转。

      不论是Web Server,还是Game Server,在运作流程上都大体相同。而在流程中的细节上,有共同点,也有不同点。下面就分开说道说道。

      首先是共同点。

      共同点1:都是为客户端提供多种服务。

      比如淘宝既提供搜索服务,又提供商品页查询服务。

      魔兽世界既提供登录服务,又提供让你在场景里战斗、走跑跳的服务。

      共同点2:都需要连接会话的概念。

      会话是建立在连接之上的概念,其实本质上是服务端为某个特定客户端维持的数据结构与状态信息。

      游戏自不必说,玩家登录之后,服务端需要有一个专门的全局服务器维护玩家状态与玩家的部分较热的存档信息,玩家进入到某个场景,场景服务器还需要专门维护一份玩家的场景相关的状态信息。

      而对于Web Server,连接会话同样存在,最直观的理解是淘宝登录之后服务端会为客户端保持一个会话上下文。

      共同点3:服务端的每台物理机服务多个客户端。

      这是服务器的诞生基础,发展到现在,已经没人再讨论是异步IO还是多路复用,现在成熟的解决方案已经不存在孰优孰劣的问题,完全是哪个网络库用的顺手就默认接受这个网络库底层的IO模型。

      共同点4:都具有分布式结构。

      架构的演化总是相似的,Web服务端与游戏服务端在发展过程中相互学习相互演进,目前形成的主流架构基本都了解至少应该将专门管连接的、专门管逻辑、专门管存储的做一定程度的物理隔绝。

      可以像skynet一样,利用luaState做隔绝;可以像Erlang一样,利用actor做隔绝;也可以最简单的,按进程隔绝。只要能保证其中之一挂掉不会产生连锁反应导致其他都挂掉就可以了。

      共同点5:开发语言。

      实际上也是近几年手游开发火起来之后开发语言才趋于统一的。web开发一直是百家争鸣,而游戏开发在以前是C++一家独大。

      但是现在,客户端的逻辑层已经基本见不到C++的影子了,服务端纯用C++的也越来越少了。lua、python、java、C#、Erlang、js甚至ruby的工业级游戏服务端框架都有出现,web服务端和游戏服务端的开发语言已经趋同。

      然后是不同点。

      不同点1:会话的存在形式。

      这一点是web服务端与游戏服务端最本质的区别。

      web服务端的客户端与客户端之间交互非常有限,因此,服务端可以将会话保存在外部存储服务,比如一些缓存中间件、文件系统中间件,然后等再用到的时候再拿出来就可以了。

      而游戏服务端的客户端与客户端之间交互非常频繁,比如,同场景的其他玩家会不停做不规律移动,战斗时一个技能就会对复数个玩家造成影响。

      这时如果将会话状态保存在外部,会造成频繁的状态存取,严重影响服务器吞吐量。因此对于游戏服务端来说,会话通常保存在进程内。

      不同点2:交互频率与数据流向。

      web服务端的频率低,而且数据的流动是由客户端驱动的,流向通常是客户端请求了,服务端才返回。

      而游戏服务端的频率高,数据的流动一部分由客户端驱动,一部分由服务端驱动。流向除了服务端对客户端请求的响应,还有服务端的主动推送。

      不同点3:通信协议基础。

      通信协议基础就是客户端和服务端通信的协议所依赖的协议基础。

      按常识理解的话,web通信的基础在应用层是http协议。由于小说君对web开发并不太熟悉,所以不太清楚目前私有协议在web开发中的应用,但是想必即使是私有协议,也一定是套在http协议的某些字段里面的,这跟游戏的客户端服务端通信有本质区别。

      游戏通常会实现私有的序列化协议,可以简单理解为应用层定义协议包结构平铺成字节流或者是串行序列化字节流。如果要支持一定程度的协议版本兼容,会用二进制json或者protobuf来实现协议序列化,但是通信协议本身是没有「基础」可言的,纯私有化协议,不具普适性,也没有必要定义成一种专门的协议。

      不同点4:对第三方组件的依赖程度。

      web服务端发展速度快,从业者多,同技术栈的从业者交流更深入更频繁。因此,web服务端出现、并且还会出现越来越多的第三方独立组件。web服务端的从业者甚至只需要在自己的技术栈不同层次上选择不同的第三方组件,黏合起来,就能形成一整套的解决方案,非常方便。

      游戏服务端正相反,比较封闭,基本上每个项目组要么是从头到尾重写,要么是从其他项目组拿来整套技术栈直接改改。基本不存在第三方独立组件的情况,在技术开放氛围好些的公司还好,毕竟大家可以复用同一套框架,否则的话,公司内的框架多种多样,各种造轮子出来的,各种空降团队从原来公司带过来的,技术无法复用,团队成员流动更是一大难题。
    展开全文
  • [C#] WebSocket 客户端+服务端 轻松实现

    万次阅读 2017-07-05 14:40:59
     随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信。如下图所示:   一.对Socket Server的要求

    资料转自: http://www.cnblogs.com/zhuweisky/p/3930780.html

    技术原理: https://www.zhihu.com/question/20215561

    Websocket库介绍:https://www.cnblogs.com/nele/p/6097607.html

     

     随着HTML5 WebSocket技术的日益成熟与普及,我们可以借助WebSocket来更加方便地打通BS与CS -- 因为B/S中的WebSocket可以直接连接到C/S的服务端,并进行双向通信。如下图所示:

      

    一.对Socket Server的要求

      我们可以尝试让Socket Server透明地支持WebSocket客户端,所谓透明的意思是,服务端开发人员不用关心客户端究竟是什么类型,而是可以统一的接收数据、处理数据、发送数据。为了做到这一点,我们可以构建一个服务端框架,让框架完成透明化的工作,这就要求这个框架做到以下几点:

    (1)根据客户端TCP连接请求成功后的第一个消息中是否含有“websocket”标记,来判断其是否为WebSocket客户端。如果客户端的类型是WebSocket,则自动完成以下事情。

    (2)自动完成Web Sokects 握手协议。

    (3)针对接收到的每个WebSokect数据帧,都能自动将其解析,并从中分离出真正的消息内容。

    (4)当您发送消息给WebSokect客户端时,服务端引擎会自动将该消息封装成WebSokect数据帧,然后再发送出去。

      我们在StriveEngine中实现了对上述WebSocket的透明化支持,至于具体如何实现的,大家可以参考一下WebSokect的标准协议。下面我们就来做一个Demo,让.NET Socket客户端和WebSocket客户端能同时与一个StriveEngine服务端进行双向通信。

    二.打通B/S与C/S的Demo 准备

      基于WebSokect,我们在绝大多数情况下,使用的都是文本消息,OK,那我们就基于文本消息来构建这个Demo。

    (1)虽然WebSokect可以借助其HTML5协议来自动完成一个消息的独立识别,但是对于我们的普通socket来说,必须有一个方法来识别一个完整的消息。

    (2)常用的方法是使用特殊的消息结束标识符,那在这个demo中,我们就以'\0'作为消息的结束符吧。

    (3)基于(2),那么WebSokect在发送消息给服务端时,也必须在消息结尾加上'\0'。

    三.Demo实现

      我们先看看Demo运行起来的效果:

          

      在Demo中,WebSocket客户端和.NET Socket客户端都可以与同一个服务端进行互通消息。

    1.源码结构说明

      该Demo源码总共包括三个项目和一个HTML文件:

    (1)StriveEngine.SimpleDemoServer:基于StriveEngine开发的服务端。

    (2)StriveEngine.SimpleDemoClient:基于StriveEngine开发的客户端。

    (3)StriveEngine.SimpleDemo:直接基于.NET的Socket开发的客户端。

    (4)WebSocketClient.html:基于HTML5 WebSocket的客户端。与前两种客户端公用同一个StriveEngine服务端。

      接下来,我们着重看一下WebSocket客户端实现,其它的.NET代码,大家直接去看Demo源码就好了。

    2.WebSocket客户端实现

    (1)HTML 页面布局

    复制代码
    <body>
        <h3>WebSocketTest</h3>
        <div id="login">
            <div>
                <input id="serverIP" type="text" placeholder="服务器IP" value="127.0.0.1" autofocus="autofocus" />
                <input id="serverPort" type="text" placeholder="服务器端口" value="9000" />
                <input id="btnConnect" type="button" value="连接" onclick="connect()" />
            </div>
            <div>
                <input id="sendText" type="text" placeholder="发送文本" value="I'm WebSocket Client!" />
                <input id="btnSend" type="button" value="发送" onclick="send()" />
            </div>
            <div>
                <div>
                    来自服务端的消息
                </div>
                <textarea id="txtContent" cols="50" rows="10" readonly="readonly"></textarea>
            </div>
        </div>
    </body>
    复制代码

    (2)js方法实现

    复制代码
    <script>
            var socket;
    
            function connect() {
                var host = "ws://" + $("serverIP").value + ":" + $("serverPort").value + "/"
                socket = new WebSocket(host);
                try {
    
                    socket.onopen = function (msg) {
                        $("btnConnect").disabled = true;
                        alert("连接成功!");
                    };
    
                    socket.onmessage = function (msg) {
                        if (typeof msg.data == "string") {
                            displayContent(msg.data);
                        }
                        else {
                            alert("非文本消息");
                        }
                    };
    
                    socket.onclose = function (msg) { alert("socket closed!") };
                }
                catch (ex) {
                    log(ex);
                }
            }
    
            function send() {
                var msg = $("sendText").value + '\0'
                socket.send(msg);
            }
    
            window.onbeforeunload = function () {
                try {
                    socket.close();
                    socket = null;
                }
                catch (ex) {
                }
            };
    
            function $(id) { return document.getElementById(id); }
    
            Date.prototype.Format = function (fmt) { //author: meizz 
                var o = {
                    "M+": this.getMonth() + 1, //月份 
                    "d+": this.getDate(), //日 
                    "h+": this.getHours(), //小时 
                    "m+": this.getMinutes(), //分 
                    "s+": this.getSeconds(), //秒 
                    "q+": Math.floor((this.getMonth() + 3) / 3), //季度 
                    "S": this.getMilliseconds() //毫秒 
                };
                if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
                for (var k in o)
                    if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
                return fmt;
            }
    
            function displayContent(msg) {
                $("txtContent").value += "\r\n" +new Date().Format("yyyy/MM/dd hh:mm:ss")+ ":  " + msg;
            }
            function onkey(event) { if (event.keyCode == 13) { send(); } }
        </script>
    复制代码

      js代码中的重点都通过红色字体标记出来了,要特别注意,send方法在发送消息时,会自动在消息的末尾添加一个我们约定好的结束符'\0'

    四.源码下载

      打通BS与CS的Demo_Example:

    http://files.cnblogs.com/files/youfenglaiyi/ChatDemo.zip

        如果有任何建议或问题,请留言给我。

     

     附相关系列:文本协议通信demo源码及说明文档

                       二进制协议通信demo源码及说明文档

    另附:简单即时通讯Demo源码及说明

    展开全文
  • ET服务端框架学习——服务端入口

    千次阅读 2019-04-03 15:10:08
    ET框架有一个好处就是很多组件在客户端和服务端几乎都是可以通用的。比如EventSystem组件,和在客户端是一样的使用逻辑,具体可以看这篇文章《ET框架学习——EventSystem类》。 在加载完服务端的Hotfix和Model的...

            ET框架有一个好处就是很多组件在客户端和服务端几乎都是可以通用的。比如EventSystem组件,和在客户端是一样的使用逻辑,具体可以看这篇文章《ET框架学习——EventSystem类》。

            在加载完服务端的HotfixModel的dll后,开始后面就是开始读取服务端的配置,并根据配置加载相应的组件。服务端的配置的读取方法使用的是CommandLine,该类用于读取命令行输入,并且将输入参数解析成Options类,存放在OptionComponent组件里面。这里的参数来自客户端的配置文件,在Config\StartConfig目录下。里面的参数是按照类似json的格式定义的,LocalAllServer.txt定义的内容如下图(我自己写成这样的格式的,方便阅读):

    内容如下图:

    配置的读取是从客户端猫大写的工具里面读取的,具体在ServerCommandLineEditor类里面。启动服务器的时候,传递的参数如下:

    string arguments = $"App.dll --appId={startConfig.AppId} --appType={startConfig.AppType} --config=../Config/StartConfig/{this.fileName}";
    
    ProcessStartInfo info = new ProcessStartInfo("dotnet", arguments) { UseShellExecute = true, WorkingDirectory = @"../Bin/" };

    读取完配置后,将配置保存在StartConfigComponent组件里面,该组件在初始化时会根据配置的情况,分门别类将配置内容存进行缓存。接下来就是添加网络相关的组件OpcodeTypeComponentMessageDispatherComponent组件,具体可看这篇文章《ET框架学习——OpcodeTypeComponent组件和MessageDispatherComponent组件》。

            最后就是根据配置的AppType类型,添加对应的组件,这里我选择的是AllServer类型,所有相关组件都会添加,具体可以参看源码。

    展开全文
  • 游戏服务端

    千次阅读 2018-03-05 10:56:35
    作者:Manistein链接:https://www.zhihu.com/question/62386941/answer/197990865来源:知乎游戏服务端大体可以分为以下几个部分:1、网络层 负责客户端和服务端,以及服务端集群内部之间的网络数据包收发,目前在...
  • springboot 实现服务端推送消息

    万次阅读 2021-04-16 16:19:36
    文章目录前言一、关于SSE1. 概念介绍2. 特点分析3. 应用场景二、SpringBoot实现三、前端vue调用四、一些问题...但是在 sse 的场景下,客户端发起请求,连接一直保持,服务端有数据就可以返回数据给客户端,这个返回可以
  • 一般的请求都是从客户端发起请求到服务端服务端接收到请求后做相应处理然后在返回给客户端相应信息,但是很多时候我们要用服务端作为客户端在发送请求到另一台服务端,这样中的这台服务器不仅是服务端也是客户端。...
  • 下载服务端,根据服务端的版本下载服务端下载服务端途径:官方启动器打开后新建版本,对应版本有对应服务端。https://mcversions.net/这个网站有收录大部分版本的服务端,选好版本后点击,然后点击server.jar3.下载好...
  • GcExcel 服务端高性能表格组件 FOR NET

    万次阅读 2020-11-26 09:38:50
    GrapeCity Documents for Excel (简称:GcExcel)Q578867473是一款基于 .NET 和 .NET Core 平台的服务端高性能表格组件,可与 纯前端表格控件 SpreadJS 前后端兼容,无需依赖 Office、POI 或第三方应用软件,在前端...
  • Vue服务端渲染

    千次阅读 2019-08-09 18:26:20
    一、前言 1、服务端渲染图解 2、简介服务端渲染 ...
  • Socket聊天程序(一个服务端,多个客户端)

    千次下载 热门讨论 2011-07-26 17:47:35
    Socket聊天程序(一个服务端,多个客户端) 可通过设置IP地址,进行局域网聊天,互联网聊天。。详细配置可以看下我blog的文章。 blog中搜索:Socket聊天程序
  • Python 服务端编写

    千次阅读 2019-08-31 19:12:10
    这里写自定义目录标题Python 服务端步骤以及代码效果以及实现的功能了解TCP的内部工作过程首先编写简单UI界面转换成PY文件(就是界面文件)TCP 服务端初始化(即Socket初始化)编写监听函数编写接收函数发送函数 ...
  • 前端服务端渲染

    2019-05-06 15:31:56
    本文主要是从三个方面学习服务端渲染,内容整理自多个博客。 服务端渲染是什么?什么是服务端渲染?(服务端渲染的运行机制) 为什么使用服务端渲染?服务端渲染解决了什么问题? 什么情况下使用服务端渲染?...
  • webService服务端

    2010-11-04 14:40:33
    webService服务端webService服务端webService服务端webService服务端
  • http服务端架构演进

    千次阅读 2019-10-20 20:44:18
    摘要 ...一些常见的名词到底是什么含义呢? 什么叫正向代理,什么叫反向代理 ...在前面文章中我们介绍过最简单的一种客户端-服务端响应模式,如下 这是http服务最简单的一种形式,服务端就一层web服务...
  • Android服务端开发1-使用Eclipse搭建Java Web服务端

    万次阅读 多人点赞 2015-05-10 12:58:54
    本篇博客介绍如何使用Eclipse来创建一个Java Web程序,为后面讲通过Android客户端跟服务端进行交互打下基础,关于服务端可以选用的程序很多,主流的搭配是Android客户端+PHP服务端,我们也可以使用Android客户端+...
  • netty客户端发送字符串到服务端,服务端handle继承SimpleChannelInboundHandler,重写channelRead0方法,debug不进入,控制台打印只打印 事件轮询组的日志以及 channelReadComplete 是什么原因
  • 冒险岛143服务端米米版 米米冒险岛143服务端 冒险岛服务端143 冒险岛143服务端标准版V14 资源下载地址: 链接: https://pan.baidu.com/s/14lWObD_1Rblf9a-pPHfV5Q 提取码: mawd 复制这段内容后打开百度网盘手机...
  • c# 支付宝服务端demo

    热门讨论 2016-02-26 10:30:59
    c# 支付宝服务端demo,可用vs打开解压文件夹下的Projects\Alipay-demo-project下的AlipayDemo.sln文件
  • 传奇服务端结构传奇服务端结构

    千次阅读 2013-05-26 18:43:55
    传奇服务端结构传奇服务端结构:  MirServer(传奇服务端)  ├Client(传奇私服客户端补丁,直接覆盖原客户端)  ├Documents(说明文件)  ├GameLog(游戏物品日志)  │ └LogDataSrv(物品日志服务端)  │ ...
  • 服务端渲染SSR

    千次阅读 2019-01-18 18:56:32
    服务端渲染SSR 什么叫服务端渲染? 通常情况下,用户请求网页,都是后端先调用数据库,获得数据之后,将数据和页面元素进行拼装,组合成完整的 html 页面,再直接返回给浏览器,以便用户浏览。 然而,也可以将...
  • 服务端测试

    2013-11-10 14:47:37
    一、每秒的最大传输速度 二、每秒能处理的最大连接数 三、服务端向客户端发送1亿个包,客户端是否能收到1亿个包,确保不掉包 ...四、客户端向服务端发送1亿个包,服务端是否能收到1亿个包,确保不掉包
  • WEB开发之服务端与前端协同

    千人学习 2018-10-06 13:45:03
    主要带领大家认识和了解做一个网站的流程和基本的要求,如果运用前端与服务端的数据协同。
  • Netty即是服务端又是客户端,服务端和客户端相互对应。 具体功能细节是: 上游有一个服务,会主动发送消息给我中间件平台。中间件平台既有服务端也有客户端。通过下游客户端连接进来的客户端和中间件传下去的通道...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 247,242
精华内容 98,896
关键字:

服务端