1

我对整个套接字和服务器开发真的很陌生,我还不熟悉它是如何工作的。

我制作了一个需要与套接字通信的简单闪存应用程序,我使用了一个支持 AS3 并在“Red Tamarin”上工作的套接字,

好吧,我会进入正题:

我目前有一个始终运行 socket.receive() 的循环,它响应甚至显示我从 Flash 应用程序发送的文本。

我的目标是做一个简单的在线flash游戏,大概使用SQL/SQLite来保存信息并导出给玩家,

我不明白的是我怎么能把它带到那里..

我认为我需要做的是这样的:

在服务器端:

  • 只要服务器处于活动状态,就有一个循环运行,该循环应该始终检查它与客户端的每个连接并等待来自它们的命令,例如登录、更新玩家位置、断开连接、请求给定位置的对象列表

客户端:

  • 根据动作向服务器发送信息,例如当玩家移动时,以类似的方式向服务器发送新位置:“MovePlayer[name][x][y]”

我的计划真的应该是这样吗?关于发送的实际信息,我很好奇,不断发送服务器字符串数据是否有效?(这就是我习惯使用的,而不是一些奇怪的字节和东西)

提前致谢!

4

2 回答 2

2

你在正确的轨道上。但我鼓励您首先定义一个通信协议。您可以从定义命令的外观开始。例如:

COMMAND <space> PARAM1 <space> PARAM2 <line-break>

关于协议定义的一些注意事项:

  1. 如果PARAM1是一个字符串并包含空格怎么办?你怎么知道每个参数的开始和结束?
  2. 您的参数还可以包含换行符。
  3. 如果您的客户端应用程序是由您的客户安装的,他们将需要不时更新它。更复杂的是,即使您更改了协议,他们也可能运行旧版本并期望它能够工作。这需要协议版本控制。如果您需要用户交互来更新应用程序的客户端部分,请记住这一点。

这些是我可以为您的方案考虑的最基本的考虑因素。可能还有其他重要的考虑因素,但其中大部分取决于您的游戏如何运作。如果您认为我忘记了 OP 应该考虑的内容,请随时修改我的列表。

在定义命令的外观后,记录您认为应用程序需要的所有命令。不要分离命令的定义,除非它对您的某些操作来说太复杂或太长。尽量保持简单。

现在回到你的问题:

我的计划真的应该是这样吗?

是的。这正是它应该的样子。

关于发送的实际信息,我很好奇,不断发送服务器字符串数据是否有效?(这就是我习惯使用的,而不是一些奇怪的字节和东西)

这取决于许多因素:

  1. 您正在使用哪种协议(TCP、UDP 等);
  2. 并发客户端数;
  3. 处理命令的平均时间;
  4. 你会向其他玩家广播更新吗?
  5. 你是如何实现你的服务器应用程序的;
  6. 身体限制:
    1. 硬件:CPU、内存等;
    2. 网络:带宽、延迟等;

TCP 与 UDP
(来源:it20.info

于 2013-03-07T19:27:36.977 回答
0

看看这个 https://code.google.com/p/spitfire-and-firedrop/

在那里,您将看到使用 redtamarin 构建套接字服务器的基础知识

特别参见 https://code.google.com/p/spitfire-and-firedrop/source/browse/trunk/spitfire/src/spitfire/Server.as

详细信息如下,redtamarin 基本上使用带有 select() 的阻塞套接字,最大硬编码 FD_SETSIZE 为 4096,请参见: https ://code.google.com/p/redtamarin/wiki/Socket#maxConcurrentConnection

所以在这里你的服务器循环中发生了什么

你基本上有一个套接字对象数组

您每 x 毫秒循环一次,并为每个套接字询问您是否可以读取它

如果您可以在套接字上读取,然后比较此套接字 obj 是否是服务器,如果它是服务器,则意味着您有一个新连接,如果不是,则意味着客户端尝试向您发送数据,因此您读取此数据然后传递它给“翻译”

稍后在同一个循环中,您检查套接字 obj 是否仍然有效,如果您可以写入并且可以写入并且套接字对象不是服务器,那么您可以将数据发送到客户端

这里是 C 中的等效代码供参考 http://martinbroadhurst.com/source/select-server.c.html http://www.lowtek.com/sockets/select.html

对于一个非常基本的示例,请查看 socketpolicyd

https://code.google.com/p/spitfire-and-firedrop/wiki/socketpolicyd https://code.google.com/p/spitfire-and-firedrop/source/browse/trunk/socketpolicyd/src/spitfire /SocketPolicyServer.as

并将实现与 Perl 和 PHP http://www.adobe.com/devnet/flashplayer/articles/socket_policy_files.html进行比较

于 2013-06-19T17:31:02.480 回答