2D网络游戏开发(网络篇)(十一)

原创 2006年06月22日 11:46:00
2D网络游戏开发(网络篇)(十一)
 
作者:akinggw
 
前言
 
在前面的内容中,我们讲解了什么是比特流(bitstream),如何建立数据包,如何发送数据包。今天,我们将讲解如何接收数据包,把这三个内容翻译了,我们将来实际编写一下代码。看看这些东西到底有多重要。
 
接收数据包
 
当一个数据包从网络上传输过来。接收函数将返回不为0,在这里我们要分三步来处理这个接收过程。Multiplayer类将为你处理第一步和第三步,
 
1. 决定数据包的类型,这个数据包的类型可以由下面的代码返回:
 
unsigned char GetPacketIdentifier(Packet *p)
{
if((unsigned char)p->data[0]==ID_TIMESTAMP)
return (unsigned char) p->data[sizeof(unsigned char) + sizeof(unsigned long)];
else
return (unsigned char)p->data[0];
}
 
接收数据结构
 
如果你原来发送的是一个结构,你就可以像下面这样接收它:
 
//如果你不使用Multiplayer,这里就将交给ProcessUnhandledPacket处理
if(packetIdentifier==/*这里是已经分配给用户的数据包标识*/)
DoMyPacketHandler(packet);
 
//把这个函数放在你想放的任何地方,在状态类中处理游戏是一个好的地方
void DoMyPacketHandler(Packet *packet)
{
//将数据放在结构的适当类型当中
MyStruct *s=(MyStruct *) packet->data;
Assert(p->length==sizeof(MyStruct));
If(p->length!=sizeof(MyStruct))
Return;
 
//用NetworkIDGenerator和宏定义位置,然后得到一个指针指向标明结构的对象
MyObject *object =(MyObject *) GET_OBJECT_FORM_ID(s.objected);
//对于这个数据包的类型,执行一个功能
object->DoFunction();
}
 
有用的注释
 
l               我们将数据包中的数据指向结构的相应类型是为了避免空拷贝。这样做的话,不管怎样,如果我们改变了结构中任何的数据,那么也将同样改变数据包。这可能或也不可能是你想要的结果。小心保管服务器返回的信息,因为这可能引起一些不必要的麻烦。
l               那断言(assert),也并不一定是必须的,但是当我们发送数据包时,分配了错误的标识或者错误的长度的时候,它对于找到错误将是非常有用的。
l               但某些人为了攻击客户端或服务器,而发送一些包含错误长度和类型的数据包,在这种情况下,状态就显得特别的重要了。
 
2. 通过DeallocatePacket(Packet *packet)=0;函数删除数据包。
 
接收比特流
 
如果你寄出一个比特流,我们建立比特流去分析数据应该按照我们写数据相同的顺序。我们建立比特流,使用了数据和数据包的长度。我们然后在使用写(Write)函数之前使用读(Read)函数;在使用写压缩(WriteCompressed)之前使用读压缩(ReadCompressed),无论我们写何种数据都将按照上面给出的相同的逻辑分支。
下面,我们给出一个例子,这个例子使用了在建数据包时使用的结构Mine。这个例子的作用就是如何读出Mine结构中的数据。
 
Void DoMyPacketHandler(Packet *packet)
{
Bitstream myBitStream(packet->data,packet->length,false); //第三个参数false的作用是不允许我们拷贝传输过来的数据
MyBitStream.Read(useTimeStamp);
MyBitStream.Read(timestamp);
MyBitStream.Read(typeId);
Bool isAtZero;
MyBitStream.Read(isAtZero);
If(isAtZero==false)
{
 x=0.0f;
 y=0.0f;
 z=0.0f;
}
else
{
myBitStream.Read(x);
myBitStream.Read(y);
myBitStream.Read(z);
}
myBitStream.Read(objectId); // 在这个结构中,这是对象标识
myBitStream.Read(playerId); //在这个结构中, 这是玩家标识
}
 
