MMORPG大型游戏设计与开发(part1 of net)
网络模块的设计,是大型多人在线游戏中比较重要的一部分。我之所以将网络模块放到最前面,是因为许许多多的开发者面对这一块的时候充满了疑惑,而且也觉得很神秘和深奥。这些我们面对到的困难,其实是由于我们对这方面了解的不足以及太过陌生。
本次设计中参考到了天龙八部/武侠世界的网络模块的设计,进行了封装调整,而且天龙八部其实也参考了韩国经典网游的设计,所以在稳定这方面还是有一定的积累。
在前面的构架中,大家可以看到一次交互的大致流程图,玩家登陆、创建角色、删除角色、选择角色等都由登陆服务器(login)进行负责,而玩家进入游戏后是直接跟游戏服务器(server)进行交互的,而公用数据则是由中心服务器(world)处理。这样分配的好处,是让各个功能各司其职,于服务器来说也就是分压的模式,同时对网络模块来说也减轻了不少压力。
在本次设计中,用到的是套接字(socket)来进行tcp的网络交互访问,在处理多对一的网络访问中,会用到多线程。所以我在这里首先会介绍下套接字和多线程。
1、什么是套接字?
多个TCP连接或多个应用程序进程可能需要通过同一个 TCP协议端口传输数据。为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口。
一个简单的例子,下面为linux/windows通用。
1)服务器(server)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h> #define MAXLINE 4096 int main(int argc, char** argv) {
int listenfd, connfd;
struct sockaddr_in servaddr;
char buff[];
int n; if ((listenfd = socket(AF_INET, SOCK_STREAM, )) == - ) {
printf("create socket error: %s(errno: %d)\n", strerror(errno), errno);
exit();
}
printf("listenfd: %d\n", listenfd);
memset(&servaddr, , sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(); if (bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -) {
printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
exit();
} if (listen(listenfd, ) == -) {
printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
exit();
} printf("======waiting for client's request======\n");
while () {
if ((connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -) {
printf("accept socket error: %s(errno: %d)", strerror(errno), errno);
continue;
}
n = recv(connfd, buff, MAXLINE, );
buff[n] = '\0';
printf("recv msg from client: %s\n", buff);
close(connfd);
}
close(listenfd);
}
2)客户端(client)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h> #define MAXLINE 4096 int main(int argc, char** argv) {
int sockfd, n;
char recvline[], sendline[];
struct sockaddr_in servaddr; if (argc != ) {
printf("usage: ./client <ipaddress>\n");
exit();
} if ((sockfd = socket(AF_INET, SOCK_STREAM, )) < ) {
printf("create socket error: %s(errno: %d)\n", strerror(errno), errno);
exit();
} printf("sockfd: %d\n", sockfd);
memset(&servaddr, , sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons();
if (inet_pton(AF_INET, argv[], &servaddr.sin_addr) <= ) {
printf("inet_pton error for %s\n", argv[]);
exit();
} if (connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < ) {
printf("connect error: %s(errno: %d)\n", strerror(errno), errno);
exit();
} printf("send msg to server: \n");
fgets(sendline, , stdin);
if (send(sockfd, sendline, strlen(sendline), ) < ) {
printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
exit();
} close(sockfd);
exit();
}
服务器的模式:创建(socket)->绑定(bind)->监听(listen)->等待连接(accept)->接收数据(recv)/发送数据(send)
客户端的模式:创建(socket)->连接(connect)->接收数据(recv)/发送数据(send)
2、什么是多线程?C++的多线程如何实现?
这方面我就不多介绍了,这个入门介绍已经解释的很清楚:http://blog.163.com/zhaojingong@126/blog/static/799089922010814104312911/
MMORPG大型游戏设计与开发(part1 of net)的更多相关文章
- MMORPG大型游戏设计与开发(概述)updated
1.定义 MMORPG,是英文Massive(或Massively)Multiplayer Online Role-PlayingGame的缩写,即大型多人在线角色扮演游戏. 2.技术与知识 在这系列 ...
- MMORPG大型游戏设计与开发(UI SYSTEM SHOW)
接下来一段时间,这些文件可能不再更新,期间我会学习和掌握一些前端知识.虽然我非常欣赏剑侠网络版叁和九阴真经的画面,但是那是一个庞大的游戏引擎,一般人是无法窥伺的,除非你是天才而且要拥有机器毫无中断的毅 ...
- MMORPG大型游戏设计与开发(服务器 游戏场景 核心详述)
核心这个词来的是多么的高深,可能我们也因为这个字眼望而却步,也就很难去掌握这部分的知识.之所以将核心放在最前面讲解,也可以看出它真的很重要,希望朋友们不会错过这个一直以来让大家不熟悉的知识,同我一起进 ...
- MMORPG大型游戏设计与开发(游戏服务器 游戏场景 概述 updated)
我们在玩游戏的时候,我们进入游戏后第一眼往往都是看到游戏世界中的场景,当然除了个别例外,因为那些游戏将游戏场景隐藏了起来,如文字游戏中的地点一样.既然我们接触了游戏世界的核心,那么作为核心的场景又包括 ...
- MMORPG大型游戏设计与开发(客户端架构 part8 of vegine)
脚本模块是游戏设计中争论比较多的话题,那是因为作为脚本本身所带来的利弊.其实这都无关紧要,取舍是人必须学会的一项技能,如果你不会取舍那么就让趋势给你一个满意的答复.自从魔兽世界以及传奇(世界)问世以来 ...
- MMORPG大型游戏设计与开发(客户端架构 part1 of vegine)
重写有些核心接口的时候,其实遇到了许多的问题,甚至一度的想过要放弃,但是最终还是坚持了下来.在客户端提供的这些接口中,可以清晰的看到客户端所依赖的各种模块的支持,以及各自之间的一些关联.下面只是介绍了 ...
- MMORPG大型游戏设计与开发(客户端架构 part12 of vegine)
在游戏中的交互过程中输入是一个必不可少的过程,比如登陆的时候需要用户输入用户名与密码,就算是单机游戏很多时候也要求用户输入一个用户名作为存档的依据.网络游戏中没有了输入,只用鼠标来交互是不切实际的,因 ...
- MMORPG大型游戏设计与开发(规范)
一件事如果没有规范.章法,那么做这件事起来往往会遇到许多难题,特别是在多人协作的时候,没有到规范通常让每个人多多少少都面临着头疼的困难.举个例子,多个人要做一桌美味的饺子,有买材料.做面皮.弄肉(菜) ...
- MMORPG大型游戏设计与开发(服务器 AI 基础接口)
一个模块都往往需要统一的接口支持,特别是对于非常大型的模块,基础结构的统一性非常重要,它往往决定了其扩展对象的通用性.昨天说了AI的基本概述以及组成,作为与场景模块中核心一样重要的地位,基础部分的设计 ...
随机推荐
- 已解决:Ubuntu php gettext 无效
使用gettext做多文字国际化,按PHP官方文档,在CentOS上OK,在Ubuntu上不行,调试了快1天,试了网上提供的无数方法,终于有一个OK了…… 看到此文的同学别再被坑了…… 感谢:http ...
- 简洁的jQuery cxMenu 手风琴导航
版本: jQuery v1.7+ jQuery cxMenu v1.2 注意事项: 自动判断是否有子导航,有则显示并不触发链接,无则触发链接. 实例预览 使用方法 载入 JavaScript 文件 & ...
- Nibbler – 免费的网站测试和指标评分工具
Nibbler 是一款免费的工具,用于测试网站的各个方面指标.输入任意网站的地址,Nibbler 会给你一份报告,列出网站的10个关键领域的分数,包括可访问性,用户体验,搜索引擎优化,社交媒体和技术等 ...
- asp.net中控制反转的理解
对IOC的解释为:“Inversion of control is a common characteristic of frameworks, so saying that these lightw ...
- 定制Eclipse IDE之功能篇(一)
上文回顾:定制Eclipse IDE之界面篇 这一篇文章将记录一些Eclipse插件拓展(extension),简单讲述常用拓展的用法,但可能不会那么详细. 我的主要插件的拓展如下: 一.or ...
- Swift安装
Server1 .Update sudo apt-get update sudo apt-get upgrade . sudo apt-get install bridge-utils .IP 3.1 ...
- js基本算法:冒泡排序,二分查找
知识扩充: 时间复杂度:算法的时间复杂度是一个函数,描述了算法的运行时间.时间复杂度越低,效率越高. 自我理解:一个算法,运行了几次时间复杂度就为多少,如运行了n次,则时间复杂度为O(n). 1.冒泡 ...
- [转]很详细的devexpress应用案例
很详细的devexpress应用案例,留着以后参考. 注:转载自http://***/zh-CN/App/Feature.aspx?AppId=50021 UPMS(User Permissions ...
- Android Animation学习(三) ApiDemos解析:XML动画文件的使用
Android Animation学习(三) ApiDemos解析:XML动画文件的使用 可以用XML文件来定义Animation. 文件必须有一个唯一的根节点: <set>, <o ...
- [IOS]edgesForExtendedLayout、automaticallyAdjustsScrollViewInsets
在IOS7以后 ViewController 开始使用全屏布局的,而且是默认的行为通常涉及到布局 就离不开这个属性 edgesForExtendedLayout,它是一个类型为UIExtendedEd ...