套接字编程初学者的问题

时间:2013-03-07 18:54:41

标签: c++ actionscript-3 sockets server-side

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

我制作了一个需要与套接字通信的简单Flash应用程序, 有了这个,我使用了一个支持AS3的套接字并使用“Red Tamarin”,

好吧,我会明白:

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

我的目标是获得一个简单的在线Flash游戏, 可能使用SQL / SQLite来保存信息并将其导出给玩家,

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

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

在服务器端:

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

客户方:

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

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

提前致谢!

2 个答案:

答案 0 :(得分:2)

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

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

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

  1. 如果PARAM1是一个字符串并包含空格怎么办?如何判断每个参数的开始和结束?
  2. 您的参数也可能包含换行符。
  3. 如果客户端安装了客户端应用程序,他们需要偶尔更新一次。为了进一步复杂化,即使您更改了协议,它们也可以运行旧版本并期望它能够正常工作。这需要协议版本控制。如果您需要用户交互来更新应用程序的客户端部分,请记住这一点。
  4. 这些是我可以为您的方案考虑的最基本的考虑因素。可能还有其他重要的考虑因素,但大多数都取决于游戏的运作方式。如果您认为我忘记了OP应该考虑的事情,请随时修改我的列表。

    在定义命令的外观之后,记录您认为应用程序需要的所有命令。除非某些操作过于复杂或过长,否则请勿隔离命令的定义。尽量保持简单。

    现在回到你的问题:

      

    我的计划真的应该如何吗?

    是。这正是应该的样子。

      

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

    这取决于许多因素:

    1. 您正在使用的协议(TCP,UDP等);
    2. 并发客户端数量;
    3. 处理命令的平均时间;
    4. 您是否向其他玩家广播更新?
    5. 您如何实施服务器应用程序;
    6. 身体约束:
      1. 硬件:CPU,内存等;
      2. 网络:带宽,延迟等;
    7. TCP vs UDP http://www.it20.info/misc/pictures/TCP-clouds-UDP-clouds-design-for-fail-and-AWS1.jpg

答案 1 :(得分: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