5G远控创新与探索,超低时延的远控传输

新知系列课程第二季来啦!我们将为大家带来全真互联时代下新的行业趋势、新的技术方向以及新的应用场景分享。本期我们邀请了腾讯云音视频专家工程师——白松灵,为大家分享5G远控技术创新探索以及腾讯云在超低延时传输上的技术实践。

5G是当前的新趋势。传统4G满足不了的很多需要更大带宽、更低延时的需求,比如云游戏、VR/AR、4K/8K、全景直播等需要超大带宽的应用,在4G下无法实现,通过5G则可以满足;而远程手术、远程会议、远程会诊、自动驾驶等超低延时的应用场景,在5G加持下也有了实现可能。

从下面的图表中也能看出,5G在全球市场呈现出不断增长爆发的趋势,每年5G应用实现都在快速扩张。随着5G技术的日臻成熟,以及未来5G基础建设的不断完善,更多更复杂、更便民的5G技术应用会进入到人们的视野中。

中国也提出了5G扬帆计划。行动计划到2023年将中国的5G发展水平明显提高,推动5G应用融通创新,并且在各个重点行业打造一大批5G应用标杆。

在当前众多的5G发展方向中,远程控制是5G技术应用的一个重点方向,其在自动驾驶、工业控制等方面都有广阔的应用前景。在自动驾驶上,21年SAE提出的新版自动驾驶标准中已经引入了远程协助及远程驾驶的概念。将本地的驾驶员移走,通过远程助手或远程驾驶员的介入,实现无人驾驶。在工业控制上,国务院在20年印发的《全国安全生产专项整治三年行动计划》指出要大力提高工业领域的机械化、信息化、自动化、智能化水平,在煤矿、炼铁、冶金等高危作业场景加快无人化建设。

在矿山、冶金、港口以及开放道路等场景中,通过5G远控技术可以将实际操作的安全员从车上解放出来,实现真正的无人,甚至可以实现一名驾驶员控制多台车辆,解放更多人力成本。也可以让操作人员实现远程操作生产设备,让一线作业人员远离高危环境,在安全的环境中进行作业。

目前传统的远程操控解决方案,虽然能够勉强实现远程控制,但延时较高,并不能完全满足生产中的实质性要求。端到端延时(从画面采集到显示)在本地5G专网的情况下依然达到300-800ms,导致实际体验很差。这其中,5G网络的RTT不到20ms,过程中的传输、采集、编码延迟仍有很大的优化空间。理想情况下,在港口吊机、挖掘机等设备静止的场景,端到端的延时应该控制在150ms内才能实现流畅操作。而在露天矿车、港口集卡等设备移动的场景,端到端的延时则要控制在100ms以内。这样的低延时要求,依靠传统方案是无法实现的。这是一个技术难点,也是腾讯云的突破口。

为了做到低延时,腾讯云将20多年来深度积累的音视频技术与5G技术融合并深度优化,推出了一款更低延时,更可靠,更安全的远程操控产品——腾讯云无界。这套方案可以实现本地5G专网内端到端延时100ms以内,省内延时150ms以内,全国延时200ms以内,相较于传统方案延时大大降低,能够满足露天矿区、港口、物流、网联无人机等场景中实际生产的低延时需求。

腾讯云无界远程控制基于多个技术融合而生。首先是5G网络传输。5G专网为腾讯云无界提供了超大的上行带宽。该网络能够实现本地20毫秒以下的RTT延时以及200兆以上的上行带宽,而且腾讯可以负责帮客户搭建整个5G专网。第二个是实时音视频通信。腾讯内部自研的TRTC为腾讯云无界提供了低延时、高清码率、可灵活切换的实时音视频通信能力,适配多种分辨率和网络通信形式且画面延时可以做到100ms以内。最后是控制同步。腾讯云无界能够实现更低延时的控制同步,并可实时检测控制流异常。这套控制同步的延时在20ms以内,异常检测延迟则在50ms以内。

通过多技术融合,腾讯云无界相比传统方案具有低延时、抗弱网、安全可控、全网络支持的优势。

低延时:腾讯云无界在本地5G专网情况下能够实现端到端延时100ms左右,省内延时150ms以内,全国延时200ms以内;

