这里有点问题。

我正在开发带有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数据/ x05 / x03数据。

最佳答案

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

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

关于python - AS3服务器套接字,进度事件,readutfbytes,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8379764/

10-08 21:43