如何使用 Go 语言写游戏游戏 服务器 语言

问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
接触go没多久,在网上看了看tcp聊天服务器,大概实现就是:遇到有用户连接就直接开一个goruntine,这样的性能是否算高呢?假设只是一台4核8gb机器。大概能启动多少goruntine?怎么样能充分利用cpu资源,是设置GOMAXPROCS吗?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
golang跟Erlang一样,都是轻量级的线程,只不过golang叫协程(goroutine),而erlang叫做进程,但这些轻量级的线程或进程都是派生在真实的POSIX 线程之下的“伪线程”。 原文说的没错,go相比其他的IO开发模型,特点就是可读性好,创建的goroutine都是轻量级的,特别适用于长连接的用户,做聊天跟erlang一样都是非常适合的。至于设置CPU资源,只需要设置最大的CPU核数即可,1.5以前的GO设置runtime.GOMAXPROCS为CPU数目即可。goroutine跟CPU关系不大,主要看内存,聊天如果不涉及特别复杂的业务的话,应该是属于IO敏感的,而非CPU敏感的。其实,还是看你聊天的模型,是TCP的还是UDP的,是有状态的还是无状态的,状态是保存在server端还是client端的,这些定了才好说用什么模型更合适。
同步到新浪微博
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:使用Go语言一段时间的感受 - 文章 - 伯乐在线
& 使用Go语言一段时间的感受
& 来源: &&&&
最近在忙一个Server+Client的项目,Client是Android手机,大概也就是几十的规模。Server是纯Go语言实现,没有apache或者ngix这种web server,也没有数据库,自己写了个文件管理module,处理这种小规模的服务没问题。算下来接触Go语言也有四个多月了,断断续续写了一些东西,这里记录一下心得吧。
先大概说下为什么用Go语言。我是一个对语言有洁癖的人,曾经是一个c+Python的坚定呐喊者,最常说的一句话就是,只要熟练这两种,什么情况都能应付,根本不用Java和C++(纯指我所在的领域)。核心代码用c,速度快,需要记的语言细节少;外围用Python glue,灵活,简洁,任何模块都容易上手,绝配。Java的繁琐,C++的无数无用的特性,都让我只在不得不用的时候才去用。Objective-C是另一个我欣赏的语言,问题是不跨平台,过于封闭。
可惜的是,在这个节奏极快的时代,不是所有情况下都适合上c。之前有一个项目也是类似的架构和规模,为了节省时间,当初几乎没有服务器平台编程经验的我,在服务器端选择用Django、Apache、MySQL做,成熟,社区活跃,又是python作为主要开发语言,这些都是这个选择的原因。说实话,几个月过去后,回首看,这不是一个愉快的经历。Django是一个好架构,大而全,而大而全有时也就意味着臃肿,五花八门的配置,过紧的模块耦合对引入第三方工具限制颇多,自带的ORM又不好用。之前从来没有搞过服务器配置的我,对Apache的配置和效率所带来的琐碎的东西也头疼。总的来说这个部分花了我很多时间,有新手学习服务器编程的必经过程,也有折腾Django和Apache没必要的时间浪费,很大部分上抵消了Python带来的快速开发的灵活性。而一旦服务器上线,动态语言带来的一些bug又会让人头疼。对于普通高校实验室这种没有完善的服务器调试的条件,基本就是改了就上线用,有些隐蔽bug到某些条件分支才会触发,一旦在运行中途出问题,改起来也麻烦。
从那时起,我就特别想,要是有一种语言能把c和Python的优点结合起来,也就是说
▲速度快,高性能
▲简洁明了,需要记的语言细节少,开发迅速(c)
▲灵活,开发快速,类Python的list,map等常用数据结构支持(Python)
▲完善的模块支持,模块也容易上手(Python)
▲对程序员友好的并行架构(Erlang)
▲安全,绝大部分问题能消灭在compile time中(C minus pointer)
那基本就是系统级和网络级编程最对我胃口的语言了。然后我就找到了。
Go语言是一个新语言,截至目前为止,第一版正式版还没有发布。Go语言的设计者是Robert Griesemer, Rob Pike和Ken Thompson,当年设计C和Unix,后来的Plan9团队中的人 。Go语言的设计理念很明确,就是将动态类型语言的编程容易度和静态类型语言的安全效率结合起来。如果你想更深入了解Go语言的发展历史以及完整的目标,请参考。
当然,Go语言吸引我的地方,不是因为其是Google出品,也不是因为其设计者皆为大牛,而是因为,Go语言真的做到了它所宣称的目标。Go语言就如同C和Python中间的完美结合,如果你是Python爱好者,又追求代码的速度和并行化,那么简单说,Go语言就是为你设计的。Go语言有很浓厚的C的遗风,尽量屏蔽C++和Java的影响,比如没有独立的OO体系(并不是说不能OO),一切以struct为中心,没有exceptions(Oh yes!),仍然有指针,等等。但是,Go语言又吸取了很多新语言的精华,并带有自己独特的设计。比如
1. 保留但大幅度简化指针
Go语言保留着C中值和指针的区别,但是对于指针繁琐用法进行了大量的简化,引入引用的概念。所以在Go语言中,你几乎不用担心会因为直接操作内寸而引起各式各样的错误。
2. 多参数返回
还记得在C里面为了回馈多个参数,不得不开辟几段指针传到目标函数中让其操作么?在Go里面这是完全不必要的。而且多参数的支持让Go无需使用繁琐的exceptions体系,一个函数可以返回期待的返回值加上error,调用函数后立刻处理错误信息,清晰明了。
3. Array,slice,map等内置基本数据结构
如果你习惯了Python中简洁的list和dict操作,在Go语言中,你不会感到孤单。一切都是那么熟悉,而且更加高效。如果你是C++程序员,你会发现你又找到了STL的vector 和 map这对朋友。
4. Interface
Go语言最让人赞叹不易的特性,就是。任何数据结构,只要实现了interface所定义的函数,自动就implement了这个interface,没有像Java那样冗长的class申明,提供了,让你的代码也非常干净。千万不要以为你习惯了Java那种一条一条加implements的方式,感觉还行,等接口的设计越来越复杂的时候,无数Bug正在后面等着你。
同时,正因为如此,Go语言的interface可以用来表示任何generic的东西,比如一个空的interface,可以是string可以是int,可以是任何数据类型,因为这些数据类型都不需要实现任何函数,自然就满足空interface的定义了。加上Go语言的type assertion,可以提供一般动态语言才有的duck typing特性, 而仍然能在compile中捕捉明显的错误。
Go语言本质上不是面向对象语言,它还是过程化的。但是,在Go语言中, 你可以很轻易的做大部分你在别的OO语言中能做的事,用更简单清晰的逻辑。是的,在这里,不需要class,仍然可以继承,仍然可以多态,但是速度却快得多。因为本质上,OO在Go语言中,就是。
6. Goroutine
这个几乎算是Go语言的招牌特性之一了,我也不想多提。如果你完全不了解Goroutine,那么你只需要知道,这玩意是超级轻量级的类似线程的东西,但通过它,你不需要复杂的线程操作锁操作,不需要care调度,就能玩转基本的并行程序。在Go语言里,触发一个routine和erlang spawn一样简单。基本上要掌握Go语言,以Goroutine和channel为核心的是必须要懂的。不过请放心,真的非常简单。
7. 更多现代的特性
和C比较,Go语言完全就是一门现代化语言,原生支持的Unicode, garbage collection, Closures(是的,和functional programming language类似), function是first class object,等等等等。
看到这里,你可能会发现,我用了很多轻易,简单,快速之类的形容词来形容Go语言的特点。我想说的是,一点都不夸张,连Go语言的入门学习到提高,都比别的语言门槛低太多太多。在大部分人都有C的背景的时代,对于Go语言,从入门到能够上手做项目,最多不过半个月。Go语言给人的感觉就是太直接了,什么都直接,读源代码直接,写自己的代码也直接。
有朋友要抗议了,你把Go语言吹的这么好,难道它就没有缺点?有,当然有,不过和它的优点比,我觉得很多缺点都是因为整个语言太新,不成熟,随着时间的推移都能得到解决,相比之下都能忍了。如果你希望进一步了解Go语言的优缺点,可以参考以下yufeng写的这篇文章,系统编程语言明日之星—Go(/Go.pdf。
还有朋友要说,Go语言这么好,为什么没人用?我想说,眼界放开点,这个世界精彩的东西比你想象的多。Go语言被Google用于,被(大部分创业公司)用于后端开发,甚至在天朝,也有完全用Go语言做服务开发的云应用公司了。可以说,随着Go 1即将到来的正式推出,Go语言的使用范围,应该会越来越广。
如果你是Python和动态语言狂热爱好者,Go不一定能给你带来很大的惊喜,这纯粹取决于你得项目性质,考虑到Python目前在很多地方都用C做核心运算,速度在大部分情况下都不是大问题。scalability是一个问题,但并不是人人都会遇到的。
如果你是C爱好者,强烈建议你学习和使用Go。Go可以调用C/C++程序,又提供了太多的便利,速度上稍有牺牲,但并不大。在绝大部分场景下Go能给你带来媲美C的性能,而对于某些确实性能过于关键的场合,也可以通过cgo让Go和C搭配。
如果你是Java爱好者,除非你是做Android这种不得不用Java的平台,否则也建议你尝试学习Go,这个开发上感觉的差异如同比较开载着1吨石头的拖拉机和开保时捷911那么明显,而Java能给你的,Go能给得更好。
如果你是C++爱好者,!@#$%^&*,恭喜你,至少你的智商应该是没问题的。人生苦短,赶紧脱离C++这个苦海吧。你用来学89个C++高级特性的时间,估计已经用Go写了64个开源项目了。
如果你是像我一样的C和Python的爱好者,对动态语言又没有特殊的热爱……我还需要说什么呢?
让我们荡起双桨,去遨游吧。
可能感兴趣的话题
看着你写的这么好,有点动心啊
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线利用Go语言初步搭建一个web应用的教程
  这篇主要介绍了利用Go语言初步搭建一个web应用的教程,由于很多国人盲目迷信谷歌,导致Go语言在国内的人气远超国外...需要的朋友可以参考下
  1.Abstract
  在学习web的过程中会遇到很多困难,因此写了一篇类似综述类的文章。作为路线图从web开发要素的index出发来介绍golang开发的学习流程以及Example代码。
  在描述中多是使用代码来描述使用方法不会做过多的说明。最后可以方便的copy代码来实现自己的需求。
  本文适应对象:
  对web开发有一定经验的人
  能够灵活使用ajax的人(至少懂得前后分离)
  golang web 开发有一定了解,至少略读过一些golang web开发的书籍
  看完本文之后您会收获:
  golang web开发的一些技巧
  golang web开发的一些实用API
  本文在描述的时候为了解释尽量详细,已经把解释写到代码注释中。
  2.golang web 开发check list
  略过的部分:基本流程控制,OOP等基础语法知识。
  3.路由器
  路由器是整个网站对外的灵魂,如果路由做的不好URL会非常恶心。所以这部分设计成第一个要说的内容。
  路由分两种一种是手动路由为了通过tul调度固定的功能,另外一点就是资源的获取,通过url的分析来模仿静态页的方式来获取资源(类似get)
  自动路由,主要使用OOP的COMMAND模式来实现。所有功能使用post,统一入口,方便权限管理,安全管理,跨域管理。但是如此强大的功能还是交给框架来做吧。这里就不给新手做参考了。
  3.1手动路由
   代码如下:
  package main
  import (
  "net/http"
  func main() {
  RouterBinding() // 路由绑定函数
  err := http.ListenAndServe(":9090", nil) //设置监听的端口
  if err != nil {
  log.Fatal("ListenAndServe: ", err)
  在httpserver运行之前先绑定路由
  3.2 手动路由的绑定
  3.2.1 静态文件
  代码如下:
  http.Handle("/pages/", http.StripPrefix("/pages/",
http.FileServer(http.Dir("./pages"))))
  3.2.2 固定函数与资源获取
  他们都是一样的
  代码如下:
  http.HandleFunc("/images/", fileUpload.DownloadPictureAction)
  4.页面加载
  4.1 纯静态页(HTML)
  直接交给路由就行了。自动就访问那个文件夹了。不过生产环境果然还得是cdn,如果自己服务器比较多。可以nginx反向代理。
  主要好处前后分离,能上CDN就是通讯次数多了。不过通过优化改善之类的都还ok啦。
  4.2 模板页面的加载
   代码如下:
  commonPage, err := template.ParseFiles("pages/common/head.gtpl", //加载模板
  "pages/common/navbar.gtpl", "pages/common/tail.gtpl")
  if err != nil {
  panic(err.Error())
  navArgs := map[string]string{"Home": "home", "User":
"yupengfei"}//复杂的参数开始往里塞
  knowledgePage, err :=
template.ParseFiles("pages/knowledge/knowledge.gtpl")
  knowledgeArgs := map[string]interface{}{"Head": "This is a test title",
  "Author": "kun.wang", "PublishDatetime": "",
  "Content": template.HTML("
为什么要用语义呢?
")}//不是不好,只是做字符串分析会影响工程效率
  commonPage.ExecuteTemplate(w, "header", nil)// render 开始
  commonPage.ExecuteTemplate(w, "navbar", navArgs)
  knowledgePage.ExecuteTemplate(w, "knowledge", knowledgeArgs)
  commonPage.ExecuteTemplate(w, "tail", nil)
  仅提供关键代码。
  其他的都还挺好,就是页面渲染用服务器是不是有点太奢侈了。
  字符串数组作为输入参数差错比较困难
  总结:虽然减少的通讯次数,但是没办法上CDN蛋疼,另外,模板的mapping蛋疼。
  5.表示层脚本
  表示层脚本做的比较困难也不是很好学。但是一旦搞定了,代码的复用性会有非常可观的提升。
  就普通情况而言JS开发效率是非常高的灵活度高,并且使用的是客户端的cpu性能好,免费资源多,学习的人也多,好招聘。
  5.1 require.js
  5.1.1 加载
   代码如下:
  整个网页之留这么一个加载脚本的入口(每个页面最好只有一个js文件)
  js是延迟加载。不会出现网页卡死的情况
  最大化使用缓存。(HTTP 304)
  一个网页只用一个js
  dom事件绑定,不用在html控件上写js绑定了
  学习比较难
  网站更新始终有缓存没更新的浏览器。造成错误(所以有些情况客户自己就知道多刷新几次了,已经成用户习惯了)
  参数解释
  `data-main` 业务逻辑入口,载入当前字符串.js这个文件
  `language` 不解释
  `defer async` 字面意思
  `src` r.js就是require.js的意思。代码到处都能搞到。
  5.1.2 页面Business
  加载依赖文件
   代码如下:
  require.baseUrl = "/"
  require.config({
  baseUrl: require.baseUrl,
  paths: {
  "jquery": "js/jquery-1.10.2.min",
  "domready" : "reqmod/domReady",
  "pm" : "reqmod/pmodal",
  "cookie":"reqmod/cookie",
  "user":"reqmod/user",
  "bootstrap": "reqmod/bootstrap.min",
  "nav":"reqmod/nav"
  shim: {
  'bootstrap': {
  deps: ['jquery']
  //直接copy全搞定。
  执行页面business
  执行里面做的最多的就是dom跟事件绑定而已。加载各种js库直接引用。
  代码美观,开发效率,执行效率都是非常棒的。
   代码如下:
  require(['nav','domready', 'jquery', 'user','pm'], function (nav,doc, $,
  //这个函数的第一个`数组`参数是选择的依赖的模块。1. 网站绝对路径。 2. 使用加载依赖模块的时候选择export的内容
  //数组的顺序要跟function顺序一致,如果有两个模块依赖比如说jquery插件,就写道最后不用变量,直接使用`$`
  doc(function () { // domReady
  pm.load();//加载各种插件HTML模板之类的都ok
  $('#btn_login')[0].onclick = function(){user.login();}//button 事件绑定
  页面MODEL
   代码如下:
  define(['jquery','reqmod/cookie','user','bootstrap'],function
($,cookie,user){
  //define 函数的参数内容require是一样的。
  // 这里依赖的模块要在调用此模块中的模块中有path配置。不然会死的很惨,报错的时候不会说缺少什么什么地方错了。
  var nav_load = function () { // 注意函数定义的方式copy就行
  $.get('/nav.html', function(result){
  var newNode = document.createElement("div");
  newNode.innerHTML =
  $('body')[0].insertBefore(newNode,$('body')[0].firstChild);
  //document.body.innerHTML = result + document.body.innerHTML;
  $('#btn_login')[0].onclick = function(){user.login();}
  $('#btn_reg')[0].onclick = function(){window.location='/register.html'}
  $.post('/login_check',{},function(data){
  if(data==0){
  Form_login.style.display=""
  form_userInfo.style.display=""
  return {//这里类似微型路由。非常灵活,非常方便
  load :nav_load
  5.2 JQuery
  JQ的功能只要require.js引用了之后基本上都是一样的。
  如果有需要可以到w3school上学习一下。
  6.业务层
  Post分析
  代码如下:
  func XXXAction(w http.ResponseWriter, r *http.Request) {
  r.parseForm() //有这个才能获取参数
  r.Form["Email"] // 获取Email 参数(String)
  // 写接下来的业务。
  资源入口函数资源require分析(url分析固定写法)
   代码如下:
  func Foo(w http.ResponseWriter, r *http.Request) {
  queryFile := strings.Split(r.URL.Path, "/")
  queryResource := queryFile[len(queryFile)-1] // 解析文件
  //完成字符串分割之后,按照需求来获取资源就可以了。
  直接输入object
  代码如下:
  data, err := ioutil.ReadAll(r.Body) //直接读取form为 json 字符串
  if err != nil {
  utility.SimpleFeedBack(w, 10, "failed to read body")
  pillarsLog.PillarsLogger.Print("failed to read body")
  return
  k := 【BUSINESS OBJECT】
  err = json.Unmarshal(data, &k)
  if err != nil {
  utility.SimpleFeedBack(w, 13, "Pramaters failed!")
  pillarsLog.PillarsLogger.Print("Pramaters failed!")
  return
  //方便快捷。再访问参数的时候,直接调用结构体参数就可以了。
  //注意ajax调用函数的时候需要做出一些调整代码如下:
  $.ajax([dist],JSON.stringify([data]),function(){},'json');//注意JSON
  7.持久层
  7.1 Mysql
  其实不管什么语言的Mysql驱动都是从PRO*C来的,所以会PRO*C之后,啥都好说
  Insert/Delete/Update
  代码如下:
  stmt, err := mysqlUtility.DBConn.Prepare("INSERT INTO credit (credit_code,
user_code, credit_rank) VALUES (?, ?, ?)")
  if err != nil {
  pillarsLog.PillarsLogger.Print(err.Error())
  return false, err
  defer stmt.Close()
  _, err = stmt.Exec(credit.CreditCode, credit.UserCode,
credit.CreditRank)
  if err != nil {
  return false, err
  } else {
  return true, err
  //还是比较方便的
   代码如下:
  stmt, err := mysqlUtility.DBConn.Prepare(`SELECT commodity_code,
commodity_name, description, picture,
  price, storage, count, status,
  insert_datetime, update_datetime FROM commodity WHERE commodity_code =
  if err != nil {
  return nil, err
  defer stmt.Close()
  result, err := stmt.Query(commodityCode)
  if err != nil {
  return nil, err
  defer result.Close()
  var modity
  if result.Next() {
  err = result.Scan(&(modityCode),
&(modityName), &(commodity.Description),
  &(commodity.Picture), &(commodity.Price), &(commodity.Storage),
&(commodity.Count), &(commodity.Status),
  &(commodity.InsertDatetime), &(commodity.UpdateDatetime))
  if err != nil {
  pillarsLog.PillarsLogger.Print(err.Error())
  return nil, err
  return &commodity, err
  7.2 Mongodb
   代码如下:
  err :=
mongoUtility.PictureCollection.Find(bson.M{"picturecode":*pictureCode}).One(&picture)
  这里只给出最简单的例子。具体的看mgo的开发就ok。还是比较简单的。
  8.单元测试注意事项
  测试命令 go test -v (没有其他参数了!!!) 如果不带-v只显示结果,不显示调试过程,主要是调试开发的时候用
  文件格式 xxx_test.go 但是建议改成 xxx_test0.go 或者喜欢改成别的也可以。
  由于测试先行的原则,在开发的时候一次测试也就一两个函数。
  这样相当于把其他测试注释掉
  测试的时候的配置文件要放到测试目录下面。别忘了。
  心态,错误太多一个一个来,要有个好心态。
  注意在调试中Log的不可缺失性。
  下面api如果不知道从何而来直接doc搜索就可以了。
  代码如下:
  package utility
  import "log"
  import "os"
  import "fmt"
  // Logger Model min variable.
  var Logger *log.Logger
  var outFile *os.File
  // init function if Logger if not inited will invoke this function
  func init() {
  if Logger == nil {
  propertyMap := ReadProperty("pic.properties")
  logFileName := propertyMap["LogFile"]
  fmt.Println("Initial and Open log file ", logFileName)
  var err error
  outFile, err = os.OpenFile(logFileName, os.O_CREATE|os.O_APPEND|os.O_RDWR,
  if err != nil {
  panic(err.Error())
  Logger = log.New(outFile, "", log.Ldate|log.Ltime|log.Llongfile)
  // CloseLogFile function : close Logger invoke file.
  func CloseLogFile() {
  outFile.Close()
  使用方法:
  复制代码 代码如下:
  utility.Logger.Println("Log test")go语言游戏服务器框架_中华文本库
针对这些特点,给出了如下一种架构: 一种通用的棋牌类网络游戏服务端的架构如图 1 所示, 主要分为 5 种软服务器:登录服务器(login server, LS),大厅 服务器...
端游及手游服务端的常用架构_计算机软件及应用_IT/...(1991),成为众多网游的鼻祖: MUDOS 采用 C 语言...《侠 客行》,你敲入:&go east&,游戏就会提示你:...
1-5 Go 语言构建高并发分布式系统实践_计算机硬件及...文件 -& 各个服务器上实例通过sdk订阅 profiling ...用命令?行 架构迭代 总结回顾 go语?言在基于并发...
网络棋牌游戏服务器架构_IT/计算机_专业资料。一、物理架构说明 游戏系统组件包括: ? ? ? ? ? ? ? 服务器系统( 中心服务器控制系统 ,服务器登陆控制系统 ,游...
用Go语言做一个可用的TCP服务器_IT/计算机_专业资料。我看了几个go的示例代码,发现有很多错误,最常见的是: 1,居然不判断数据有没有接收完整就开始解析了... ...
golang_go语言学习与开发_计算机软件及应用_IT/计算机_专业资料。Go语言是由Google...Pike 表示,Go 另一项与网络相关的特色,是服务器和用户端设备,如 PC 或手机,...
Go API编程 API-Centric的好处服务多个终端,特别是...beego是一个基于Go语言开发的应用框架,主要思路来源...调度器 这是一个和盛大游戏合作的项目,做的是游戏...
技术应用 一种高性能网络游戏服务器架构设计杨玲 中侨职业技术学院应用技术系 上海 201319 摘要:网络游戏一般采用 C/S 结构,服务器架构设计是成功开发一款网络游戏...
百万用户同时在线游戏服务器架构实现_IT/计算机_专业资料。介绍如何实现支持百万用户...性能的服务器 高效率的编程语言 高性能的数据库 还有高 使用高性能的服务器、...
Unity3D 游戏开发之网络游戏服务器架构设计培训 (如何做一名好主程) ...2、采用哪几种语言开发?主要是什么? 3、服务器和客户端以什么样的接口通讯? ...}

我要回帖

更多关于 服务器端语言 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信