gpt4 book ai didi

actionscript-3 - writeObject 和 writeUTFBytes 之间的区别

转载 作者:行者123 更新时间:2023-12-01 14:12:25 24 4
gpt4 key购买 nike

我正在处理 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 trace 说它发送了消息,但它没有出现在 Wireshark 中(它显示PDU 片段,所以我想即使是合并的包也应该显示出来)。

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

最佳答案

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

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

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

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;
}
}
}

关于actionscript-3 - writeObject 和 writeUTFBytes 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16386381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com