多线程探讨 如今大多数CPU都具有多个核心,为了最大程度的发挥多核处理器的效能,提高服务器的并发性,保证系统对于多线程的支持是十分必要的.我们在之前的设计都是基于单线程而言,在此章我们将对系统进行改进,在进一步提升系统性能的同时保证系统对于多线程的支持. 首先考虑这么几个问题,我们之前已经选定了基于I/O复用的Reactor模式,那么在多线程环境下我们该如何处理这些I/O?多线程同时处理同一个套接字描述符安全吗?Reactor模式支持多线程吗? 根据查阅文档可知,针对文件描述符的常见系统调用如r…
服务器设计技术有很多,按使用的协议来分有TCP服务器和UDP服务器.按处理方式来分有循环服务器和并发服务器. 1  循环服务器与并发服务器模型 在网络程序里面,一般来说都是许多客户对应一个服务器,为了处理客户的请求,对服务端的程序就提出了特殊的要求. 目前最常用的服务器模型有: ·循环服务器:服务器在同一时刻只能响应一个客户端的请求 ·并发服务器:服务器在同一时刻可以响应多个客户端的请求 1.1 UDP循环服务器的实现方法: UDP循环服务器每次从套接字上读取一个客户端的请求->处理->然后将…
转载请注明出处,欢迎大家批评指正 1.数据服务器详细设计 数据服务器在设计上采用三个层次的数据同步,实现玩家数据的高速获取和修改. 数据层次上分为:内存数据,redis数据,mysql数据 设计目的:首先保证数据的可靠,防止数据丢失,保证数据完整.然后实现数据的高速访问,减少由玩家数量增加对数据服务器性能造成的影响.最后实现运维数据的入库,以及数据持久化. 在这个基础上数据服务器不再是一个单一服务器,它涉及到与其他服务器之间的交互. 数据服务器的核心在于redis数据层面.通过redis加快玩家…
多条线程在操作同一份数据的时候,一般需要程序去控制好变量.在多条线程同时运行的前提下控制变量,涉及到线程通信及变量保护等. 本博文主要总结:①线程是如何通信  ②如何保护线程变量 1.Java里的线程通信 在多线程的第二小节已经总结过:控制多条线程访问方法,可以通过synchronized关键字对方法上锁,保证每次只有一条线程能够调用该方法.但让程序交替执行方法,那得给线程上锁,且通过线程间的通信完成变量之间的共享及操作. Java里面线程间通信对程序员是透明的,通过线程操作变量具体步骤如下:…
游戏服务器设计之聊天室示例 简介 h2engine引擎建群以后,有热心网友向我反馈,想尝试h2engine但是没有服务器开发经验觉得无从入手,希望我能提供一个简单明了的示例.由于前一段时间工作实在忙碌,一直没有抽出时间好好写一下,后来抽空写了出来,自己从小白开发者的角度重新审视了一遍h2engine,自己也收获匪浅,也优化了部分h2engine的架构,使其更易使用.以前的例子都是c++加脚本的例子,这次写一个纯c++的例子. 开发服务器程序一般有如下几个基本操作: 启动程序,监听网络端口,初始化…
zt  http://www.cnblogs.com/captainl1993/p/4788236.html 1.数据服务器详细设计 数据服务器在设计上采用三个层次的数据同步,实现玩家数据的高速获取和修改. 数据层次上分为:内存数据,redis数据,mysql数据 设计目的:首先保证数据的可靠,防止数据丢失,保证数据完整.然后实现数据的高速访问,减少由玩家数量增加对数据服务器性能造成的影响.最后实现运维数据的入库,以及数据持久化. 在这个基础上数据服务器不再是一个单一服务器,它涉及到与其他服务器…
一.追溯 去gameloft笔试,有一个题目是说: 叫你去设计一个FPS(第一人称射击游戏),你是要用TCP呢还是要用UDP,说明理由 . 二.学习 这是两篇网上找到的文章,写非常不错. 当时笔试的时候自己没想到这么全,但大概想法都是一致的,摘录下来再学习一下. 1.网络游戏程序员须知 UDP vs TCP 作者:rellikt@gmail.com 首发链接:http://blog.csdn.net/rellikt/archive/2010/08/21/5829020.aspx 这篇教程让我们就…
python实现并发服务器实现方式(多线程/多进程/select/epoll)   并发服务器开发 并发服务器开发,使得一个服务器可以近乎同一时刻为多个客户端提供服务.实现并发的方式有多种,下面以多进程,多线程,IO多路复用等方式实现并发.这里使用网络编程中的TCP服务器和客户端通信为例子. 多进程并发阻塞 利用进程把客户端和服务器进行管理,当有新的客户端连接到服务器时,就创建一个新的进程来管理,通过操作系统的调度,从而实现了并发的操作 from multiprocessing import P…
FPS游戏服务器设计的问题出处:http://www.byteedu.com/thread-20-1-1.html一.追溯 去gameloft笔试,有一个题目是说: 叫你去设计一个FPS(第一人称射击游戏),你是要用TCP呢还是要用UDP,说明理由 . 二.学习 这是两篇网上找到的文章,写非常不错. 当时笔试的时候自己没想到这么全,但大概想法都是一致的,摘录下来再学习一下. 1.网络游戏程序员须知 UDP vs TCP 作者:rellikt@gmail.com 首发链接:http://blog.…
JavaScript框架设计(三) push兼容性和选择器上下文 博主很久没有更博了. 在上一篇 JavaScript框架设计(二) 中实现了最基本的选择器,getId,getTag和getClass ,并且解决了document.getElementsByClassName() 这个函数在ie8下面的兼容性问题,似乎以前的代码已经没问题了? 但是, 注意这一句代码: result.push.apply(result,document.getElementsByTageName),result.…
上一篇文章我介绍了如果动态加载dll文件来更新程序 一步一步开发Game服务器(三)加载脚本和服务器热更新 可是在使用过程中,也许有很多会发现,动态加载dll其实不方便,应为需要预先编译代码为dll文件.便利性不是很高. 那么有么有办法能做到动态实时更新呢???? 官方提供了这两个对象,动态编译源文件. 提供对 C# 代码生成器和代码编译器的实例的访问. CSharpCodeProvider 提供一下方法加载源文件, // 基于包含在 System.CodeDom.CodeCompileUnit…
DHCP就是动态主机配置协议(Dynamic Host Configuration Protocol),它的目的就是为了减轻TCP/IP网络的规划.管理和维护的负担,解决IP地址空间缺乏问题.这种网络服务有利于对网络中的客户机IP地址进行有效管理. DHCP功能分为两个部份:一个是服务器端,而另一个是客户端(客户端不用安装,windows 9x/2000/xp 在默认情况下都启动DHCP Client服务).DHCP透过“租约”的概念,有效且动态的分配客户端的TCP/IP设定. 路由器DHCP服…
在我们这批新人转正评审的时候,我师父问了我的小伙伴一个问题:为什么一些更新界面的方法只能在主线程中调用?师父没有问我这个问题,让知其然但不知其所以然的我有种侥幸逃过一难的心情.我想如果回答那是因为Android GUI库是单线程消息机制的,更新界面的操作必须放到主线程中执行,那师父可能继续问为什么Android GUI要设计成单线程的,我就不知道了. 为什么它非得设计为单线程的?多线程不是更好吗?带着点好奇感和求知欲以及鄙视权威的无畏精神我在google中展开了搜索,并最终找到了一个令我满意的解…
游戏UI框架设计(三) ---窗体的层级管理 UI框架中UI窗体的"层级管理",最核心的问题是如何进行窗体的显示管理.窗体(预设)的显示我们前面定义了三种类型: 普通.隐藏其他.反向切换.代码如下: /// <summary> /// UI窗体显示类型 /// </summary> public enum UIFormsShowMode { Normal, //普通显示 ReverseChange, //反向切换 HideOther, //隐藏其他界面 } &q…
玩家进程用gen_server来建模,我不直接使用 use GenServer, 而是使用exactor,该库可以去掉反锁的接口定义. 我们新建一个 player_server_manager app吧, 使用 mix new player_server_manager --sup, 会给我们增加sup.然后在mix.exs里增加exactor的依赖如下: defp deps do [{:exactor, "~> 2.2"}] end 跑 mix deps.get,成功了依赖就准…
游戏服务器设计之属性管理器 游戏中角色拥有的属性值很多,运营多年的游戏,往往会有很多个成长线,每个属性都有可能被N个成长线模块增减数值.举例当角色戴上武器时候hp+100点,卸下武器时HP-100点,这样加减逻辑只有一处还比较好控制,如果某天有个特殊功能当被某技能攻击时,角色武器会被击落,这样就会出现减数值的操作不止一处.如果逻辑处理不当,比如击落的时候没有恰当的减数值,再次穿戴武器就导致属性值加了两边,也就是玩家经常说的刷属性.这种bug对游戏平衡性影响很大,反响很恶劣,bug又很难被测试发现…
游戏服务器设计之NPC系统 简介 NPC系统是游戏中非常重要的系统,设计的好坏很大程度上影响游戏的体验.NPC在游戏中有如下作用: 引导玩家体验游戏内容,一般游戏内有很多主线.支线任务,而任务的介绍.接取.领取奖励等操作都是通过NPC的操作,一般会有几个核心NPC,再不停的任务引导中,玩家会对核心npc印象深刻,强化了游戏代入感. 核心功能的展示和操作.游戏大部分功能都会放到游戏主界面,但是全部功能都放进去是不现实的,其他功能则以NPC的方式提供,比如进入某副本的入口等. 一些运营活动,比如道具…
驾校计时平台的TCP服务器,主要用于接入计时终端,计时终端与计时平台.计时平台与省级监管服务平台.省级监管服务平台与全国驾培平台的卫星定位过程明细数据和学时过程明细数据接口应使用基于JT/T 808标准扩充的部标808变种的TCP协议,同时还需要有转发功能,计时平台在收到计时终端的所有消息后应实时将该消息转发到省级监管服务平台,省级监管服务平台在收到计时平台和远程教育平台的所有消息后应实时将该消息转发到全国驾培平台. 交通部推出了[机动车驾驶员计时培训系统平台技术规范]和[机动车驾驶员计时培训系…
高性能服务器设计(Jeff Darcy's notes on high-performance server design 我想通过这篇文章跟大家共享一下我多年来怎样开发“服务器”这类应用的一些想法和观点(这类应用用名词“server”来表示,还是有点牵强). The purpose of this document is to share some ideas that I've developed over the years about how to develop a certain k…
unity3d + photon + grpc + nodejs + postgis/postgresql 游戏服务器设计 最近做玩票性质的游戏项目,客户端技术是 unity3d 和 android.团队由于缺少游戏网络层的设计经验,于是就采用市面上比效常用的服务器 photon 来做. 具体到语言:unity3d 使用 c# , android 使用 java,使用 photon 使用 c# . 做技术选型的时候,想了很久,想统一技术的基础,也就是说服务器端也采用 c#, 尝试 c# 写了几个…
Python服务器开发三:Socket   socket是操作系统中I/O的延续,它可以使进程和机器之间的通信成为可能.socket可以看成一个标准的文件描述符.不同的是文件需要用open()函数打开,而socket用socket() 函数建立.recv().send()函数和read().write()函数极为相似. TCP一般通过accept()来为每个连接的客户端建立一个新的scoket.UDP一般只是使用一个单一的socket,完全依靠recvfrom()返回的值来判断该往哪里发送响应.…
前文介绍了传统IO的WEB经典服务器 reactor模式前序:传统IO的WEB服务器设计 下面看看JAVA NIO的WEB服务器设计 NIO是基于事件驱动的,对于NIO来说,重要组件是Selector,其服务器代码为: 1 /* 2 * 流程总结: 3 * 1.初始时,只对accept事件感兴趣,selectionkey只有accept事件 4 * 2.当有连接进来时,处理完accept之后,对读事件感兴趣,selectionkey增加键read 5 * 3.不断循环selectionkey的键…
先看一段经典的WEB JAVA服务器设计 JAVA代码为(伪代码) 1 ServerSocket serverSocket = ...; 2 serverSocket.bind(8899); 3 4 while (true) { 5 final Socket socket = serverSocket.accept(); // 阻塞 6 7 new Thread(new Runnable() { 8 public void run() { 9 socket.getInputStream(); 1…
2020年注定会被历史铭记,世界遭受着一场前所未有的灾难,这种灾难到现在还在持续.还记得19年末的时候,那时候听到一点点消息,哪里想得到年关难过,灾难来的让人猝不及防.由于疫情防控,2020年感觉转瞬即逝,仿佛晃眼的功夫.本来做些自身职业上的改变,去年因为自身的原因因此搁浅.想想这几年自己维护的这个框架并未有太大的起色,甚者一度遗忘了它,所规划的很多内容并未得到实现.自己的懒惰搁浅,未免是对生命的严重浪费.今年的虽然暂时没有太多的计划,但是改变已经走在路上,希望这对自己的人生有所帮助.plain…
一个工作5年的粉丝,最近去面试了很多公司,每次都被各种技术原理题问得语无伦次. 由于找了快1个月时间的工作,有点焦虑,来向我求助. 我能做的只是保证每天更新一个面试题,然后问他印象最深刻的一个面试题是什么,他说. "TCP协议为什么要设计三次握手". 好的,关于这个问题,我们来看看普通人和高手的回答. 普通人: 我认为就是因为TCP它是一个双工协议,双工协议就是意味着它可以双向去进行数据传输. 那么既然是数据双向传输的话,那么意味着我两端都是建立一个通信连接.两端都是彼此之间双向建立连…
多线程在随着cpu发展应用的是越来越多,游戏场景因为其在服务器所占的数据量与逻辑复杂度的原因必须依赖于它.为什么场景要采用多线程?场景的线程是怎样的?场景的线程又是如何创建的?场景的线程又是怎样管理的?在这里同时对可以指正错误的朋友们说声谢谢,虽然是小错误,也希望大家能够勇于纠正这些错误. 游戏截图 采用理由 上面的两张截图分别在不同的场景,试想一下如果一个线程只能先处理其中一张图的数据,后果会怎么样? 单线程往往需要等待,就好像我们到银行窗口办理业务的时候,以前的时候很多网点只有一个窗口,所以…
先看LockedQueue.h template <class T, typename StorageType = std::deque<T> >class LockedQueue{......} 一个带锁的多线程可安全访问的类,容器默认使用std::deque 常规代码 push进T类型的元素 pop出T类型的元素 使用锁定 保证线程安全 相比C++11之前的繁琐做法 现在加锁可以使用 std::lock_guard 当使用std::lock_guard<std::mute…
生命周期介绍 每一个服务器系统的新连接从建立开始时,均会经历多个阶段.比如连接的建立,登录的验证,退出前的资源释放等.同时在具体的消息处理中,还会遇到不可识别的消息事件,或者消息处理时出现数据错误等.这些场景在每个连接的整个生命过程都可能会经历,而系统用户也会期望在某些场景中完成特定的操作.比如统计每一个新建连接的信息,对不同类型的客户进行验证过程等. 在一般的服务器系统中,用户需要主动为每个连接对象维护当前状态,然后在具体业务场景中加入对当前连接状态的判断,并在每一个改变连接状态的场景中执行相…
这个系列把毕业论文的部分贴了出来,以作保存留念.整个系列分为三大部分,其中第一章到第三章是介绍服务器的系统层设计,设计思路参考了libevent和muduo等开源代码的实现:第四章到第六章是介绍服务器的服务层设计,设计思路参考了自己的Khala实现:第七章介绍了如何利用该服务器框架实现一款类似于QQ的聊天系统.全文主要参考了陈硕的<Linux多线程服务端编程>.<Unix网络编程卷1>. 系统简介 本系统是用C++设计实现的TCP网络服务器框架.该系统底层I/O部分采用基于Reac…
1.前言 网络编程分为客户端和服务端,服务器通常分为迭代服务器和并发服务器.并发服务器可以根据多进程或多线程进行细分,给每个连接创建一个独立的进程或线程,或者预先分配好多个进程或线程等待连接的请求.今天探讨三种设计范式 (1)迭代服务器 (2)并发服务器,为每个客户请求创建一个进程或线程 (3)预先分配子进程或线程,每个子进程或线程调用accept 3.测试用例: 客户端代码: #include <sys/wait.h> #include <string.h> #include &…