关于更多内容请访问金桥科普网站( http://popul.jqcq.com  )游戏开发栏目,如你需要游戏开发方面的书籍请参考金桥书城游戏频道(http://book.jqcq.com/category/1_70_740.html )。如果你在阅读本篇文章时有什么好的建议请来信给我,我的E_mail: akinggw@126.com. 如果你在使用SDL时有什么问题,请到金桥科普网站(http://popul.jqcq.com  )游戏开发栏目,我将详细地为你解答。
 

网络(Java核心技术卷Ⅱ)

网络 1 连接到服务器 网络 3.1 连接到服务器 打开一个套接字:Socket s=new Socket(address,port); 套接字是网络软件中的一个抽象概念,负责...
  • rename_to
  • rename_to
  • 2016年05月08日 16:37
  • 338

一步一步构建你的iOS网络层 - HTTP篇

本文来自简书,原文地址:http://www.jianshu.com/p/f9b4ada163ab 缘起 经常跑步的人一定知道, 每次跑步时间过了15分钟以后, 脑子里通常就开始出现: 青...
  • qq_30513483
  • qq_30513483
  • 2017年02月17日 11:45
  • 418

TCP/IP 教程(针对LINUX的网络基础请参看 《鸟哥的Linux私房菜 服务器架设篇(第三版) 》)

TCP/IP 是针对因特网的通信协议。 在此教程中,你将了解到什么是 TCP/IP,以及它如何工作。开始学习 TCP/IP ! TCP/IP 是因特网的通信协议。 通信协议是对计算机必须遵...
  • u010794281
  • u010794281
  • 2015年09月16日 18:31
  • 1534

网络流Edmond-Karp算法

前阵子都在忙PHP的事,没有时间去更新博客,今天下午终于狠下心来学网络流,在这里讲一下网络流Edmond-Karp算法的基础内容。至于网络流的一些基础概念,这里就不说明了,大家可以去百度或看书。其思想...
  • ColorWaterer
  • ColorWaterer
  • 2014年11月17日 23:28
  • 525

网络流基础篇——Edmond-Karp算法

BY纳米黑客  这是我的一个初学者教程系列的一部分,也是这个系列的第一篇文章,这个系列计划中将包括网络流,线段树,树状数组等一些初学者比较难以入门的内容。  因为是初学教程,所以我会尽量避免繁杂的数学...
  • u010255534
  • u010255534
  • 2013年12月29日 19:36
  • 741

网络基本功(十一):TCP窗口调整与流控

网络基本功(十一):TCP窗口调整与流控   转载请在文首保留原文出处:EMC中文支持论坛https://community.emc.com/go/chinese    介绍  ...
  • mxway
  • mxway
  • 2015年01月16日 21:44
  • 1443

Android 各大网络请求库的比较及实战

自己学习android也有一段时间了,在实际开发中,频繁的接触网络请求,而网络请求的方式很多,最常见的那么几个也就那么几个。本篇文章对常见的网络请求库进行一个总结。HttpUrlConnection最...
  • sbsujjbcy
  • sbsujjbcy
  • 2015年05月11日 09:30
  • 17154

基础网络概念

摘自《鸟哥的 Linux 私房菜-网络篇》 局域网络 (Local Area Network, LAN) 广域网 (Wide Area Network, WAN) MAC (Media Ac...
  • breeze_life
  • breeze_life
  • 2013年08月07日 18:17
  • 1899

Redis网络库源码分析(1)之介绍篇

一、前言Redis网络库是一个单线程EPOLL模型的网络库,和Memcached使用的libevent相比,它没有那么庞大,代码一共2000多行,因此比较容易分析。其实网上已经有非常多有关这个网络库的...
  • yangbodong22011
  • yangbodong22011
  • 2017年03月23日 15:30
  • 900

Windows网络编程(基础篇1)

Windows网络编程(基础篇1) Winsock是一种网络编程接口,不是协议。 除了WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError属于W...
  • zt_xcyk
  • zt_xcyk
  • 2017年03月10日 15:21
  • 527
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:2D网络游戏开发(网络篇)(十一)
举报原因:
原因补充:

(最多只允许输入30个字)