我正在从事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都是礼物。我不明白。
答案 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;
}
}
}