AS3服务器套接字,进度事件,readutfbytes

时间:2011-12-05 00:31:21

标签: python actionscript twisted

这里有一点问题。

我正在使用flash进行多人游戏,并在服务器方面使用python。我有套接字连接工作...... sorta,以及相当多的python工作,但我遇到了一个奇怪的问题。

让我们说,登录后,我会向客户端发送一些包含其中一些信息的数据。 之后,我发送一些数据将它们分配到一个房间。

这个数据在AS3中似乎不是两个不同的东西,而是在readUTFBytes之后,它们都在同一个字符串中。

var str:String = event.currentTarget.readUTFBytes(event.currentTarget.bytesAvailable);

在python中,我已经定义了发送数据的方法,它只是通过transport.write(Twisted)发送数据,我通过动作脚本中的进度套接字数据事件接收。知道这里有什么不对吗?这是一些代码...

if ( ! event.currentTarget.bytesAvailable > 0) {
            return;
        }
        var str:String = event.currentTarget.readUTFBytes(event.currentTarget.bytesAvailable);
        var Char1:String = str.charAt(0);
        var Char2:String = str.charAt(1);
        str = str.replace(Char1, "");
        str = str.replace(Char2, "");

        // Various messages
        if (Char1 == "\x03") {
            if (Char2 == "\x03") {
                trace("Got ping thread");
            }
            else {
                trace("x03 but no secondary prefix handled");
            }
            return;             
        }

我知道这很邋,,但我只想确定一个问题。

所有数据都带有两个前缀,例如\ x02和\ x09,以便我确定要做什么,然后将字符串中的大多数数据拆分到\ x01以获取值。

问题本质上是,我应该得到/ x08 / x08数据,我得到/ x08 / x08 data / x05 / x03数据,它应该是两个单独的东西。

1 个答案:

答案 0 :(得分:2)

TCP连接是可靠的,有序的,面向流的传输。流是一个字节序列,没有固有的消息边界。如果要将字节拆分为单独的消息,字节本身必须告诉您如何进行此拆分(或者您需要一些始终适用的外部规则,例如“消息长度为5个字节” )。

这适用于所有TCP连接,无论您使用哪种语言,或者在它们之上删除了哪些奇怪的特定于库的API(如readUTFBytes)。

协议有很多选项可以帮助您构建消息。例如,您可以使用长度前缀。然后您的消息将如下所示:

\x07 \x08 \x08 h e l l o \x05 \x05 \x03 m a n

\x07给出第一条消息的长度,7个字节:\x08 \x 08 h e l l o。该消息之后的下一个字节\x05给出了第二条消息的长度:\x05 \x03 m a n

如果消息需要更长,则可以使用多字节长度前缀,或者使用十进制表示和:分隔符的netstrings支持任意大小的前缀。还有更复杂的协议提供了比将字节分成消息更多的功能。例如,AMP为您提供了一种带有参数和响应的RPC形式。