writeObject和writeUTFBytes之间的区别

时间:2013-05-05 16:00:09

标签: actionscript-3 sockets

我正在从事AIR(AS3)项目。我的计算机上运行了一个套接字服务器,并且有两个通过wifi连接的ipad,它们应该与服务器通信。 我写了一个基本的“发送”功能,它以这种方式工作:

function send(_type:String, _data:String):void
{
    socket.writeObject({ type: _type, data: _data});
    socket.flush();
}

当服务器读取响应时,它只是将其发送到另一个套接字(ipad)以实现间接的ipad到ipad通信。 端口高于1024。

有时,特别是当两个ipad几乎同时发送消息时,不会从服务器发回任何内容。我的同事正在开发一个不同的项目,但AIR AS3套接字使用WriteUTFBytes / readUTFBytes而不是我的writeObject / readObject,他似乎没有这个问题。

我的问题基本上是,这两个功能之间有根本区别吗? 我该如何防止这个错误?我怀疑服务器不喜欢在当前携带另一条消息的套接字上发送消息。我是对的吗?

更新 服务器端消息处理:

我有一个ProgressEvent.SOCKET_DATA事件的监听器,如下所示:

private function onData(e: ProgressEvent):void
{
    var currentSocket:Socket = e.currentTarget as Socket;
    var p:Object = currentSocket.readObject();
    switch(p.type)
    {
    // Process data based on the type of event
    }
}

更新2 :我已经使用Wireshark进行了一些调试,我注意到有时候,我的flash跟踪说它发送了消息,并且它没有出现在Wireshark中(显示PDU片段,所以我想即使合并的软件包也应该出现。)

第二件事(第三次更新),当两个ipads同时发送消息时,它们在Wireshark中正确显示,但服务器只读取第一个!虽然两个ACK都是礼物。我不明白。

1 个答案:

答案 0 :(得分:0)

我不知道它是否能解决您的问题但是当您进行网络工作时,您必须始终准备协议,因为您无法保证一次性接收所有数据。

在您的情况下,您应该在发送数据之前发送数据的长度,并在反序列化之前在服务器端等待enought数据。

你应该考虑做这样的事情并为每个DataEvent调用read函数:

package
{
    import flash.display.Sprite;
    import flash.net.Socket;
    import flash.utils.ByteArray;

    public class TestSocket extends Sprite
    {
        public var sendSocket : Socket;
        public var writeBuffer : ByteArray = new ByteArray;
        public var readBuffer : ByteArray = new ByteArray;
        private var readLenght : int = -1;

        public function send(_type:String, _data:String):void
        {
            // Write your object to a buffer to be able to read its lenght
            writeBuffer.clear();
            writeBuffer.writeObject({ type: _type, data: _data});

            // Send the length to the server
            sendSocket.writeInt(writeBuffer.length);

            // Send your object
            writeBuffer.position = 0;
            sendSocket.writeBytes(writeBuffer);

            sendSocket.flush();
        }

        public function read(socket : Socket) : Object
        {
            // Read all avaibles Bytes
            socket.readBytes(readBuffer);

            // Check if we have enough data to read lenght
            if(readLenght == -1 && readBuffer.length > 8)
                readLenght = readBuffer.readInt();

            // Check if we can read object
            if(readLenght != -1 && readBuffer.length >= readLenght + 8)
            {
                // Reset data length
                readLenght = -1;

                // Read object
                var o : Object = readBuffer.readObject();

                // Remove read data
                var tmp : ByteArray = new ByteArray;
                tmp.writeBytes(readBuffer);
                readBuffer.clear();
                readBuffer.readBytes(tmp);

                return o;
            }

            return null;
        }
    }
}