C# 套接字和序列化






1.61/5 (29投票s)
2003年6月10日
2分钟阅读

123013

2072
一个基于客户端/服务器编程运行的简单游戏。
引言
点格棋是一个简单的多人游戏。每个玩家在网格上画一条线,然后轮到其他玩家。目的是尽可能多地获得方框。 最初从互联网上下载的游戏缺乏很多乐趣,因为它只能在一台机器上玩。需要一种方法来玩游戏,每个玩家都使用自己的电脑并轮流玩。
该项目是一个多人游戏,可以在局域网和互联网上进行。 该项目旨在允许人们跨网络进行游戏,从而解决轮流的问题。 此外,通过网络进行游戏可以让远程的人一起玩。
为了开发游戏,使用了以下概念
- 序列化。
- 多线程。
- 逻辑同步。
该程序的想法是为每个玩家创建两个套接字。一个处理游戏消息,另一个处理聊天部分。 当玩家第一次运行该程序时,他有两个基本选项。 要么托管游戏,要么加入游戏。 要加入游戏,玩家必须拥有与之对战的人的 IP 地址。
序列化用于传递一个包含所有最新棋盘信息的对象。 因此,每当玩家移动一步时,该移动将被传递到服务器,然后服务器将其传递给其他玩家。 但是由于当前的实现仅限于两个玩家,因此服务器接收信息、更新,然后允许移动,将该移动发送给玩家,然后重复该过程。
由于大量使用了 GDI 命令,因此在许多地方都需要多线程。 但使用它的主要部分是聊天。 对于聊天,有一个线程来处理传入的消息并将它们传递给 GUI。
最关键和最困难的部分是同步。 非常幸运的是,TCP 处理了许多问题。 但仍然有很多事情要处理。 比如轮流、阻塞、获胜、得分等。 混乱的代码影响很大,凸显了有组织的设计和 OOP 设计方法的重要性,即使它很简单; 只要有消息传递和其他 OOP 概念。
以下是最终产品的局限性
- 只能有两个玩家玩。
- 如果位于防火墙或 NAT 后面,则无法玩。
- 玩家必须在玩之前达成一致,以便他们知道自己的 IP 地址。
- 由于它是用 C# 实现的,因此它无法在没有 .NET 运行时环境的机器上运行。
以下是序列化部分的代码行
IFormatter sender = new BinaryFormatter();
sender.Serialize(this.ns[n],o);
// ...
IFormatter getter = new BinaryFormatter();
if(ns[n].DataAvailable)
{
packet = (Packet) getter.Deserialize(ns[n]);
ns[n].Flush();
return packet;
}
参考文献
- 点格游戏。 提交者:Garry
- 使用 C# 的对象序列化。 提交者:Omkamal
- http://www.csharphelp.com/archives/archives38.html。 提交者:Biktagirov