抗弱网:腾讯云无界拥有很强的抗弱网能力,在30%以上丢包、高延时抖动场景仍能保障流畅传输,适应网络延时抖动、丢包;

安全可控:腾讯云无界的所有数据传输都是加密的,支持设备接入认证和视频操控权限管理,并且整套系统可以完全部署在客户本地,确保数据安全;

全网络支持:腾讯云无界支持5G专网、公网、局域网等多网络接入,自动选择最优路径,并可提供云端加速支持。支持P2P模式,能够实现内网穿透,不做数据转发,直接进行内网传输。

本系统可以支持Linux、ARM芯片或X86芯片,支持H264/H265编码等多种协议,并且实现了控制信令的同步传输。操控端支持Windows、安卓、Linux以及Web等多种平台,且能够实现一个操控端控制多部车辆。

未来我们将持续拓展更多的5G远程实时控制场景,让远控技术可以造福更多的行业。同时,我们也会持续致力于不断提升远控相关的性能与指标并探索更多的方式来增强远控的操控体验。


如果您对腾讯云无界产品感兴趣,欢迎您点击文末「阅读原文」前往腾讯云官网了解更多详细产品信息。您也可以扫码添加「音视频小姐姐」微信,直接与我们的产研团队沟通交流,咨询更多内容。

腾讯云音视频在音视频领域已有超过21年的技术积累,持续支持国内90%的音视频客户实现云上创新,独家具备 RT-ONE™ 全球网络,在此基础上,构建了业界最完整的 PaaS 产品家族,并通过腾讯云视立方 RT-Cube™ 提供All in One 的终端SDK,助力客户一键获取众多腾讯云音视频能力。腾讯云音视频为全真互联时代,提供坚实的数字化助力。

本文转载于网络 如有侵权请联系删除

