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的基本概述以及组成,作为与场景模块中核心一样重要的地位,基础部分的设计 ...
随机推荐
- Wowza® Media Systems 使用配置手册。
准备 1,先安装Java:http://www.java.com/zh_CN/ 2,官网下载安装:http://www.wowza.com/pricing/installer ,需要输入用户名邮箱等信 ...
- php获取数组第一个值 current()
获取数组第一个元素的值,如果是数字索引那还好,直接$array[0],如果键名是字符串,你又未知这个字符串呢?用current()函数就可以做到. current() 函数返回数组中的当前元素(单元) ...
- ie7下的javascript兼容
<a href="javascript:;" onclick="functionone();"></a> <script> ...
- Httplistener Access Denied
HttpListener.Start() 会出现HttpListenerException, 显示拒绝访问 一般是因为有些计算机账户是没有权限创建 HttpListener服务, 但是可以注册一些规则 ...
- Android 在不同Actitity之间数据传递
本文实现一个简易的人品计算器来实践在不同Actitity之间数据传递 intent的数据传递 从A界面打开B界面 把A界面的数据传递给B界面 1. intent.setData(uri) -- int ...
- 苹果IPSW文件提取软件
ipsw文件 提取系统文件 方法总结 由于修改运营商文件造成我的有锁4S无法使用移动卡了,在网上苦寻一番还是没有结果,最后萌生了从固件中提取文件的想法,于是便开始在网上搜集资料,最后文件终于提取成功并 ...
- android自定义activity
今天公司有个需要需要自动弹出界面,而dialog又不符合要求,所以自定义的一个activity的样式 首先在androidmainfest.xml上注册你的activity <activity ...
- UIAlertView' is deprecated: first deprecated in iOS 9.0 - UIAlertView is deprecated. Use UIAlert
UIAlertController * cancleAlertController = [UIAlertController alertControllerWithTitle:nil message: ...
- 【代码笔记】iOS-将图片处理成圆的
一,效果图. 二,工程图. 三,代码. ViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional ...
- 【读书笔记】iOS-iCloud编程
一,苹果云服务-iCloud. 苹果公司斥资10亿美元在北卡罗来纳州简历数所中心-iDataCenter,该数据中心面积为50万平方英尺,也是美国最大规模的数据中心之一. 二,配置iCloud. 1, ...