我一直在尝试在 AS3 中编程套接字,但我遇到了一些问题。
我正在使用 C++ 服务器和 Flash AS3 客户端。这是我在第一场比赛中的糟糕尝试,所以这里什么都没有。我的编程经验很少,所以请多多包涵。
这是我从服务器发送到客户端(十六进制)的内容:
S = Packet Size, C = Content, H = Header(基本上告诉客户端这个包做了什么)
S H C..
06 02 00 00 00 00
06 03 D1 13 01 07
02 04
但是,当我的 flash 客户端收到信息时,它是这样接收的:
S H C..
06 02 00 00 00 00
06 03 D1 13 01 07
06 03 D1 13 01 07 -- weird duplicate?
02 04
我不知道为什么其中一条消息是重复的!我在我的 C++ 服务器上的写入函数中放置了一个 trace(),看起来我肯定会发送一次,但我的 Flash 客户端读取它两次。
s.addEventListener(ProgressEvent.SOCKET_DATA, sData);
function sData(e:ProgressEvent):void
{
while(true){
try {
GetByte(); //packet size, im ignoring it for now
parsePacket();
}
catch (error:Error)
{
trace(error);
break;
}
}
}
function parsePacket()
{
var header:uint = GetByte();
trace("New Packet: ", header);
switch (header){
case 0x01:
//dostuffwithcontent
break;
case 0x02:
//i use it 4 times so there is no "leftover"
//i actually do stuff with the bytes in real code, but this is only to make it easier to read
GetByte();GetByte();GetByte();GetByte();
break;
case 0x03:
//this is called twice
//Flash is reading the same info 2 times from the socket, even though it has only been sent once.
GetByte();GetByte();GetByte();GetByte();
break;
case 0x04:
trace("last packet received");
break;
default:
break;
}
}
function GetByte():uint{return socket_.readUnsignedByte();}
这是我用来发送信息的 C++ 函数,我在每个“数据包”之后调用它一次。
void outputMessage(NetworkMessage& msg)
{
std::cout << msg.size() << std::endl; //never called more than required, and always shows correct size
boost::asio::async_write(socket_,boost::asio::buffer(msg.getOutputBuffer(), msg.size()),boost::bind(&Session::handle_write, this,boost::asio::placeholders::error));
}
我究竟做错了什么?我不明白为什么 Flash 从套接字读取它两次。
将不胜感激任何帮助,谢谢。
更新:好的,我终于想出了如何在 Windows 上嗅探本地主机流量,事实证明,服务器发送了两次消息,这不是客户端的错 :D 每个数据包生成后,函数 outputMessage 只调用一次,但由于某种原因,同一个数据包仍然被设置了两次。我想这是一个与提升相关的问题,而不是 Flash。
更新2:我修好了!!!这是一件非常非常愚蠢的事情,我什至不知道这是错误的。在服务器端,我有一些类似的东西:
NetworkMessage msg;
msg.AddByte(0x03);
outputMessage(msg);
NetworkMessage msg;
msg.AddByte(0x04);
outputMessage(msg);
显然有一个错误,因为两个变量具有相同的名称,所以我尝试了这个,而不是仅仅更改该死的名称(这显然是错误的,因为程序有一些奇怪的副作用):
{
NetworkMessage msg;
msg.AddByte(0x03);
outputMessage(msg);
}
NetworkMessage msg;
msg.AddByte(0x04);
outputMessage(msg);
我觉得好傻。真的很抱歉浪费了你的时间...