相关文章

  • PPIO边缘云聚焦音视频底层技术,探索元宇宙“登月工程”

     //  编者按:2021年Metaverse非常火,火到连扎克伯格都不要“face”,直接把脸书改名为Meta。2022年初,元宇宙首次上升为国家级战略,被写入地方“十四五”产业规划,成为社会热议的焦点话题。每一项技术的迭代和革新,都意味着一个新的契机、新的挑战,同时也是一个新的开始。元宇宙是未来,一种很大程度上会实现的未来,什么时候才是我们占据主动权的最佳时机?答案就是:现在!想要在短时间内实现元宇宙,如同“登月工程”,需要我们从底层技术出发,找到内容生态系统的突破口。本次分享将从VR/AR的核心指标及实现,云与边缘架构、编解码、网络传输路径等多个维度,全面分析元宇宙的音视频技术脉络,探讨元宇宙时代产业结构变化,介绍PPIO边缘云未来如何为元宇宙提供强大的基础设施服务。文/王闻宇整理/LiveVideoStack今天分享一个比较实在却又比较科幻的话题,对整个元宇宙过程做一次简单的推演,但这个推演不是商业方向的,而是对技术做一个推演。1、元宇宙的音视频技术脉络与底层技术大家都知道近几年中国在登月上取得了巨大的进展,特别是在2020年,中国登月时对月球进行了采集工作,一共带回了1.7k

  • Flash Scope

    项目中遇到了一个潜在的问题,大致就是说,在一个流程的两个或某几个环节中,需要短暂地存储一部分对象(如果不存储,就需要在这几个环节中多次调用同一个外部接口,这被认为是不够合理的实现)。而这部分对象的存储:(1)如果用request,太小,毕竟一次提交以后就丢失了,如果需要往后传递,可能需要借助一些页面参数传值等丑陋或是不易控制的方法;(2)如果用session,太大,我不需要在整个用户会话生命周期内使用,而且如果同个用户并行地操作两个流程,期间会互相影响到。其实在Rails/Grails里面就已经包含了一个机制,它将对象短暂地放置在session中,request-response连续的两个环节后再清除掉这个短暂保存的对象,就叫是FlashScope。它的原理很简单,内部定义了两个Map,将保存在里面的数据,在两个Map里面来回转移,这样就保证在下一次请求到来时,只需要将其中一个Map的数据转移到另外一个Map中,而清除掉一个Map。这样就保证一次在重定向时,该作用域下依然保存数据。而在第二次的请求时,如果没有新的数据加进来,原来的数据将会被清空。这里有一个简单的例子:http://yo

  • day044:JS异步编程有哪些方案?为什么会出现这些方案?

    关于JS单线程、EventLoop以及异步I/O这些底层的特性,我们之前做过了详细的拆解,不在赘述。在探究了底层机制之后,我们还需要对代码的组织方式有所理解,这是离我们最日常开发最接近的部分,异步代码的组织方式直接决定了开发和维护的效率,其重要性也不可小觑。尽管底层机制没变,但异步代码的组织方式却随着ES标准的发展,一步步发生了巨大的变革。接着让我们来一探究竟吧!回调函数时代相信很多nodejs的初学者都或多或少踩过这样的坑,node中很多原生的api就是诸如这样的:fs.readFile('xxx',(err,data)=>{ });复制典型的高阶函数,将回调函数作为函数参数传给了readFile。但久而久之,就会发现,这种传入回调的方式也存在大坑,比如下面这样:fs.readFile('1.json',(err,data)=>{fs.readFile('2.json',(err,data)=>{fs.readFile('3.json',(err,data)=>{fs.readFi

  • AndroidStudio 配置 AspectJ 环境实现AOP的方法

    昨天看了一段android配置aspectj实现AOP的直播视频,就试着自己配置了一下,可能是因为我自己的AndroidStudio环境的问题,碰到了不少的坑(其实还是因为对gradle理解的不多),但总归是配置好了,就分享一下。试了两种方式,不过项目下的build.gradle,没什么变化,直接看一下代码吧:build.gradle(项目下)buildscript{ ext{ //androidappcompat支持库版本 androidSupportVersion='26.1.0' //编译的SDK版本,如API20 compileSdkVersion=26 //构建工具的版本,其中包括了打包工具aapt、dx等,如API20对应的build-tool的版本就是20.0.0 buildToolsVersion="26.0.2" //兼容的最低SDK版本 minSdkVersion=15 //向前兼容,保存新旧两种逻辑,并通过if-else方法来判断执行哪种逻辑 targetSdkVersion=26 //kotlin版本号 kotlin_ve

  • 一起来学matlab-matlab学习笔记8 基本绘图命令_4 LineSpec线条设定

    修改线条外观LineWidth--指定线条的宽度(以磅为单位)。MarkerEdgeColor--指定标记颜色或填充标记(圆形、方形、菱形、五角形、六角形和四个三角形)的边颜色。MarkerFaceColor-指定填充标记的面的颜色。MarkerSize-指定标记的大小(以磅为单位,必须大于0)figure t=0:pi/20:2*pi; plot(t,sin(t),'-.r*')%实线,点,红色,数据点使用星号*标记 holdon plot(t,sin(t-pi/2),'--mo')%虚线,品红色,圆圈 plot(t,sin(t-pi),':bs')%点线,蓝色,s表示square方形 holdoff 复制设置线条属性t=0:pi/20:2*pi; figure plot(t,sin(2*t),'-mo',...%...表示续行符号,-表示实线,m表示品红色,o表示圆圈 'LineWidth',2,...%线宽 'MarkerEdgeColor','k&#

  • 腾讯Matrix分析--ELFHook原理

    背景在Matrix发布后,可以检查文件是否存在泄漏的问题,处于好奇,了解一下原理原理通过Hook系统在本进程中的open和close、read、write这些系统函数,来了解打开的文件以及其是否被释放。由于只是Hook本App的系统调用,所以不需要Root权限也可以完成。方案由于要Hook的函数在libopenjdkjvm.so、libjavacore.so、libopenjdk.so三个so中,所以需要分别注入这些So文件使用自定义的函数替换系统So中的函数地址寻找So的基址获取本进程对应的So的基址,通过\proc\self\maps获取So对应的位置调用fopen传入文件路径以及rb来打开maps文件,b模式代表读取二进制(binary)调用fgets函数,读取\proc\self\maps的每一行调用strchr函数,找到-出现的第一个位置通过地址的计算,得到该内存页面的访问权限rwx判断是否为rx,如果不是的话,则越过该页面继续查找通过strstr函数,比较该So的路径是否在maps的这一行中如果存在于该行,则通过strtoul将该行的首地址根据16进制转换成虚拟地址获取到S

  • python与pycharm区别_jython和python

    大家好,又见面了,我是你们的朋友全栈君。 ipython和pycharm和python区别pycharm是一种pythonIDE(IntegratedDevelopment Environment,集成开发环是用于提供程序开发环境的应用程序,集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套,所有具备这一特性的软件或者软件套都可以叫集成开发环境。 如微软的VisualStudio系列,Borland的C++ Builder、Delphi系列等。该程序可以独立运行,也可以和其它程序并用。IDE多被用于开发HTML应用软件。), 包含使用python语言开发时提高其效率的工具;ipython是一个python的交互式shell,内置了很多有用的功能和函数。1、首先它们的下载地址和安装的方式不同; 2、python是一种基本编译环境,就像java和jar一样。pycharm是一种集成开发环境,为了能够让你快速编写代码,便于调试。 3、简单来说:Python是个解释器,pycharm是为Python编程语言专门打造的一款IDE(集成开发环境)。在pycharm中编写Pyt

  • 因为数字孪生,时序数据库及其metric处理的技术仍然大有可为

    今天突然读到了这则新闻:https://www.toutiao.com/article/7124235991111762469/7月25日,腾讯内部发文调整腾讯云与智慧产业事业群(CSIG)组织架构和部分管理干部,宣布成立地图产品部和数字孪生产品部。数字孪生产品部主要负责搭建面向B端的生产空间、道路、园区和建筑等领域的数字孪生底座和应用产品。 https://www.toutiao.com/article/7124235991111762469/之前一直想写一些类似的想法,这正好是个蹭热点的好机会。 “数字孪生”,我每天都在做 我每天都在坚持做的事情就是——带上我的applewatch。我心里的想法是:如果让applewatch经年累月的收集我的心跳、运动、睡眠等等数据,将来是不是可以在云端建立一个以我的健康状况为核心的数字人?这个数字人能够在合适的时候向我提供健康管理的建议,或者在突发疾病的时候提供有参考依据的诱因数据。 可以说,我希望以某种方式打造属于我个人的健康领域的“数字孪生”。以此类推,生活中的方方面面,都需要打造数字孪生来满足深层次的需求。 2.工业4.0时代,数字孪生是更

  • 腾讯云数据开发治理平台WeData提取数据集成节点字段Schemaapi接口

    1.接口描述接口请求域名:wedata.tencentcloudapi.com。 提取数据集成节点字段Schema 默认接口请求频率限制:20次/秒。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:GetIntegrationNodeColumnSchema。 Version 是 String 公共参数,本接口取值:2021-08-20。 Region 是 String 公共参数,详见产品支持的地域列表。 ColumnContent 否 String 字段示例(json格式) DatasourceType 否 String 数据源类型 3.输出参数 参数名称 类型 描述 Schemas ArrayofIntegrationNodeSchema 字

  • 如何学好设计模式?你值得拥有

    前段时间和一个好哥们聚餐,他提到了我好久前准备的设计模式札记,问:写得怎么样了?答曰:大概有一半多点。因为项目跟进,已经很长时间基本没有更新。哥们笑着说:那你要继续哈哈。谈起设计模式,其实有好多可以讲的。比如:之前面试过程中,对较多候选人问过一些设计模式的问题。有很多同学貌似学习设计模式有一个误区:就是努力地去记住模式长啥样?但是却忽视了模式其所解决的问题是什么。本文主要是对如何学好设计模式做一个简单的阐述,也算是一个设计模式爱好者对自己学习设计模式的学习回顾、心得分享吧。主要包括如下几个部分:学习设计模式的“门槛“--简述学习设计模式之前我们最好具备哪些知识学习设计模式的不同阶段--简述个人在熟悉、进阶、实践、沉淀四个阶段所做的一些事情学习设计模式的小结--简述我们学习设计模式的“误区”等学习设计模式的“门槛”个人而言,学习设计模式之前最好已经有一定的知识储备,主要体现在如下三个方面:具备一定的面向对象的知识懂点统一建模语言(UML)的知识最好有一定的项目经验具备一定的面向对象的知识这个怎么讲呢,以Java语言为例,如果对其特征(封装、继承、抽象和多态)还不清楚,那么,我还是建议先把

  • Java调试与定位

    目录: Java程序测试:JVM调试体系,Intellij调试,Junit自动化 Java程序监控:常用监控工具,性能问题 Java典型问题:锁问题,线程池问题,JVM内存基础介绍,JVM内存问题分析与定位,TLS问题,Crash问题   JVM调试体系 简介 JPDA 全称JavaPlatformDebuggerArchitecture.是Java定义的标准调试框架。    大部分调试工具都是基于JPDA提供的上层接口,扩展定制而来的。 JVMTI基本原理 JVMTI是JVM提供的native编程接口,可以用来获取JVM内部状态,以及控制Java程序的执行。    JVMTI的典型能力: 各类事件的钩子(比如类加载) Java对象操控 Java线程和锁操控 基本调试原语(比如断点) 一般采用建立一个Agent方式来调用JVMTI,而控制方往往是另一个独立的进程。 Agent加载的方式: 在JVM启动时,通过命令行选项指定Agent加载。 JVM运行时加载。(attach机制) Java动态追踪技术 JVM内置

  • bash arithmatic

    Arithmeticinbashisdonewith$anddoubleparentheses: echo"$(($num1+$num2))" Or$andsquarebrackets: echo"$[$num1+$num2]" Youcanassignfromthat(sansecho).Thereisalsoexpr: echo`expr"$num1"+"$num2"` 复制   http://unix.stackexchange.com/a/93030

  • Ext.Net 使用总结之查询条件中的起始日期

    2、关于查询条件中起始日期的布局方式 首先上一张图,来展示一下我的查询条件的布局,如下: 大多数时候,我们的查询条件都是一个条件占一个格子,但也有不同的时候,如:查询条件是起始日期,则需要将这两个条件放在同一个格子中,那么怎样布局才能让它们均匀的填充在同一个格子中呢? 实现方式如下: <ext:CompositeFieldID="CompositeField2"runat="server"FieldLabel="时间">   <Items>     <ext:DateFieldID="date_start"Vtype="daterange"runat="server"Flex="1">       <Listeners>         <RenderHandler="this.endDateField='#{date_e

  • 基于python脚本,实现Unity全平台的自动打包

    转载请标明出处:http://www.cnblogs.com/zblade/ 0.概述 本文主要针对项目中自动打包过程进行调研,实现用python脚本来打出win/android/ios三个平台下的游戏运行包。 1.工具安装 首先基本的工具需要安装,Unity,python,如果需要修改python脚本,则需要安装一下pycharm,对应的链接: DownloadPython 用最新版本即可 pycharm安装 选中最新的即可 pyCharm最新2018激活码(转)-老董-博客园 选用其中的破解补丁激活的方式,可以破解使用到2099年 2.基本流程 1)编写BuildProject相关的c#代码 在unity工程的Editor目录下,编写打包所需要的BuildProject.cs代码,基本操作可以简单归纳为:读取打包脚本的参数,根据参数更新相关设置,根据参数切换到对应的打包平台,执行打包操作。部分参考代码如下: staticvoidBuildTest() { PreBuild(); BuildPlayer(); PostBuild(); } //构造之前 staticvoid

  • 明解C语言 中级篇 第二章答案

    练习2-1 /*倒计时后显示程序运行时间*/ #include<time.h> #include<stdio.h> /*---等待x毫秒---*/ intsleep(unsignedlongx) { clock_tc1=clock(),c2; do{ if((c2=clock())==(clock_t)-1)/*错误*/ return0; }while(1000.0*(c2-c1)/CLOCKS_PER_SEC<x); return1; } intmain(void) { inti; clock_tc; for(i=10;i>0;i--){/*倒数*/ printf("\r%2d",i); fflush(stdout); sleep(1000);/*暂停1秒*/ } printf("\r\aFIRE!!\n"); c=clock(); printf("程序开始运行后经过了%.1f秒。经过的时钟数是:%d\n", (double)c/CLOCKS_PER_SEC,c); return0; }复制 练习2-2 /*倒计时后显示程序运行时

  • 5-05. QQ帐户的申请与登陆STL

    STLmap的使用(红黑树) //QQ帐户的申请与登陆.cpp:定义控制台应用程序的入口点。 // #include"stdafx.h" #include<stdio.h> #include<map> #include<string> usingnamespacestd; map<int,string>cmap; int_tmain(intargc,_TCHAR*argv[]) { intn; scanf("%d",&n); while(n--){ charcmdLine[3]; intid; charpwd[20]; scanf("%s%d%s",cmdLine,&id,pwd); stringsstr=pwd; if(cmdLine[0]=='N'){ if(cmap.find(id)==cmap.end()){ cmap[id]=sstr; printf("New:OK\n"); } else{ printf("ERROR:Exist\n"

  • python调用cmd运行GDAL报错解决:ERROR 1: PROJ

    欢迎关注各平台通用账号:一个有趣的灵魂W   这个问题爆的有点莫名其妙,代码~环境基本没什么大的变化,好端端就报错了,原先的代码运行了很久才发现,没有结果?摸排了好久都没发现问题。直到pycharm和spyder更新后,总算是发现了报错信息:   之前安装好python+GDAL+‘pythongdal’后,利用python调用cmd运行gdal的裁剪~转换~等功能都很正常。直到最近,不正常了,先上报错: ERROR1:PROJ:proj_create_from_database:Cannotfindproj.db ERROR1:FailedtoprocessSRSdefinition:EPSG:4326复制     就在python中出问题,不论是使用os还是subprocess.call,都无法正常运行。 一开始我重装了gdal2.4,突然可以运行重投影。但是第二天又报错了,又重装,无果,尝试更换3.7.8python和3.8的python,无果(插一句,发现3.8更新里多进程可以实现内存共享了,下次看看多3.8进程的威力吧)。后来我

  • jquery的学习

    在对javascript脚本语言有了深层次的学习后,决定来学习在他基础上产生的jquery 一、认识  jquery是一个轻量级的js库,可以帮助你写的更少实现的更多,因此在学习了jquery后将可以替换原生js的写法(主要是查找元素并且为其添加事件这些,还有ajax也有不同的写法) 二、使用  jquery可以通过打包进入你的页面中使用也可以下载到你的计算机上使用,前者需要有网络 三、语法   理解这个名字就行了,通过这个库进行query页面元素并对其进行一些操作   基础语法:$('selector').action()美元符号是对jquery的定义     action是你要添加的一些事件如{click,hide,ready,css,dbclick,mouseover,focus,mouseenter,change,one,bind(相当于addenventlistener),blur(失去焦点), slideToggle(隐藏或显示),delegate(为选中元素的子元素添加事件

  • 蓝桥杯 9.3乘积尾零(含误区分析)

    文章目录 题目:思路:正确代码错误代码:答案错误分析: 题目: 标题:乘积尾零 如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零? 56504542355447394641143871907390432927587949611356595245743230514434670435949937117368663397475975573070228714539899148657223135117040145510512072928809019204969845824346442764697427340123076835693701568877381417243412909202773555649670166451671597827049926295312538786785206642474800157866524616111362053264291539665291290412852193142822658730943670746895510824361143374096819973133685211 注意:需要提交的是一个整数,表示末尾零的个数。不要

  • python 模式之工厂模式

    工厂模式是一个在软件开发中用来创建对象的设计模式。 工厂模式包涵一个超类。这个超类提供一个抽象化的接口来创建一个特定类型的对象,而不是决定哪个对象可以被创建。 为了实现此方法,需要创建一个工厂类创建并返回。  当程序运行输入一个“类型”的时候,需要创建于此相应的对象。这就用到了工厂模式。在如此情形中,实现代码基于工厂模式,可以达到可扩展,可维护的代码。当增加一个新的类型,不在需要修改已存在的类,只增加能够产生新类型的子类。   简短的说,当以下情形可以使用工厂模式: 1.不知道用户想要创建什么样的对象 2.当你想要创建一个可扩展的关联在创建类与支持创建对象的类之间。   一个例子更能很好的理解以上的内容: 我们有一个基类Person,包涵获取名字,性别的方法。有两个子类male和female,可以打招呼。还有一个工厂类。  工厂类有一个方法名getPerson有两个输入参数,名字和性别。  用户使用工厂类,通过调用getPerson方法。   在程序运行期间,用户传递性别给工厂,工厂创建一个与性别有关的对象。因此工厂类在运

  • 监控SQL

    http://www.cnblogs.com/downmoon/archive/2009/08/12/1544764.html

相关推荐

推荐阅读